@snack-uikit/table 0.22.2 → 0.22.3-preview-5d095019.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/README.md CHANGED
@@ -144,6 +144,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
144
144
  | manualPagination | `boolean` | - | |
145
145
  | manualFiltering | `boolean` | - | |
146
146
  | getRowId | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения уникального идентификатора для любой заданной строки |
147
+ | getRowClassName | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения className для любой заданной строки |
147
148
  | scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
148
149
  | scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
149
150
  | rowPinning | `Pick<RowPinningState, "top">` | { top: [], } | Определение какие строки должны быть закреплены в таблице |
@@ -204,6 +205,7 @@ const columnDefinitions: ColumnDefinition<TableData>[] = [
204
205
  | manualPagination | `boolean` | true | |
205
206
  | manualFiltering | `boolean` | true | |
206
207
  | getRowId | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения уникального идентификатора для любой заданной строки |
208
+ | getRowClassName | `(originalRow: TData, index: number, parent?: Row<TData>) => string` | - | Дополнительная функция используется для получения className для любой заданной строки |
207
209
  | scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
208
210
  | scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
209
211
  | rowPinning | `Pick<RowPinningState, "top">` | - | Определение какие строки должны быть закреплены в таблице |
@@ -1,6 +1,6 @@
1
1
  import { TableProps } from '../types';
2
2
  /** Компонент таблицы */
3
- export declare function Table<TData extends object>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize, pageCount, loading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, toolbarBefore, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState, ...rest }: TableProps<TData>): import("react/jsx-runtime").JSX.Element;
3
+ export declare function Table<TData extends object>({ data, rowPinning, columnDefinitions, keepPinnedRows, copyPinnedRows, enableSelectPinned, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize, pageCount, loading, outline, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar, toolbarBefore, toolbarAfter, suppressPagination, manualSorting, manualPagination, manualFiltering, autoResetPageIndex, scrollRef, scrollContainerRef, getRowId, getRowClassName, enableFuzzySearch, savedState, ...rest }: TableProps<TData>): import("react/jsx-runtime").JSX.Element;
4
4
  export declare namespace Table {
5
5
  var getStatusColumnDef: typeof import("../../helperComponents").getStatusColumnDef;
6
6
  var statusAppearances: Record<string, string>;
@@ -30,7 +30,7 @@ import { getColumnStyleVars, getCurrentlyConfiguredHeaderWidth, getInitColumnSiz
30
30
  export function Table(_a) {
31
31
  var { data, rowPinning = {
32
32
  top: [],
33
- }, columnDefinitions, keepPinnedRows = false, copyPinnedRows = false, enableSelectPinned = false, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize = DEFAULT_PAGE_SIZE, pageCount, loading = false, outline = false, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, toolbarBefore, toolbarAfter, suppressPagination = false, manualSorting = false, manualPagination = false, manualFiltering = false, autoResetPageIndex = false, scrollRef, scrollContainerRef, getRowId, enableFuzzySearch, savedState } = _a, rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "onDelete", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "toolbarBefore", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "enableFuzzySearch", "savedState"]);
33
+ }, columnDefinitions, keepPinnedRows = false, copyPinnedRows = false, enableSelectPinned = false, rowSelection: rowSelectionProp, search, sorting: sortingProp, columnFilters, pagination: paginationProp, className, onRowClick, onRefresh, onDelete, pageSize = DEFAULT_PAGE_SIZE, pageCount, loading = false, outline = false, moreActions, exportSettings, dataFiltered, dataError, noDataState, noResultsState, errorDataState, suppressToolbar = false, toolbarBefore, toolbarAfter, suppressPagination = false, manualSorting = false, manualPagination = false, manualFiltering = false, autoResetPageIndex = false, scrollRef, scrollContainerRef, getRowId, getRowClassName, enableFuzzySearch, savedState } = _a, rest = __rest(_a, ["data", "rowPinning", "columnDefinitions", "keepPinnedRows", "copyPinnedRows", "enableSelectPinned", "rowSelection", "search", "sorting", "columnFilters", "pagination", "className", "onRowClick", "onRefresh", "onDelete", "pageSize", "pageCount", "loading", "outline", "moreActions", "exportSettings", "dataFiltered", "dataError", "noDataState", "noResultsState", "errorDataState", "suppressToolbar", "toolbarBefore", "toolbarAfter", "suppressPagination", "manualSorting", "manualPagination", "manualFiltering", "autoResetPageIndex", "scrollRef", "scrollContainerRef", "getRowId", "getRowClassName", "enableFuzzySearch", "savedState"]);
34
34
  const { state: globalFilter, onStateChange: onGlobalFilterChange } = useStateControl(search, '');
35
35
  const { state: rowSelection, onStateChange: onRowSelectionChange } = useStateControl(rowSelectionProp, {});
