@cloud-ru/uikit-product-mobile-table 0.16.2 → 0.17.0
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/CHANGELOG.md +24 -0
- package/dist/cjs/components/AdaptiveServerTable/AdaptiveServerTable.js +7 -6
- package/dist/{esm/components → cjs/components/AdaptiveServerTable}/constants.d.ts +0 -1
- package/dist/cjs/components/{constants.js → AdaptiveServerTable/constants.js} +1 -2
- package/dist/cjs/components/{utils.d.ts → AdaptiveServerTable/utils.d.ts} +0 -2
- package/dist/cjs/components/{utils.js → AdaptiveServerTable/utils.js} +1 -11
- package/dist/cjs/components/MobileTable/MobileTable.d.ts +7 -0
- package/dist/cjs/components/{MobileTable.js → MobileTable/MobileTable.js} +33 -10
- package/dist/cjs/components/MobileTable/hooks/index.d.ts +2 -0
- package/dist/cjs/components/MobileTable/hooks/index.js +18 -0
- package/dist/cjs/components/MobileTable/hooks/useFilters/index.d.ts +1 -0
- package/dist/cjs/components/MobileTable/hooks/useFilters/index.js +17 -0
- package/dist/cjs/components/MobileTable/hooks/useFilters/useFilters.d.ts +78 -0
- package/dist/cjs/components/MobileTable/hooks/useFilters/useFilters.js +31 -0
- package/dist/cjs/components/MobileTable/hooks/useFilters/utils/getInitialColumnsFiltersOpenValue.d.ts +2 -0
- package/dist/cjs/components/MobileTable/hooks/useFilters/utils/getInitialColumnsFiltersOpenValue.js +11 -0
- package/dist/cjs/components/MobileTable/hooks/useFilters/utils/index.d.ts +1 -0
- package/dist/cjs/components/MobileTable/hooks/useFilters/utils/index.js +17 -0
- package/dist/cjs/components/{hooks.d.ts → MobileTable/hooks/useLoadingTable.d.ts} +0 -8
- package/dist/cjs/components/{hooks.js → MobileTable/hooks/useLoadingTable.js} +1 -15
- package/dist/cjs/components/MobileTable/index.d.ts +3 -0
- package/dist/cjs/components/MobileTable/index.js +21 -0
- package/dist/cjs/components/MobileTable/types.d.ts +11 -0
- package/dist/cjs/components/MobileTable/types.js +2 -0
- package/dist/cjs/components/MobileTable/utils/fuzzyFilter.d.ts +2 -0
- package/dist/cjs/components/MobileTable/utils/fuzzyFilter.js +13 -0
- package/dist/cjs/components/MobileTable/utils/index.d.ts +2 -0
- package/dist/cjs/components/MobileTable/utils/index.js +18 -0
- package/dist/cjs/components/MobileTable/utils/saveTableState/getPersistedStateValidator.d.ts +4 -0
- package/dist/cjs/components/MobileTable/utils/saveTableState/getPersistedStateValidator.js +13 -0
- package/dist/cjs/components/MobileTable/utils/saveTableState/index.d.ts +3 -0
- package/dist/cjs/components/MobileTable/utils/saveTableState/index.js +19 -0
- package/dist/cjs/components/MobileTable/utils/saveTableState/mappers.d.ts +18 -0
- package/dist/cjs/components/MobileTable/utils/saveTableState/mappers.js +45 -0
- package/dist/cjs/components/MobileTable/utils/saveTableState/validators.d.ts +5 -0
- package/dist/cjs/components/MobileTable/utils/saveTableState/validators.js +13 -0
- package/dist/cjs/constants.d.ts +1 -0
- package/dist/cjs/constants.js +2 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/esm/components/AdaptiveServerTable/AdaptiveServerTable.js +5 -4
- package/dist/{cjs/components → esm/components/AdaptiveServerTable}/constants.d.ts +0 -1
- package/dist/esm/components/{constants.js → AdaptiveServerTable/constants.js} +0 -1
- package/dist/esm/components/{utils.d.ts → AdaptiveServerTable/utils.d.ts} +0 -2
- package/dist/esm/components/AdaptiveServerTable/utils.js +5 -0
- package/dist/esm/components/MobileTable/MobileTable.d.ts +7 -0
- package/dist/esm/components/{MobileTable.js → MobileTable/MobileTable.js} +33 -10
- package/dist/esm/components/MobileTable/hooks/index.d.ts +2 -0
- package/dist/esm/components/MobileTable/hooks/index.js +2 -0
- package/dist/esm/components/MobileTable/hooks/useFilters/index.d.ts +1 -0
- package/dist/esm/components/MobileTable/hooks/useFilters/index.js +1 -0
- package/dist/esm/components/MobileTable/hooks/useFilters/useFilters.d.ts +78 -0
- package/dist/esm/components/MobileTable/hooks/useFilters/useFilters.js +28 -0
- package/dist/esm/components/MobileTable/hooks/useFilters/utils/getInitialColumnsFiltersOpenValue.d.ts +2 -0
- package/dist/esm/components/MobileTable/hooks/useFilters/utils/getInitialColumnsFiltersOpenValue.js +8 -0
- package/dist/esm/components/MobileTable/hooks/useFilters/utils/index.d.ts +1 -0
- package/dist/esm/components/MobileTable/hooks/useFilters/utils/index.js +1 -0
- package/dist/esm/components/{hooks.d.ts → MobileTable/hooks/useLoadingTable.d.ts} +0 -8
- package/dist/esm/components/MobileTable/hooks/useLoadingTable.js +17 -0
- package/dist/esm/components/MobileTable/index.d.ts +3 -0
- package/dist/esm/components/MobileTable/index.js +3 -0
- package/dist/esm/components/MobileTable/types.d.ts +11 -0
- package/dist/esm/components/MobileTable/types.js +1 -0
- package/dist/esm/components/MobileTable/utils/fuzzyFilter.d.ts +2 -0
- package/dist/esm/components/{utils.js → MobileTable/utils/fuzzyFilter.js} +0 -5
- package/dist/esm/components/MobileTable/utils/index.d.ts +2 -0
- package/dist/esm/components/MobileTable/utils/index.js +2 -0
- package/dist/esm/components/MobileTable/utils/saveTableState/getPersistedStateValidator.d.ts +4 -0
- package/dist/esm/components/MobileTable/utils/saveTableState/getPersistedStateValidator.js +9 -0
- package/dist/esm/components/MobileTable/utils/saveTableState/index.d.ts +3 -0
- package/dist/esm/components/MobileTable/utils/saveTableState/index.js +3 -0
- package/dist/esm/components/MobileTable/utils/saveTableState/mappers.d.ts +18 -0
- package/dist/esm/components/MobileTable/utils/saveTableState/mappers.js +37 -0
- package/dist/esm/components/MobileTable/utils/saveTableState/validators.d.ts +5 -0
- package/dist/esm/components/MobileTable/utils/saveTableState/validators.js +7 -0
- package/dist/esm/constants.d.ts +1 -0
- package/dist/esm/constants.js +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/package.json +12 -9
- package/src/components/AdaptiveServerTable/AdaptiveServerTable.tsx +5 -4
- package/src/components/{constants.ts → AdaptiveServerTable/constants.ts} +0 -1
- package/src/components/AdaptiveServerTable/utils.ts +12 -0
- package/src/components/{MobileTable.tsx → MobileTable/MobileTable.tsx} +50 -55
- package/src/components/MobileTable/hooks/index.ts +2 -0
- package/src/components/MobileTable/hooks/useFilters/index.ts +1 -0
- package/src/components/MobileTable/hooks/useFilters/useFilters.ts +57 -0
- package/src/components/MobileTable/hooks/useFilters/utils/getInitialColumnsFiltersOpenValue.ts +13 -0
- package/src/components/MobileTable/hooks/useFilters/utils/index.ts +1 -0
- package/src/components/{hooks.tsx → MobileTable/hooks/useLoadingTable.tsx} +1 -22
- package/src/components/MobileTable/index.ts +3 -0
- package/src/components/MobileTable/types.ts +44 -0
- package/src/components/{utils.ts → MobileTable/utils/fuzzyFilter.ts} +0 -12
- package/src/components/MobileTable/utils/index.ts +2 -0
- package/src/components/MobileTable/utils/saveTableState/getPersistedStateValidator.ts +21 -0
- package/src/components/MobileTable/utils/saveTableState/index.ts +3 -0
- package/src/components/MobileTable/utils/saveTableState/mappers.ts +62 -0
- package/src/components/MobileTable/utils/saveTableState/validators.ts +21 -0
- package/src/constants.ts +2 -0
- package/src/helperComponents/ColumnsSettings/ColumnsSettings.tsx +1 -0
- package/src/index.ts +1 -0
- package/dist/cjs/components/MobileTable.d.ts +0 -13
- package/dist/esm/components/MobileTable.d.ts +0 -13
- package/dist/esm/components/hooks.js +0 -30
- /package/dist/cjs/components/{styles.module.css → MobileTable/styles.module.css} +0 -0
- /package/dist/esm/components/{styles.module.css → MobileTable/styles.module.css} +0 -0
- /package/src/components/{styles.module.scss → MobileTable/styles.module.scss} +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatTableStateToRequestPayload = exports.mapSortToRequestPayload = exports.mapPaginationToRequestPayload = exports.mapSortToTableState = exports.mapPaginationToTableState = void 0;
|
|
4
|
+
const toolbar_1 = require("@snack-uikit/toolbar");
|
|
5
|
+
const constants_1 = require("../../../../constants");
|
|
6
|
+
const mapPaginationToTableState = (value) => {
|
|
7
|
+
if (!value || value.offset === undefined || value.limit === undefined) {
|
|
8
|
+
return { pageSize: constants_1.DEFAULT_PAGE_SIZE, pageIndex: 0 };
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
pageSize: value.limit || constants_1.DEFAULT_PAGE_SIZE,
|
|
12
|
+
pageIndex: Math.floor(value.offset / value.limit),
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
exports.mapPaginationToTableState = mapPaginationToTableState;
|
|
16
|
+
const mapSortToTableState = (value = []) => value.map(column => ({
|
|
17
|
+
id: column.field,
|
|
18
|
+
desc: column.direction === '-',
|
|
19
|
+
}));
|
|
20
|
+
exports.mapSortToTableState = mapSortToTableState;
|
|
21
|
+
const mapPaginationToRequestPayload = (value) => {
|
|
22
|
+
if (!value)
|
|
23
|
+
return undefined;
|
|
24
|
+
if ('limit' in value || 'offset' in value) {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
limit: value.pageSize,
|
|
29
|
+
offset: value.pageSize * value.pageIndex,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.mapPaginationToRequestPayload = mapPaginationToRequestPayload;
|
|
33
|
+
const mapSortToRequestPayload = (value) => value === null || value === void 0 ? void 0 : value.map(column => ({
|
|
34
|
+
field: column.id,
|
|
35
|
+
direction: (column.desc ? '-' : '+'),
|
|
36
|
+
}));
|
|
37
|
+
exports.mapSortToRequestPayload = mapSortToRequestPayload;
|
|
38
|
+
/** Вспомогательная функция для преобразования состояния таблицы к формату RequestPayloadParams */
|
|
39
|
+
const formatTableStateToRequestPayload = ({ pagination, sorting, search, filter, }) => (0, toolbar_1.formatFilterStateToRequestPayload)({
|
|
40
|
+
filter,
|
|
41
|
+
search,
|
|
42
|
+
pagination: (0, exports.mapPaginationToRequestPayload)(pagination),
|
|
43
|
+
ordering: (0, exports.mapSortToRequestPayload)(sorting),
|
|
44
|
+
});
|
|
45
|
+
exports.formatTableStateToRequestPayload = formatTableStateToRequestPayload;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RequestPayloadParams } from '@cloud-ru/ft-request-payload-transform';
|
|
2
|
+
import { ChipChoiceRowProps } from '@snack-uikit/chips';
|
|
3
|
+
export declare const validatePaging: (value: unknown) => value is RequestPayloadParams["pagination"];
|
|
4
|
+
export declare const validateSorting: (value: unknown) => value is RequestPayloadParams["ordering"];
|
|
5
|
+
export declare const validateFilter: <TFilters extends Record<string, unknown>>(value: unknown, filterSettings: ChipChoiceRowProps<TFilters>["filters"]) => value is TFilters;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateFilter = exports.validateSorting = exports.validatePaging = void 0;
|
|
4
|
+
const validatePaging = (value) => typeof (value === null || value === void 0 ? void 0 : value.limit) === 'number' &&
|
|
5
|
+
typeof (value === null || value === void 0 ? void 0 : value.offset) === 'number';
|
|
6
|
+
exports.validatePaging = validatePaging;
|
|
7
|
+
const validateSorting = (value) => !value ||
|
|
8
|
+
value.every(column => typeof (column === null || column === void 0 ? void 0 : column.field) === 'string' && typeof (column === null || column === void 0 ? void 0 : column.direction) === 'string');
|
|
9
|
+
exports.validateSorting = validateSorting;
|
|
10
|
+
const validateFilter = (value, filterSettings) => typeof value === 'object' &&
|
|
11
|
+
value !== null &&
|
|
12
|
+
Object.keys(value).every(field => Boolean(filterSettings.find(setting => setting.id === field)));
|
|
13
|
+
exports.validateFilter = validateFilter;
|
package/dist/cjs/constants.d.ts
CHANGED
package/dist/cjs/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ROW_ACTIONS_COLUMN_ID = exports.TEST_IDS = void 0;
|
|
3
|
+
exports.DEFAULT_PAGE_SIZE = exports.ROW_ACTIONS_COLUMN_ID = exports.TEST_IDS = void 0;
|
|
4
4
|
exports.TEST_IDS = {
|
|
5
5
|
headerSortIndicator: 'table__header__sort-indicator',
|
|
6
6
|
headerRow: 'table__header-row',
|
|
@@ -18,3 +18,4 @@ exports.TEST_IDS = {
|
|
|
18
18
|
statusLabel: 'table__status-label',
|
|
19
19
|
};
|
|
20
20
|
exports.ROW_ACTIONS_COLUMN_ID = 'rowActions';
|
|
21
|
+
exports.DEFAULT_PAGE_SIZE = 5;
|
package/dist/cjs/index.d.ts
CHANGED
package/dist/cjs/index.js
CHANGED
|
@@ -12,15 +12,16 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
14
14
|
import { ServerTable as DesktopTable } from '@snack-uikit/table';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
16
|
+
import { DEFAULT_PAGE_SIZE } from '../../constants';
|
|
17
17
|
import { MobileTable } from '../MobileTable';
|
|
18
|
-
import {
|
|
18
|
+
import { DEFAULT_PAGINATION_LIMIT } from './constants';
|
|
19
|
+
import { onSearchDebounced } from './utils';
|
|
19
20
|
export function AdaptiveServerTable(_a) {
|
|
20
21
|
var { layoutType } = _a, props = __rest(_a, ["layoutType"]);
|
|
21
22
|
const isMobile = layoutType === 'mobile';
|
|
22
23
|
const { onChangePage, search: searchProp, pagination, items, total = DEFAULT_PAGINATION_LIMIT, limit = DEFAULT_PAGINATION_LIMIT, offset = 0 } = props, rest = __rest(props, ["onChangePage", "search", "pagination", "items", "total", "limit", "offset"]);
|
|
23
|
-
const
|
|
24
|
+
const [search, setSearch] = useValueControl(searchProp !== null && searchProp !== void 0 ? searchProp : { defaultValue: '' });
|
|
24
25
|
const [tempSearch, setTempSearch] = useState(search || '');
|
|
25
26
|
useEffect(() => {
|
|
26
27
|
var _a;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { FilterFn } from '@tanstack/react-table';
|
|
2
|
-
export declare const fuzzyFilter: FilterFn<any>;
|
|
3
1
|
type OnSearchDebouncedType = (newValue: string, onChange: (newValue: string) => void) => void;
|
|
4
2
|
export declare const onSearchDebounced: OnSearchDebouncedType;
|
|
5
3
|
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FiltersState } from '@cloud-ru/uikit-product-mobile-chips';
|
|
2
|
+
import { MobileTableProps } from './types';
|
|
3
|
+
export declare function MobileTable<TData extends object, TFilters extends FiltersState = Record<string, unknown>>({ data, columnDefinitions, headlineId, suppressPagination, suppressToolbar, suppressSearch, enableFuzzySearch, search, onRefresh, toolbarAfter, moreActions, columnFilters, className, headerBackground, noDataState, noResultsState, errorDataState, loading, dataError, dataFiltered, pagination: paginationProp, pageCount, sorting: sortingProp, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, getRowId, rowSelection: rowSelectionProp, bulkActions: bulkActionsProp, columnsSettings: columnsSettingsProp, savedState, ...rest }: MobileTableProps<TData, TFilters>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export declare namespace MobileTable {
|
|
5
|
+
var getRowActionsColumnDef: typeof import("../../helperComponents").getRowActionsColumnDef;
|
|
6
|
+
var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
|
|
7
|
+
}
|
|
@@ -18,19 +18,19 @@ import { MobileToolbar } from '@cloud-ru/uikit-product-mobile-toolbar';
|
|
|
18
18
|
import { extractSupportProps } from '@cloud-ru/uikit-product-utils';
|
|
19
19
|
import { SkeletonContextProvider } from '@snack-uikit/skeleton';
|
|
20
20
|
import { getPinnedGroups, useColumnOrderByDrag, useColumnSettings, usePageReset, } from '@snack-uikit/table';
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
21
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
22
|
+
import { DEFAULT_PAGE_SIZE } from '../../constants';
|
|
23
|
+
import { ColumnsSettings, getRowActionsColumnDef, getStatusColumnDef, TableCard, TableEmptyState, TablePagination, TableSorting, useEmptyState, } from '../../helperComponents';
|
|
24
|
+
import { useFilters, useLoadingTable } from './hooks';
|
|
25
25
|
import styles from './styles.module.css';
|
|
26
|
-
import { fuzzyFilter } from './utils';
|
|
26
|
+
import { fuzzyFilter, getPersistedStateValidator, mapPaginationToRequestPayload, mapPaginationToTableState, mapSortToRequestPayload, mapSortToTableState, } from './utils';
|
|
27
27
|
export function MobileTable(_a) {
|
|
28
28
|
var { data, columnDefinitions, headlineId, suppressPagination = false, suppressToolbar = false, suppressSearch = false, enableFuzzySearch = false, search, onRefresh, toolbarAfter, moreActions, columnFilters, className, headerBackground = 'default', noDataState, noResultsState, errorDataState, loading, dataError, dataFiltered, pagination: paginationProp, pageCount, sorting: sortingProp, manualSorting = false, manualPagination = false, manualFiltering = false, autoResetPageIndex = false, getRowId, rowSelection: rowSelectionProp, bulkActions: bulkActionsProp, columnsSettings: columnsSettingsProp, savedState } = _a, rest = __rest(_a, ["data", "columnDefinitions", "headlineId", "suppressPagination", "suppressToolbar", "suppressSearch", "enableFuzzySearch", "search", "onRefresh", "toolbarAfter", "moreActions", "columnFilters", "className", "headerBackground", "noDataState", "noResultsState", "errorDataState", "loading", "dataError", "dataFiltered", "pagination", "pageCount", "sorting", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "getRowId", "rowSelection", "bulkActions", "columnsSettings", "savedState"]);
|
|
29
29
|
const defaultPaginationState = useMemo(() => ({ pageIndex: 0, pageSize: DEFAULT_PAGE_SIZE }), []);
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const
|
|
30
|
+
const [sorting = [], onSortingChange] = useValueControl(sortingProp !== null && sortingProp !== void 0 ? sortingProp : { defaultValue: [] });
|
|
31
|
+
const [globalFilter = '', onGlobalFilterChange] = useValueControl(search !== null && search !== void 0 ? search : { defaultValue: '' });
|
|
32
|
+
const [pagination = defaultPaginationState, onPaginationChange] = useValueControl(paginationProp !== null && paginationProp !== void 0 ? paginationProp : { defaultValue: defaultPaginationState });
|
|
33
|
+
const [rowSelection = {}, onRowSelectionChange] = useValueControl(rowSelectionProp !== null && rowSelectionProp !== void 0 ? rowSelectionProp : { defaultValue: {} });
|
|
34
34
|
const enableRowSelection = useCallback((row) => {
|
|
35
35
|
const parent = row.getParentRow();
|
|
36
36
|
const isParentSelected = parent ? parent.getCanSelect() : true;
|
|
@@ -167,6 +167,8 @@ export function MobileTable(_a) {
|
|
|
167
167
|
const hasSortableColumns = useMemo(() => columnDefinitions.some(column => column.enableSorting !== false), [columnDefinitions]);
|
|
168
168
|
const shouldShowSorting = useMemo(() => Boolean(sortingProp) || hasSortableColumns, [sortingProp, hasSortableColumns]);
|
|
169
169
|
const tableFilteredRows = table.getFilteredRowModel().rows;
|
|
170
|
+
const { filter, patchedFilter, setFilter, setFilterVisibility } = useFilters({ columnFilters });
|
|
171
|
+
const validatePersistedState = useMemo(() => getPersistedStateValidator(columnFilters), [columnFilters]);
|
|
170
172
|
usePageReset({
|
|
171
173
|
manualPagination,
|
|
172
174
|
maximumAvailablePage: pageCount || tableFilteredRows.length / pagination.pageSize,
|
|
@@ -181,7 +183,28 @@ export function MobileTable(_a) {
|
|
|
181
183
|
onChange: onGlobalFilterChange,
|
|
182
184
|
loading: search === null || search === void 0 ? void 0 : search.loading,
|
|
183
185
|
placeholder: (search === null || search === void 0 ? void 0 : search.placeholder) || t('searchPlaceholder'),
|
|
184
|
-
}, onRefresh: onRefresh ? handleOnRefresh : undefined, outline: true, filterRow:
|
|
186
|
+
}, onRefresh: onRefresh ? handleOnRefresh : undefined, outline: true, filterRow: patchedFilter, after: toolbarAfter || shouldShowSorting || (areColumnsSettingsEnabled && columnsSettings) ? (_jsxs(_Fragment, { children: [toolbarAfter, shouldShowSorting && (_jsx(TableSorting, { table: table, columnDefinitions: columnDefinitions, enabledColumns: areColumnsSettingsEnabled ? enabledColumns : undefined, areColumnsSettingsEnabled: areColumnsSettingsEnabled })), areColumnsSettingsEnabled && columnsSettings && (_jsx(ColumnsSettings, { columnsSettings: columnsSettings, enabledColumns: enabledColumns, setEnabledColumns: setEnabledColumns }))] })) : undefined, moreActions: moreActions, bulkActions: bulkActions, selectedCount: table.getSelectedRowModel().rows.length, selectionMode: selectionMode, onCheck: enableSelection ? handleOnToolbarCheck : undefined, checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), persist: (savedState === null || savedState === void 0 ? void 0 : savedState.id) && (savedState === null || savedState === void 0 ? void 0 : savedState.filterQueryKey)
|
|
187
|
+
? {
|
|
188
|
+
id: savedState.id,
|
|
189
|
+
filterQueryKey: savedState.filterQueryKey,
|
|
190
|
+
validateData: data => validatePersistedState(data),
|
|
191
|
+
state: {
|
|
192
|
+
pagination: mapPaginationToRequestPayload(pagination),
|
|
193
|
+
ordering: mapSortToRequestPayload(sorting),
|
|
194
|
+
filter,
|
|
195
|
+
search: globalFilter || '',
|
|
196
|
+
},
|
|
197
|
+
onLoad: state => {
|
|
198
|
+
state.pagination && onPaginationChange(mapPaginationToTableState(state.pagination));
|
|
199
|
+
state.search && onGlobalFilterChange(state.search);
|
|
200
|
+
state.ordering && onSortingChange(mapSortToTableState(state.ordering));
|
|
201
|
+
if (state.filter) {
|
|
202
|
+
setFilter(state.filter);
|
|
203
|
+
setFilterVisibility(Object.keys(state.filter));
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
}
|
|
207
|
+
: undefined }) })), _jsx("div", { className: styles.table, children: loading ? (_jsx(SkeletonContextProvider, { loading: true, children: loadingTableRows.map((row, index) => (_jsx(TableCard, { headlineId: headlineId, row: row, table: loadingTable, selection: 'none' }, index))) })) : (_jsxs(_Fragment, { children: [tableRows.map((row, index) => (_jsx(TableCard, { headlineId: headlineId, row: row, table: table, selectionAppearance: rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.appearance, selection: enableSelection ? selectionMode : 'none' }, index))), _jsx(TableEmptyState, { emptyStates: emptyStates, dataError: dataError, dataFiltered: dataFiltered || Boolean(table.getState().globalFilter), tableRowsLength: tableRows.length })] })) }), !suppressPagination && _jsx(TablePagination, { table: table })] })));
|
|
185
208
|
}
|
|
186
209
|
MobileTable.getRowActionsColumnDef = getRowActionsColumnDef;
|
|
187
210
|
MobileTable.getStatusColumnDef = getStatusColumnDef;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useFilters';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useFilters';
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { FiltersState } from '@cloud-ru/uikit-product-mobile-chips';
|
|
2
|
+
import { MobileTableProps } from '../../types';
|
|
3
|
+
type useFiltersProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = Pick<MobileTableProps<TData, TFilters>, 'columnFilters'>;
|
|
4
|
+
export declare function useFilters<TData extends object, TFilters extends FiltersState = Record<string, unknown>>({ columnFilters, }: useFiltersProps<TData, TFilters>): {
|
|
5
|
+
filter: TFilters | undefined;
|
|
6
|
+
setFilter: (value: any, ...args: any[]) => any;
|
|
7
|
+
patchedFilter: {
|
|
8
|
+
value: TFilters | undefined;
|
|
9
|
+
onChange: (filter: TFilters) => void;
|
|
10
|
+
visibleFilters: string[];
|
|
11
|
+
onVisibleFiltersChange: (value: any, ...args: any[]) => any;
|
|
12
|
+
'data-test-id'?: string;
|
|
13
|
+
"aria-activedescendant"?: string | undefined;
|
|
14
|
+
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
15
|
+
"aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined;
|
|
16
|
+
"aria-braillelabel"?: string | undefined;
|
|
17
|
+
"aria-brailleroledescription"?: string | undefined;
|
|
18
|
+
"aria-busy"?: (boolean | "true" | "false") | undefined;
|
|
19
|
+
"aria-checked"?: boolean | "false" | "mixed" | "true" | undefined;
|
|
20
|
+
"aria-colcount"?: number | undefined;
|
|
21
|
+
"aria-colindex"?: number | undefined;
|
|
22
|
+
"aria-colindextext"?: string | undefined;
|
|
23
|
+
"aria-colspan"?: number | undefined;
|
|
24
|
+
"aria-controls"?: string | undefined;
|
|
25
|
+
"aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined;
|
|
26
|
+
"aria-describedby"?: string | undefined;
|
|
27
|
+
"aria-description"?: string | undefined;
|
|
28
|
+
"aria-details"?: string | undefined;
|
|
29
|
+
"aria-disabled"?: (boolean | "true" | "false") | undefined;
|
|
30
|
+
"aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined;
|
|
31
|
+
"aria-errormessage"?: string | undefined;
|
|
32
|
+
"aria-expanded"?: (boolean | "true" | "false") | undefined;
|
|
33
|
+
"aria-flowto"?: string | undefined;
|
|
34
|
+
"aria-grabbed"?: (boolean | "true" | "false") | undefined;
|
|
35
|
+
"aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined;
|
|
36
|
+
"aria-hidden"?: (boolean | "true" | "false") | undefined;
|
|
37
|
+
"aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
|
|
38
|
+
"aria-keyshortcuts"?: string | undefined;
|
|
39
|
+
"aria-label"?: string | undefined;
|
|
40
|
+
"aria-labelledby"?: string | undefined;
|
|
41
|
+
"aria-level"?: number | undefined;
|
|
42
|
+
"aria-live"?: "off" | "assertive" | "polite" | undefined;
|
|
43
|
+
"aria-modal"?: (boolean | "true" | "false") | undefined;
|
|
44
|
+
"aria-multiline"?: (boolean | "true" | "false") | undefined;
|
|
45
|
+
"aria-multiselectable"?: (boolean | "true" | "false") | undefined;
|
|
46
|
+
"aria-orientation"?: "horizontal" | "vertical" | undefined;
|
|
47
|
+
"aria-owns"?: string | undefined;
|
|
48
|
+
"aria-placeholder"?: string | undefined;
|
|
49
|
+
"aria-posinset"?: number | undefined;
|
|
50
|
+
"aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined;
|
|
51
|
+
"aria-readonly"?: (boolean | "true" | "false") | undefined;
|
|
52
|
+
"aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined;
|
|
53
|
+
"aria-required"?: (boolean | "true" | "false") | undefined;
|
|
54
|
+
"aria-roledescription"?: string | undefined;
|
|
55
|
+
"aria-rowcount"?: number | undefined;
|
|
56
|
+
"aria-rowindex"?: number | undefined;
|
|
57
|
+
"aria-rowindextext"?: string | undefined;
|
|
58
|
+
"aria-rowspan"?: number | undefined;
|
|
59
|
+
"aria-selected"?: (boolean | "true" | "false") | undefined;
|
|
60
|
+
"aria-setsize"?: number | undefined;
|
|
61
|
+
"aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
|
|
62
|
+
"aria-valuemax"?: number | undefined;
|
|
63
|
+
"aria-valuemin"?: number | undefined;
|
|
64
|
+
"aria-valuenow"?: number | undefined;
|
|
65
|
+
"aria-valuetext"?: string | undefined;
|
|
66
|
+
defaultValue?: Partial<TFilters> | undefined;
|
|
67
|
+
filters: import("@cloud-ru/uikit-product-mobile-chips").MobileChipChoiceRowFilter[];
|
|
68
|
+
size?: import("@cloud-ru/uikit-product-mobile-chips/dist/esm/components/MobileChipChoiceRow/types").ChipChoiceRowSize;
|
|
69
|
+
className?: string;
|
|
70
|
+
showClearButton?: boolean;
|
|
71
|
+
showAddButton?: boolean;
|
|
72
|
+
initialOpen?: boolean;
|
|
73
|
+
open: boolean;
|
|
74
|
+
onOpenChange: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
75
|
+
} | undefined;
|
|
76
|
+
setFilterVisibility: (value: any, ...args: any[]) => any;
|
|
77
|
+
};
|
|
78
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { useMemo, useState } from 'react';
|
|
2
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
3
|
+
import { getInitialColumnsFiltersOpenValue } from './utils';
|
|
4
|
+
export function useFilters({ columnFilters, }) {
|
|
5
|
+
const [areColumnFiltersOpen, setAreColumnFiltersOpen] = useState(() => getInitialColumnsFiltersOpenValue(columnFilters));
|
|
6
|
+
const [filter, setFilter] = useValueControl({
|
|
7
|
+
value: columnFilters === null || columnFilters === void 0 ? void 0 : columnFilters.value,
|
|
8
|
+
defaultValue: columnFilters === null || columnFilters === void 0 ? void 0 : columnFilters.defaultValue,
|
|
9
|
+
onChange: columnFilters === null || columnFilters === void 0 ? void 0 : columnFilters.onChange,
|
|
10
|
+
});
|
|
11
|
+
const [filterVisibility = [], setFilterVisibility] = useValueControl({
|
|
12
|
+
value: columnFilters === null || columnFilters === void 0 ? void 0 : columnFilters.visibleFilters,
|
|
13
|
+
defaultValue: [],
|
|
14
|
+
onChange: columnFilters === null || columnFilters === void 0 ? void 0 : columnFilters.onVisibleFiltersChange,
|
|
15
|
+
});
|
|
16
|
+
const patchedFilter = useMemo(() => {
|
|
17
|
+
if (!columnFilters) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
return Object.assign(Object.assign({ open: areColumnFiltersOpen, onOpenChange: setAreColumnFiltersOpen }, columnFilters), { value: filter, onChange: setFilter, visibleFilters: filterVisibility, onVisibleFiltersChange: setFilterVisibility });
|
|
21
|
+
}, [columnFilters, areColumnFiltersOpen, filter, setFilter, filterVisibility, setFilterVisibility]);
|
|
22
|
+
return {
|
|
23
|
+
filter,
|
|
24
|
+
setFilter,
|
|
25
|
+
patchedFilter,
|
|
26
|
+
setFilterVisibility,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getInitialColumnsFiltersOpenValue';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getInitialColumnsFiltersOpenValue';
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import { FiltersState } from '@cloud-ru/uikit-product-mobile-chips';
|
|
2
2
|
import { TableProps } from '@snack-uikit/table';
|
|
3
|
-
export declare function useStateControl<TState>(control: {
|
|
4
|
-
initialState?: TState;
|
|
5
|
-
state?: TState;
|
|
6
|
-
onChange?(state: TState): void;
|
|
7
|
-
} | undefined, defaultState: TState): {
|
|
8
|
-
state: TState;
|
|
9
|
-
onStateChange: import("uncontrollable").Handler;
|
|
10
|
-
};
|
|
11
3
|
type UseLoadingTableProps<TData extends object, TFilters extends FiltersState> = {
|
|
12
4
|
columnDefinitions: TableProps<TData, TFilters>['columnDefinitions'];
|
|
13
5
|
pageSize: number;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { getCoreRowModel, useReactTable } from '@tanstack/react-table';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { SkeletonText } from '@snack-uikit/skeleton';
|
|
5
|
+
import { ROW_ACTIONS_COLUMN_ID } from '../../../constants';
|
|
6
|
+
export function useLoadingTable({ pageSize, columnDefinitions, }) {
|
|
7
|
+
const data = useMemo(() => (Array.from({ length: pageSize }).map(() => ({})) || []), [pageSize]);
|
|
8
|
+
const columns = useMemo(() => columnDefinitions
|
|
9
|
+
.filter(column => column.id !== ROW_ACTIONS_COLUMN_ID)
|
|
10
|
+
.map(column => (Object.assign(Object.assign({}, column), { cell: () => _jsx(SkeletonText, { lines: 1, width: '100%' }) }))), [columnDefinitions]);
|
|
11
|
+
const loadingTable = useReactTable({
|
|
12
|
+
data,
|
|
13
|
+
columns,
|
|
14
|
+
getCoreRowModel: getCoreRowModel(),
|
|
15
|
+
});
|
|
16
|
+
return { loadingTable };
|
|
17
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FiltersState, MobileChipChoiceRowProps } from '@cloud-ru/uikit-product-mobile-chips';
|
|
2
|
+
import { WithSupportProps } from '@cloud-ru/uikit-product-utils';
|
|
3
|
+
import { TableProps } from '@snack-uikit/table';
|
|
4
|
+
export type MobileTableProps<TData extends object, TFilters extends FiltersState = Record<string, unknown>> = Pick<TableProps<TData, TFilters>, 'data' | 'columnDefinitions' | 'suppressPagination' | 'suppressToolbar' | 'suppressSearch' | 'search' | 'onRefresh' | 'moreActions' | 'className' | 'enableFuzzySearch' | 'loading' | 'dataError' | 'dataFiltered' | 'noDataState' | 'noResultsState' | 'errorDataState' | 'sorting' | 'pagination' | 'pageCount' | 'manualFiltering' | 'manualPagination' | 'manualSorting' | 'getRowId' | 'rowSelection' | 'bulkActions' | 'columnsSettings' | 'savedState' | 'autoResetPageIndex' | 'toolbarAfter'> & WithSupportProps<{
|
|
5
|
+
headlineId?: string;
|
|
6
|
+
headerBackground?: 'default' | '1-level' | '2-level';
|
|
7
|
+
/** Фильтры */
|
|
8
|
+
columnFilters?: MobileChipChoiceRowProps<TFilters> & {
|
|
9
|
+
initialOpen?: boolean;
|
|
10
|
+
};
|
|
11
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { rankItem } from '@tanstack/match-sorter-utils';
|
|
2
|
-
import debounce from 'lodash.debounce';
|
|
3
|
-
import { SEARCH_DELAY } from './constants';
|
|
4
2
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
3
|
export const fuzzyFilter = (row, columnId, value, addMeta) => {
|
|
6
4
|
const itemRank = rankItem(row.getValue(columnId), value);
|
|
@@ -9,6 +7,3 @@ export const fuzzyFilter = (row, columnId, value, addMeta) => {
|
|
|
9
7
|
});
|
|
10
8
|
return itemRank.passed;
|
|
11
9
|
};
|
|
12
|
-
export const onSearchDebounced = debounce((newValue, onChange) => {
|
|
13
|
-
onChange(newValue);
|
|
14
|
-
}, SEARCH_DELAY);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { FiltersState } from '@snack-uikit/chips';
|
|
2
|
+
import { PersistedFilterState } from '@snack-uikit/toolbar';
|
|
3
|
+
import { MobileTableProps } from '../../types';
|
|
4
|
+
export declare const getPersistedStateValidator: <TData extends object, TFilters extends FiltersState = Record<string, unknown>>(columnFilters: MobileTableProps<TData, TFilters>["columnFilters"]) => (data: unknown) => data is PersistedFilterState<TFilters>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { validateFilter, validatePaging, validateSorting } from './validators';
|
|
2
|
+
export const getPersistedStateValidator = (columnFilters) => (data) => {
|
|
3
|
+
const dataAsSettings = data;
|
|
4
|
+
const isPaginationValid = validatePaging(dataAsSettings === null || dataAsSettings === void 0 ? void 0 : dataAsSettings.pagination);
|
|
5
|
+
const isSortingValid = validateSorting(dataAsSettings === null || dataAsSettings === void 0 ? void 0 : dataAsSettings.ordering);
|
|
6
|
+
const isSearchValid = !(dataAsSettings === null || dataAsSettings === void 0 ? void 0 : dataAsSettings.search) || typeof (dataAsSettings === null || dataAsSettings === void 0 ? void 0 : dataAsSettings.search) === 'string';
|
|
7
|
+
const isFilterValid = Boolean((columnFilters === null || columnFilters === void 0 ? void 0 : columnFilters.filters) && validateFilter(dataAsSettings.filter, columnFilters.filters));
|
|
8
|
+
return isPaginationValid && isSortingValid && isSearchValid && isFilterValid;
|
|
9
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RequestPayloadParams } from '@cloud-ru/ft-request-payload-transform';
|
|
2
|
+
import { PaginationState, SortingState } from '@tanstack/react-table';
|
|
3
|
+
import { FiltersState } from '@snack-uikit/chips';
|
|
4
|
+
import { PersistedFilterState } from '@snack-uikit/toolbar';
|
|
5
|
+
export declare const mapPaginationToTableState: (value?: RequestPayloadParams["pagination"]) => PaginationState;
|
|
6
|
+
export declare const mapSortToTableState: (value?: RequestPayloadParams["ordering"]) => SortingState;
|
|
7
|
+
export declare const mapPaginationToRequestPayload: (value?: PaginationState | RequestPayloadParams["pagination"]) => RequestPayloadParams["pagination"];
|
|
8
|
+
export declare const mapSortToRequestPayload: (value?: SortingState) => RequestPayloadParams["ordering"];
|
|
9
|
+
/** Вспомогательная функция для преобразования состояния таблицы к формату RequestPayloadParams */
|
|
10
|
+
export declare const formatTableStateToRequestPayload: <T extends FiltersState>({ pagination, sorting, search, filter, }: Omit<PersistedFilterState<T>, "pagination" | "sorting"> & {
|
|
11
|
+
pagination?: PaginationState | RequestPayloadParams["pagination"];
|
|
12
|
+
sorting?: SortingState;
|
|
13
|
+
}) => {
|
|
14
|
+
toObject(): Partial<RequestPayloadParams>;
|
|
15
|
+
toString(params?: {
|
|
16
|
+
encode?: boolean;
|
|
17
|
+
}): string;
|
|
18
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { formatFilterStateToRequestPayload } from '@snack-uikit/toolbar';
|
|
2
|
+
import { DEFAULT_PAGE_SIZE } from '../../../../constants';
|
|
3
|
+
export const mapPaginationToTableState = (value) => {
|
|
4
|
+
if (!value || value.offset === undefined || value.limit === undefined) {
|
|
5
|
+
return { pageSize: DEFAULT_PAGE_SIZE, pageIndex: 0 };
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
pageSize: value.limit || DEFAULT_PAGE_SIZE,
|
|
9
|
+
pageIndex: Math.floor(value.offset / value.limit),
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export const mapSortToTableState = (value = []) => value.map(column => ({
|
|
13
|
+
id: column.field,
|
|
14
|
+
desc: column.direction === '-',
|
|
15
|
+
}));
|
|
16
|
+
export const mapPaginationToRequestPayload = (value) => {
|
|
17
|
+
if (!value)
|
|
18
|
+
return undefined;
|
|
19
|
+
if ('limit' in value || 'offset' in value) {
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
limit: value.pageSize,
|
|
24
|
+
offset: value.pageSize * value.pageIndex,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export const mapSortToRequestPayload = (value) => value === null || value === void 0 ? void 0 : value.map(column => ({
|
|
28
|
+
field: column.id,
|
|
29
|
+
direction: (column.desc ? '-' : '+'),
|
|
30
|
+
}));
|
|
31
|
+
/** Вспомогательная функция для преобразования состояния таблицы к формату RequestPayloadParams */
|
|
32
|
+
export const formatTableStateToRequestPayload = ({ pagination, sorting, search, filter, }) => formatFilterStateToRequestPayload({
|
|
33
|
+
filter,
|
|
34
|
+
search,
|
|
35
|
+
pagination: mapPaginationToRequestPayload(pagination),
|
|
36
|
+
ordering: mapSortToRequestPayload(sorting),
|
|
37
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RequestPayloadParams } from '@cloud-ru/ft-request-payload-transform';
|
|
2
|
+
import { ChipChoiceRowProps } from '@snack-uikit/chips';
|
|
3
|
+
export declare const validatePaging: (value: unknown) => value is RequestPayloadParams["pagination"];
|
|
4
|
+
export declare const validateSorting: (value: unknown) => value is RequestPayloadParams["ordering"];
|
|
5
|
+
export declare const validateFilter: <TFilters extends Record<string, unknown>>(value: unknown, filterSettings: ChipChoiceRowProps<TFilters>["filters"]) => value is TFilters;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const validatePaging = (value) => typeof (value === null || value === void 0 ? void 0 : value.limit) === 'number' &&
|
|
2
|
+
typeof (value === null || value === void 0 ? void 0 : value.offset) === 'number';
|
|
3
|
+
export const validateSorting = (value) => !value ||
|
|
4
|
+
value.every(column => typeof (column === null || column === void 0 ? void 0 : column.field) === 'string' && typeof (column === null || column === void 0 ? void 0 : column.direction) === 'string');
|
|
5
|
+
export const validateFilter = (value, filterSettings) => typeof value === 'object' &&
|
|
6
|
+
value !== null &&
|
|
7
|
+
Object.keys(value).every(field => Boolean(filterSettings.find(setting => setting.id === field)));
|
package/dist/esm/constants.d.ts
CHANGED
package/dist/esm/constants.js
CHANGED
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.js
CHANGED