36
36
  const defaultPaginationState = useMemo(() => ({
@@ -222,7 +222,7 @@ export function Table(_a) {
222
222
  onChange: onGlobalFilterChange,
223
223
  loading: search === null || search === void 0 ? void 0 : search.loading,
224
224
  placeholder: (search === null || search === void 0 ? void 0 : search.placeholder) || t('searchPlaceholder'),
225
- }, checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), className: styles.toolbar, onRefresh: onRefresh ? handleOnRefresh : undefined, onDelete: enableSelection && onDelete ? handleOnDelete : undefined, onCheck: enableSelection ? handleOnCheck : undefined, outline: outline, selectionMode: (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow) ? 'multiple' : 'single', before: toolbarBefore, after: toolbarAfter || exportSettings ? (_jsxs(_Fragment, { children: [toolbarAfter, exportSettings && (_jsx(ExportButton, { settings: exportSettings, columnDefinitions: columnDefinitions, data: data, topRows: filteredTopRows, centerRows: centerRows }))] })) : undefined, moreActions: moreActions }), columnFilters && _jsxs("div", { className: styles.filtersWrapper, children: [" ", columnFilters, " "] })] })), _jsx("div", { className: styles.scrollWrapper, "data-outline": outline || undefined, children: _jsxs(Scroll, { size: 's', className: styles.table, ref: scrollContainerRef, children: [_jsx("div", { className: styles.tableContent, style: columnSizeVars, children: _jsx(TableContext.Provider, { value: { table }, children: loading ? (_jsxs(SkeletonContextProvider, { loading: true, children: [_jsx(HeaderRow, {}), loadingTableRows.map(row => (_jsx(BodyRow, { row: row }, row.id)))] })) : (_jsxs(_Fragment, { children: [centerRows.length || filteredTopRows.length ? _jsx(HeaderRow, {}) : null, filteredTopRows.length ? (_jsx("div", { className: styles.topRowWrapper, children: filteredTopRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick }, row.id))) })) : null, centerRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick }, row.id))), _jsx(TableEmptyState, { emptyStates: emptyStates, dataError: dataError, dataFiltered: dataFiltered || Boolean(table.getState().globalFilter), tableRowsLength: tableRows.length + filteredTopRows.length })] })) }) }), _jsx("div", { className: styles.scrollStub, ref: scrollRef })] }) }), !suppressPagination && (_jsx(TablePagination, { table: table, options: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.options, optionsLabel: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsLabel, pageCount: pageCount, optionsRender: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsRender }))] })) }));
225
+ }, checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected(), className: styles.toolbar, onRefresh: onRefresh ? handleOnRefresh : undefined, onDelete: enableSelection && onDelete ? handleOnDelete : undefined, onCheck: enableSelection ? handleOnCheck : undefined, outline: outline, selectionMode: (rowSelectionProp === null || rowSelectionProp === void 0 ? void 0 : rowSelectionProp.multiRow) ? 'multiple' : 'single', before: toolbarBefore, after: toolbarAfter || exportSettings ? (_jsxs(_Fragment, { children: [toolbarAfter, exportSettings && (_jsx(ExportButton, { settings: exportSettings, columnDefinitions: columnDefinitions, data: data, topRows: filteredTopRows, centerRows: centerRows }))] })) : undefined, moreActions: moreActions }), columnFilters && _jsxs("div", { className: styles.filtersWrapper, children: [" ", columnFilters, " "] })] })), _jsx("div", { className: styles.scrollWrapper, "data-outline": outline || undefined, children: _jsxs(Scroll, { size: 's', className: styles.table, ref: scrollContainerRef, children: [_jsx("div", { className: styles.tableContent, style: columnSizeVars, children: _jsx(TableContext.Provider, { value: { table }, children: loading ? (_jsxs(SkeletonContextProvider, { loading: true, children: [_jsx(HeaderRow, {}), loadingTableRows.map(row => (_jsx(BodyRow, { row: row }, row.id)))] })) : (_jsxs(_Fragment, { children: [centerRows.length || filteredTopRows.length ? _jsx(HeaderRow, {}) : null, filteredTopRows.length ? (_jsx("div", { className: styles.topRowWrapper, children: filteredTopRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick, getRowClassName: getRowClassName }, row.id))) })) : null, centerRows.map(row => (_jsx(BodyRow, { row: row, onRowClick: onRowClick, getRowClassName: getRowClassName }, row.id))), _jsx(TableEmptyState, { emptyStates: emptyStates, dataError: dataError, dataFiltered: dataFiltered || Boolean(table.getState().globalFilter), tableRowsLength: tableRows.length + filteredTopRows.length })] })) }) }), _jsx("div", { className: styles.scrollStub, ref: scrollRef })] }) }), !suppressPagination && (_jsx(TablePagination, { table: table, options: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.options, optionsLabel: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsLabel, pageCount: pageCount, optionsRender: paginationProp === null || paginationProp === void 0 ? void 0 : paginationProp.optionsRender }))] })) }));
226
226
  }
227
227
  Table.getStatusColumnDef = getStatusColumnDef;
228
228
  Table.statusAppearances = STATUS_APPEARANCE;
@@ -115,6 +115,8 @@ export type TableProps<TData extends object> = WithSupportProps<{
115
115
  manualFiltering?: boolean;
116
116
  /** Дополнительная функция используется для получения уникального идентификатора для любой заданной строки */
117
117
  getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
118
+ /** Дополнительная функция используется для получения className для любой заданной строки */
119
+ getRowClassName?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
118
120
  /** Ссылка на элемент, обозначающий самый конец прокручиваемого списка */
119
121
  scrollRef?: RefObject<HTMLElement>;
120
122
  /** Ссылка на контейнер, который скроллится */
@@ -1,5 +1,6 @@
1
1
  import { Row as TableRow } from '@tanstack/react-table';
2
2
  import { MouseEvent } from 'react';
3
+ import { TableProps } from '../../components';
3
4
  export type RowInfo<TData> = {
4
5
  id: string;
5
6
  data: TData;
@@ -7,9 +8,10 @@ export type RowInfo<TData> = {
7
8
  toggleSelected(value?: boolean): void;
8
9
  };
9
10
  export type RowClickHandler<TData> = (e: MouseEvent<HTMLDivElement>, row: RowInfo<TData>) => void;
10
- type BodyRowProps<TData> = {
11
+ type BodyRowProps<TData extends object> = {
11
12
  row: TableRow<TData>;
12
13
  onRowClick?: RowClickHandler<TData>;
14
+ getRowClassName?: TableProps<TData>['getRowClassName'];
13
15
  };
14
- export declare function BodyRow<TData>({ row, onRowClick }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
16
+ export declare function BodyRow<TData extends object>({ row, onRowClick, getRowClassName }: BodyRowProps<TData>): import("react/jsx-runtime").JSX.Element;
15
17
  export {};
@@ -7,7 +7,7 @@ import { useRowCells } from '../hooks';
7
7
  import { PinnedCells } from './PinnedCells';
8
8
  import { Row } from './Row';
9
9
  import styles from './styles.module.css';
10
- export function BodyRow({ row, onRowClick }) {
10
+ export function BodyRow({ row, onRowClick, getRowClassName = () => '' }) {
11
11
  const { pinnedLeft, pinnedRight, unpinned } = useRowCells(row);
12
12
  const [dropListOpened, setDropListOpen] = useState(false);
13
13
  const disabled = !row.getCanSelect();
@@ -21,5 +21,5 @@ export function BodyRow({ row, onRowClick }) {
21
21
  toggleSelected: row.toggleSelected,
22
22
  });
23
23
  };
24
- return (_jsx(RowContext.Provider, { value: { dropListOpened, setDropListOpen }, children: _jsxs(Row, { onClick: handleRowClick, "data-clickable": Boolean(onRowClick) || undefined, "data-disabled": disabled || undefined, "data-selected": row.getIsSelected() || undefined, "data-actions-opened": dropListOpened || undefined, "data-test-id": TEST_IDS.bodyRow, "data-row-id": row.id, className: styles.bodyRow, children: [pinnedLeft && (_jsx(PinnedCells, { position: COLUMN_PIN_POSITION.Left, children: pinnedLeft.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))) })), unpinned.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))), pinnedRight && (_jsx(PinnedCells, { position: COLUMN_PIN_POSITION.Right, children: pinnedRight.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))) }))] }) }));
24
+ return (_jsx(RowContext.Provider, { value: { dropListOpened, setDropListOpen }, children: _jsxs(Row, { onClick: handleRowClick, "data-clickable": Boolean(onRowClick) || undefined, "data-disabled": disabled || undefined, "data-selected": row.getIsSelected() || undefined, "data-actions-opened": dropListOpened || undefined, "data-test-id": TEST_IDS.bodyRow, "data-row-id": row.id, className: `${styles.bodyRow} ${getRowClassName(row.original, row.index, row.getParentRow())}`, children: [pinnedLeft && (_jsx(PinnedCells, { position: COLUMN_PIN_POSITION.Left, children: pinnedLeft.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))) })), unpinned.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))), pinnedRight && (_jsx(PinnedCells, { position: COLUMN_PIN_POSITION.Right, children: pinnedRight.map(cell => (_jsx(BodyCell, { cell: cell }, cell.id))) }))] }) }));
25
25
  }
@@ -16,7 +16,6 @@
16
16
  z-index:1;
17
17
  display:flex;
18
18
  box-sizing:border-box;
19
- background-color:var(--snack-ui-table-row-background);
20
19
  border-color:var(--sys-neutral-decor-default, #dde0ea);
21
20
  }
22
21
  .rowPinnedCells::after{
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "Table",
7
- "version": "0.22.2",
7
+ "version": "0.22.3-preview-5d095019.0",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -57,5 +57,5 @@
57
57
  "peerDependencies": {
58
58
  "@snack-uikit/locale": "*"
59
59
  },
60
- "gitHead": "f238fd8b9d363de790ebcfd189aa17cbe101f3eb"
60
+ "gitHead": "ba02c0bf7bd0ef43b5de11b5493ea9417a81267d"
61
61
  }
@@ -89,6 +89,7 @@ export function Table<TData extends object>({
89
89
  scrollRef,
90
90
  scrollContainerRef,
91
91
  getRowId,
92
+ getRowClassName,
92
93
  enableFuzzySearch,
93
94
  savedState,
94
95
 
@@ -391,13 +392,13 @@ export function Table<TData extends object>({
391
392
  {filteredTopRows.length ? (
392
393
  <div className={styles.topRowWrapper}>
393
394
  {filteredTopRows.map(row => (
394
- <BodyRow key={row.id} row={row} onRowClick={onRowClick} />
395
+ <BodyRow key={row.id} row={row} onRowClick={onRowClick} getRowClassName={getRowClassName} />
395
396
  ))}
396
397
  </div>
397
398
  ) : null}
398
399
 
399
400
  {centerRows.map(row => (
400
- <BodyRow key={row.id} row={row} onRowClick={onRowClick} />
401
+ <BodyRow key={row.id} row={row} onRowClick={onRowClick} getRowClassName={getRowClassName} />
401
402
  ))}
402
403
 
403
404
  <TableEmptyState
@@ -146,6 +146,9 @@ export type TableProps<TData extends object> = WithSupportProps<{
146
146
  /** Дополнительная функция используется для получения уникального идентификатора для любой заданной строки */
147
147
  getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
148
148
 
149
+ /** Дополнительная функция используется для получения className для любой заданной строки */
150
+ getRowClassName?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
151
+
149
152
  /** Ссылка на элемент, обозначающий самый конец прокручиваемого списка */
150
153
  scrollRef?: RefObject<HTMLElement>;
151
154
  /** Ссылка на контейнер, который скроллится */
@@ -1,6 +1,7 @@
1
1
  import { Row as TableRow } from '@tanstack/react-table';
2
2
  import { MouseEvent, useState } from 'react';
3
3
 
4
+ import { TableProps } from '../../components';
4
5
  import { COLUMN_PIN_POSITION, TEST_IDS } from '../../constants';
5
6
  import { BodyCell } from '../Cells';
6
7
  import { RowContext } from '../contexts';
@@ -18,12 +19,13 @@ export type RowInfo<TData> = {
18
19
 
19
20
  export type RowClickHandler<TData> = (e: MouseEvent<HTMLDivElement>, row: RowInfo<TData>) => void;
20
21
 
21
- type BodyRowProps<TData> = {
22
+ type BodyRowProps<TData extends object> = {
22
23
  row: TableRow<TData>;
23
24
  onRowClick?: RowClickHandler<TData>;
25
+ getRowClassName?: TableProps<TData>['getRowClassName'];
24
26
  };
25
27
 
26
- export function BodyRow<TData>({ row, onRowClick }: BodyRowProps<TData>) {
28
+ export function BodyRow<TData extends object>({ row, onRowClick, getRowClassName = () => '' }: BodyRowProps<TData>) {
27
29
  const { pinnedLeft, pinnedRight, unpinned } = useRowCells(row);
28
30
 
29
31
  const [dropListOpened, setDropListOpen] = useState(false);
@@ -51,7 +53,7 @@ export function BodyRow<TData>({ row, onRowClick }: BodyRowProps<TData>) {
51
53
  data-actions-opened={dropListOpened || undefined}
52
54
  data-test-id={TEST_IDS.bodyRow}
53
55
  data-row-id={row.id}
54
- className={styles.bodyRow}
56
+ className={`${styles.bodyRow} ${getRowClassName(row.original, row.index, row.getParentRow())}`}
55
57
  >
56
58
  {pinnedLeft && (
57
59
  <PinnedCells position={COLUMN_PIN_POSITION.Left}>
@@ -31,7 +31,6 @@ $snack-ui-table-row-background: var(--snack-ui-table-row-background);
31
31
 
32
32
  box-sizing: border-box;
33
33
 
34
- background-color: $snack-ui-table-row-background;
35
34
  border-color: $sys-neutral-decor-default;
36
35
 
37
36
  &::after {