@lucasbernardosn/react-table 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +268 -2
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/components/column-menu/column-menu-check.d.ts +8 -0
- package/dist/components/column-menu/column-menu-check.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-check.js +17 -0
- package/dist/components/column-menu/column-menu-check.js.map +1 -0
- package/dist/components/column-menu/column-menu-hide-item.d.ts +23 -0
- package/dist/components/column-menu/column-menu-hide-item.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-hide-item.js +27 -0
- package/dist/components/column-menu/column-menu-hide-item.js.map +1 -0
- package/dist/components/column-menu/column-menu-labels.d.ts +21 -0
- package/dist/components/column-menu/column-menu-labels.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-labels.js +14 -0
- package/dist/components/column-menu/column-menu-labels.js.map +1 -0
- package/dist/components/column-menu/column-menu-pin-items.d.ts +25 -0
- package/dist/components/column-menu/column-menu-pin-items.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-pin-items.js +64 -0
- package/dist/components/column-menu/column-menu-pin-items.js.map +1 -0
- package/dist/components/column-menu/column-menu-popup.d.ts +40 -0
- package/dist/components/column-menu/column-menu-popup.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-popup.js +67 -0
- package/dist/components/column-menu/column-menu-popup.js.map +1 -0
- package/dist/components/column-menu/column-menu-root.d.ts +34 -0
- package/dist/components/column-menu/column-menu-root.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-root.js +36 -0
- package/dist/components/column-menu/column-menu-root.js.map +1 -0
- package/dist/components/column-menu/column-menu-sort-items.d.ts +30 -0
- package/dist/components/column-menu/column-menu-sort-items.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-sort-items.js +62 -0
- package/dist/components/column-menu/column-menu-sort-items.js.map +1 -0
- package/dist/components/column-menu/column-menu-trigger.d.ts +23 -0
- package/dist/components/column-menu/column-menu-trigger.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-trigger.js +38 -0
- package/dist/components/column-menu/column-menu-trigger.js.map +1 -0
- package/dist/components/column-menu/index.d.ts +2 -0
- package/dist/components/column-menu/index.js +2 -0
- package/dist/components/column-menu/index.parts.d.ts +13 -0
- package/dist/components/column-menu/index.parts.d.ts.map +1 -0
- package/dist/components/column-menu/index.parts.js +20 -0
- package/dist/components/column-menu/index.parts.js.map +1 -0
- package/dist/components/columns-panel/columns-panel-item.d.ts +34 -0
- package/dist/components/columns-panel/columns-panel-item.d.ts.map +1 -0
- package/dist/components/columns-panel/columns-panel-item.js +109 -0
- package/dist/components/columns-panel/columns-panel-item.js.map +1 -0
- package/dist/components/columns-panel/columns-panel-root.d.ts +51 -0
- package/dist/components/columns-panel/columns-panel-root.d.ts.map +1 -0
- package/dist/components/columns-panel/columns-panel-root.js +134 -0
- package/dist/components/columns-panel/columns-panel-root.js.map +1 -0
- package/dist/components/columns-panel/get-columns-panel-column-order.d.ts +16 -0
- package/dist/components/columns-panel/get-columns-panel-column-order.d.ts.map +1 -0
- package/dist/components/columns-panel/get-columns-panel-column-order.js +24 -0
- package/dist/components/columns-panel/get-columns-panel-column-order.js.map +1 -0
- package/dist/components/columns-panel/index.d.ts +2 -0
- package/dist/components/columns-panel/index.js +2 -0
- package/dist/components/columns-panel/index.parts.d.ts +8 -0
- package/dist/components/columns-panel/index.parts.d.ts.map +1 -0
- package/dist/components/columns-panel/index.parts.js +12 -0
- package/dist/components/columns-panel/index.parts.js.map +1 -0
- package/dist/components/data-table/body/data-table-body.d.ts +58 -0
- package/dist/components/data-table/body/data-table-body.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-body.js +99 -0
- package/dist/components/data-table/body/data-table-body.js.map +1 -0
- package/dist/components/data-table/body/data-table-cell.d.ts +26 -0
- package/dist/components/data-table/body/data-table-cell.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-cell.js +80 -0
- package/dist/components/data-table/body/data-table-cell.js.map +1 -0
- package/dist/components/data-table/body/data-table-empty.d.ts +38 -0
- package/dist/components/data-table/body/data-table-empty.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-empty.js +71 -0
- package/dist/components/data-table/body/data-table-empty.js.map +1 -0
- package/dist/components/data-table/body/data-table-row-focus.d.ts +32 -0
- package/dist/components/data-table/body/data-table-row-focus.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-row-focus.js +58 -0
- package/dist/components/data-table/body/data-table-row-focus.js.map +1 -0
- package/dist/components/data-table/body/data-table-row.d.ts +67 -0
- package/dist/components/data-table/body/data-table-row.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-row.js +154 -0
- package/dist/components/data-table/body/data-table-row.js.map +1 -0
- package/dist/components/data-table/body/use-data-table-row-focus-recovery.d.ts +19 -0
- package/dist/components/data-table/body/use-data-table-row-focus-recovery.d.ts.map +1 -0
- package/dist/components/data-table/body/use-data-table-row-focus-recovery.js +64 -0
- package/dist/components/data-table/body/use-data-table-row-focus-recovery.js.map +1 -0
- package/dist/components/data-table/header/data-table-header-button.d.ts +25 -0
- package/dist/components/data-table/header/data-table-header-button.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header-button.js +57 -0
- package/dist/components/data-table/header/data-table-header-button.js.map +1 -0
- package/dist/components/data-table/header/data-table-header-cell.d.ts +34 -0
- package/dist/components/data-table/header/data-table-header-cell.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header-cell.js +97 -0
- package/dist/components/data-table/header/data-table-header-cell.js.map +1 -0
- package/dist/components/data-table/header/data-table-header-content.d.ts +21 -0
- package/dist/components/data-table/header/data-table-header-content.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header-content.js +37 -0
- package/dist/components/data-table/header/data-table-header-content.js.map +1 -0
- package/dist/components/data-table/header/data-table-header-row.d.ts +15 -0
- package/dist/components/data-table/header/data-table-header-row.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header-row.js +28 -0
- package/dist/components/data-table/header/data-table-header-row.js.map +1 -0
- package/dist/components/data-table/header/data-table-header.d.ts +46 -0
- package/dist/components/data-table/header/data-table-header.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header.js +80 -0
- package/dist/components/data-table/header/data-table-header.js.map +1 -0
- package/dist/components/data-table/index.d.ts +2 -0
- package/dist/components/data-table/index.js +2 -0
- package/dist/components/data-table/index.parts.d.ts +33 -0
- package/dist/components/data-table/index.parts.d.ts.map +1 -0
- package/dist/components/data-table/index.parts.js +62 -0
- package/dist/components/data-table/index.parts.js.map +1 -0
- package/dist/components/data-table/loading/get-data-table-loading-without-rows.d.ts +16 -0
- package/dist/components/data-table/loading/get-data-table-loading-without-rows.d.ts.map +1 -0
- package/dist/components/data-table/loading/get-data-table-loading-without-rows.js +18 -0
- package/dist/components/data-table/loading/get-data-table-loading-without-rows.js.map +1 -0
- package/dist/components/data-table/loading/use-data-table-loading-inert.d.ts +16 -0
- package/dist/components/data-table/loading/use-data-table-loading-inert.d.ts.map +1 -0
- package/dist/components/data-table/loading/use-data-table-loading-inert.js +54 -0
- package/dist/components/data-table/loading/use-data-table-loading-inert.js.map +1 -0
- package/dist/components/data-table/loading/use-data-table-loading.d.ts +13 -0
- package/dist/components/data-table/loading/use-data-table-loading.d.ts.map +1 -0
- package/dist/components/data-table/loading/use-data-table-loading.js +40 -0
- package/dist/components/data-table/loading/use-data-table-loading.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-button.d.ts +45 -0
- package/dist/components/data-table/pagination/data-table-page-button.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-button.js +67 -0
- package/dist/components/data-table/pagination/data-table-page-button.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-size-select.d.ts +47 -0
- package/dist/components/data-table/pagination/data-table-page-size-select.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-size-select.js +68 -0
- package/dist/components/data-table/pagination/data-table-page-size-select.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-status.d.ts +43 -0
- package/dist/components/data-table/pagination/data-table-page-status.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-status.js +48 -0
- package/dist/components/data-table/pagination/data-table-page-status.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-pagination.d.ts +38 -0
- package/dist/components/data-table/pagination/data-table-pagination.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-pagination.js +87 -0
- package/dist/components/data-table/pagination/data-table-pagination.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-row-range.d.ts +49 -0
- package/dist/components/data-table/pagination/data-table-row-range.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-row-range.js +63 -0
- package/dist/components/data-table/pagination/data-table-row-range.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-selected-count.d.ts +37 -0
- package/dist/components/data-table/pagination/data-table-selected-count.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-selected-count.js +44 -0
- package/dist/components/data-table/pagination/data-table-selected-count.js.map +1 -0
- package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts +15 -0
- package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts.map +1 -0
- package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.js +38 -0
- package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.js.map +1 -0
- package/dist/components/data-table/resize/data-table-resize-handle.d.ts +48 -0
- package/dist/components/data-table/resize/data-table-resize-handle.d.ts.map +1 -0
- package/dist/components/data-table/resize/data-table-resize-handle.js +116 -0
- package/dist/components/data-table/resize/data-table-resize-handle.js.map +1 -0
- package/dist/components/data-table/resize/use-data-table-resize-scroll.d.ts +18 -0
- package/dist/components/data-table/resize/use-data-table-resize-scroll.d.ts.map +1 -0
- package/dist/components/data-table/resize/use-data-table-resize-scroll.js +55 -0
- package/dist/components/data-table/resize/use-data-table-resize-scroll.js.map +1 -0
- package/dist/components/data-table/root/data-table-grid-class-names.d.ts +10 -0
- package/dist/components/data-table/root/data-table-grid-class-names.d.ts.map +1 -0
- package/dist/components/data-table/root/data-table-grid-class-names.js +22 -0
- package/dist/components/data-table/root/data-table-grid-class-names.js.map +1 -0
- package/dist/components/data-table/root/data-table-root.d.ts +41 -0
- package/dist/components/data-table/root/data-table-root.d.ts.map +1 -0
- package/dist/components/data-table/root/data-table-root.js +72 -0
- package/dist/components/data-table/root/data-table-root.js.map +1 -0
- package/dist/components/data-table/root/data-table-scroll-area.d.ts +30 -0
- package/dist/components/data-table/root/data-table-scroll-area.d.ts.map +1 -0
- package/dist/components/data-table/root/data-table-scroll-area.js +137 -0
- package/dist/components/data-table/root/data-table-scroll-area.js.map +1 -0
- package/dist/components/data-table/root/get-data-table-column-layout.d.ts +45 -0
- package/dist/components/data-table/root/get-data-table-column-layout.d.ts.map +1 -0
- package/dist/components/data-table/root/get-data-table-column-layout.js +55 -0
- package/dist/components/data-table/root/get-data-table-column-layout.js.map +1 -0
- package/dist/components/data-table/root/get-data-table-column-pinning.d.ts +46 -0
- package/dist/components/data-table/root/get-data-table-column-pinning.d.ts.map +1 -0
- package/dist/components/data-table/root/get-data-table-column-pinning.js +46 -0
- package/dist/components/data-table/root/get-data-table-column-pinning.js.map +1 -0
- package/dist/components/data-table/root/get-data-table-scroll-parent.d.ts +13 -0
- package/dist/components/data-table/root/get-data-table-scroll-parent.d.ts.map +1 -0
- package/dist/components/data-table/root/get-data-table-scroll-parent.js +20 -0
- package/dist/components/data-table/root/get-data-table-scroll-parent.js.map +1 -0
- package/dist/components/data-table/root/use-data-table-column-layout.d.ts +25 -0
- package/dist/components/data-table/root/use-data-table-column-layout.d.ts.map +1 -0
- package/dist/components/data-table/root/use-data-table-column-layout.js +106 -0
- package/dist/components/data-table/root/use-data-table-column-layout.js.map +1 -0
- package/dist/components/data-table/root/use-data-table-header-offset.d.ts +15 -0
- package/dist/components/data-table/root/use-data-table-header-offset.d.ts.map +1 -0
- package/dist/components/data-table/root/use-data-table-header-offset.js +35 -0
- package/dist/components/data-table/root/use-data-table-header-offset.js.map +1 -0
- package/dist/components/data-table/selection/data-table-row-checkbox.d.ts +33 -0
- package/dist/components/data-table/selection/data-table-row-checkbox.d.ts.map +1 -0
- package/dist/components/data-table/selection/data-table-row-checkbox.js +50 -0
- package/dist/components/data-table/selection/data-table-row-checkbox.js.map +1 -0
- package/dist/components/data-table/selection/data-table-select-all-checkbox.d.ts +31 -0
- package/dist/components/data-table/selection/data-table-select-all-checkbox.d.ts.map +1 -0
- package/dist/components/data-table/selection/data-table-select-all-checkbox.js +44 -0
- package/dist/components/data-table/selection/data-table-select-all-checkbox.js.map +1 -0
- package/dist/components/data-table/selection/data-table-selection-bar.d.ts +51 -0
- package/dist/components/data-table/selection/data-table-selection-bar.d.ts.map +1 -0
- package/dist/components/data-table/selection/data-table-selection-bar.js +58 -0
- package/dist/components/data-table/selection/data-table-selection-bar.js.map +1 -0
- package/dist/components/data-table/selection/selection-column-def.d.ts +54 -0
- package/dist/components/data-table/selection/selection-column-def.d.ts.map +1 -0
- package/dist/components/data-table/selection/selection-column-def.js +55 -0
- package/dist/components/data-table/selection/selection-column-def.js.map +1 -0
- package/dist/components/data-table/sorting/data-table-sort-indicator.d.ts +26 -0
- package/dist/components/data-table/sorting/data-table-sort-indicator.d.ts.map +1 -0
- package/dist/components/data-table/sorting/data-table-sort-indicator.js +64 -0
- package/dist/components/data-table/sorting/data-table-sort-indicator.js.map +1 -0
- package/dist/components/data-table/sorting/data-table-sort-trigger.d.ts +31 -0
- package/dist/components/data-table/sorting/data-table-sort-trigger.d.ts.map +1 -0
- package/dist/components/data-table/sorting/data-table-sort-trigger.js +46 -0
- package/dist/components/data-table/sorting/data-table-sort-trigger.js.map +1 -0
- package/dist/components/data-table/toolbar/data-table-density-select.d.ts +39 -0
- package/dist/components/data-table/toolbar/data-table-density-select.d.ts.map +1 -0
- package/dist/components/data-table/toolbar/data-table-density-select.js +60 -0
- package/dist/components/data-table/toolbar/data-table-density-select.js.map +1 -0
- package/dist/components/data-table/toolbar/data-table-sort-column-select.d.ts +48 -0
- package/dist/components/data-table/toolbar/data-table-sort-column-select.d.ts.map +1 -0
- package/dist/components/data-table/toolbar/data-table-sort-column-select.js +79 -0
- package/dist/components/data-table/toolbar/data-table-sort-column-select.js.map +1 -0
- package/dist/components/data-table/toolbar/data-table-sort-direction-select.d.ts +40 -0
- package/dist/components/data-table/toolbar/data-table-sort-direction-select.d.ts.map +1 -0
- package/dist/components/data-table/toolbar/data-table-sort-direction-select.js +66 -0
- package/dist/components/data-table/toolbar/data-table-sort-direction-select.js.map +1 -0
- package/dist/features/active-row/active-row-feature.d.ts +22 -0
- package/dist/features/active-row/active-row-feature.d.ts.map +1 -0
- package/dist/features/active-row/active-row-feature.js +55 -0
- package/dist/features/active-row/active-row-feature.js.map +1 -0
- package/dist/features/active-row/active-row-feature.types.d.ts +64 -0
- package/dist/features/active-row/active-row-feature.types.d.ts.map +1 -0
- package/dist/features/active-row/active-row-feature.types.js +0 -0
- package/dist/features/column-alignment/column-alignment-feature.d.ts +23 -0
- package/dist/features/column-alignment/column-alignment-feature.d.ts.map +1 -0
- package/dist/features/column-alignment/column-alignment-feature.js +34 -0
- package/dist/features/column-alignment/column-alignment-feature.js.map +1 -0
- package/dist/features/column-alignment/column-alignment-feature.types.d.ts +34 -0
- package/dist/features/column-alignment/column-alignment-feature.types.d.ts.map +1 -0
- package/dist/features/column-alignment/column-alignment-feature.types.js +0 -0
- package/dist/features/index.d.ts +9 -0
- package/dist/features/index.js +5 -0
- package/dist/features/loading/loading-feature.d.ts +30 -0
- package/dist/features/loading/loading-feature.d.ts.map +1 -0
- package/dist/features/loading/loading-feature.js +48 -0
- package/dist/features/loading/loading-feature.js.map +1 -0
- package/dist/features/loading/loading-feature.types.d.ts +50 -0
- package/dist/features/loading/loading-feature.types.d.ts.map +1 -0
- package/dist/features/loading/loading-feature.types.js +0 -0
- package/dist/features/row-density/row-density-feature.d.ts +26 -0
- package/dist/features/row-density/row-density-feature.d.ts.map +1 -0
- package/dist/features/row-density/row-density-feature.js +44 -0
- package/dist/features/row-density/row-density-feature.js.map +1 -0
- package/dist/features/row-density/row-density-feature.types.d.ts +53 -0
- package/dist/features/row-density/row-density-feature.types.d.ts.map +1 -0
- package/dist/features/row-density/row-density-feature.types.js +0 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +0 -0
- package/dist/types/table-with.d.ts +96 -0
- package/dist/types/table-with.d.ts.map +1 -0
- package/dist/types/table-with.js +0 -0
- package/dist/utils/get-default-column-label.d.ts +17 -0
- package/dist/utils/get-default-column-label.d.ts.map +1 -0
- package/dist/utils/get-default-column-label.js +18 -0
- package/dist/utils/get-default-column-label.js.map +1 -0
- package/dist/utils/has-feature.d.ts +54 -0
- package/dist/utils/has-feature.d.ts.map +1 -0
- package/dist/utils/has-feature.js +55 -0
- package/dist/utils/has-feature.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +3 -0
- package/package.json +80 -3
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { hasTableFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { DataTablePageButton } from "./data-table-page-button.js";
|
|
3
|
+
import { DataTablePageSizeSelect } from "./data-table-page-size-select.js";
|
|
4
|
+
import { DataTablePageStatus } from "./data-table-page-status.js";
|
|
5
|
+
import { DataTableRowRange } from "./data-table-row-range.js";
|
|
6
|
+
import { DataTableSelectedCount } from "./data-table-selected-count.js";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
9
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
10
|
+
//#region src/components/data-table/pagination/data-table-pagination.tsx
|
|
11
|
+
/**
|
|
12
|
+
* A barra da paginação, para baixo da tabela. Sem `children`, monta o padrão: à esquerda, a
|
|
13
|
+
* contagem de selecionadas (com `rowSelectionFeature`); à direita, o `DataTable.PageSizeSelect`,
|
|
14
|
+
* o `DataTable.RowRange`, o `DataTable.PageStatus` e os quatro `DataTable.PageButton`. Com
|
|
15
|
+
* `children`, o app compõe as partes, cada uma com a `table`. Em tela estreita, os grupos quebram
|
|
16
|
+
* linha.
|
|
17
|
+
*
|
|
18
|
+
* Funciona com a paginação local (`createPaginatedRowModel`) e com a da API
|
|
19
|
+
* (`manualPagination`, com o `rowCount` ou o `pageCount`).
|
|
20
|
+
*
|
|
21
|
+
* É um `nav` com o nome "Paginação", trocável pelo `aria-label`: um marco, que o leitor de tela
|
|
22
|
+
* lista e para onde salta.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <DataTable.Pagination table={table}>
|
|
27
|
+
* <DataTable.PageStatus table={table} />
|
|
28
|
+
* <DataTable.PageButton table={table} page="previous" />
|
|
29
|
+
* <DataTable.PageButton table={table} page="next" />
|
|
30
|
+
* </DataTable.Pagination>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
const DataTablePagination = (props) => {
|
|
34
|
+
const { table, render, className, children, ...rest } = props;
|
|
35
|
+
const content = children === void 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [hasTableFeature(table, "rowSelectionFeature") && /* @__PURE__ */ jsx(DataTableSelectedCount, { table }), /* @__PURE__ */ jsxs("div", {
|
|
36
|
+
className: "ms-auto flex flex-wrap items-center gap-x-4 gap-y-2",
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsx(DataTablePageSizeSelect, { table }),
|
|
39
|
+
/* @__PURE__ */ jsx(DataTableRowRange, { table }),
|
|
40
|
+
/* @__PURE__ */ jsx(DataTablePageStatus, { table }),
|
|
41
|
+
/* @__PURE__ */ jsxs("div", {
|
|
42
|
+
className: "flex items-center gap-1",
|
|
43
|
+
children: [
|
|
44
|
+
/* @__PURE__ */ jsx(DataTablePageButton, {
|
|
45
|
+
table,
|
|
46
|
+
page: "first"
|
|
47
|
+
}),
|
|
48
|
+
/* @__PURE__ */ jsx(DataTablePageButton, {
|
|
49
|
+
table,
|
|
50
|
+
page: "previous"
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ jsx(DataTablePageButton, {
|
|
53
|
+
table,
|
|
54
|
+
page: "next"
|
|
55
|
+
}),
|
|
56
|
+
/* @__PURE__ */ jsx(DataTablePageButton, {
|
|
57
|
+
table,
|
|
58
|
+
page: "last"
|
|
59
|
+
})
|
|
60
|
+
]
|
|
61
|
+
})
|
|
62
|
+
]
|
|
63
|
+
})] }) : children;
|
|
64
|
+
const baseProps = {
|
|
65
|
+
"data-component": "DataTable.Pagination",
|
|
66
|
+
"aria-label": "Paginação",
|
|
67
|
+
className: mergeTwClassNames([
|
|
68
|
+
"flex",
|
|
69
|
+
"flex-wrap",
|
|
70
|
+
"items-center",
|
|
71
|
+
"justify-between",
|
|
72
|
+
"gap-x-6",
|
|
73
|
+
"gap-y-2"
|
|
74
|
+
], className),
|
|
75
|
+
children: content
|
|
76
|
+
};
|
|
77
|
+
return useRender({
|
|
78
|
+
render,
|
|
79
|
+
defaultTagName: "nav",
|
|
80
|
+
props: mergeProps(baseProps, rest)
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
DataTablePagination.displayName = "DataTable.Pagination";
|
|
84
|
+
//#endregion
|
|
85
|
+
export { DataTablePagination };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=data-table-pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-pagination.js","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-pagination.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type { TableWith } from '../../../types';\nimport { hasTableFeature } from '../../../utils';\nimport { DataTablePageButton } from './data-table-page-button';\nimport { DataTablePageSizeSelect } from './data-table-page-size-select';\nimport { DataTablePageStatus } from './data-table-page-status';\nimport { DataTableRowRange } from './data-table-row-range';\nimport { DataTableSelectedCount } from './data-table-selected-count';\n\nexport type DataTablePaginationProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'nav'>,\n {\n /** A tabela. Exige `rowPaginationFeature`. */\n table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;\n }\n>;\n\n/**\n * A barra da paginação, para baixo da tabela. Sem `children`, monta o padrão: à esquerda, a\n * contagem de selecionadas (com `rowSelectionFeature`); à direita, o `DataTable.PageSizeSelect`,\n * o `DataTable.RowRange`, o `DataTable.PageStatus` e os quatro `DataTable.PageButton`. Com\n * `children`, o app compõe as partes, cada uma com a `table`. Em tela estreita, os grupos quebram\n * linha.\n *\n * Funciona com a paginação local (`createPaginatedRowModel`) e com a da API\n * (`manualPagination`, com o `rowCount` ou o `pageCount`).\n *\n * É um `nav` com o nome \"Paginação\", trocável pelo `aria-label`: um marco, que o leitor de tela\n * lista e para onde salta.\n *\n * @example\n * ```tsx\n * <DataTable.Pagination table={table}>\n * <DataTable.PageStatus table={table} />\n * <DataTable.PageButton table={table} page=\"previous\" />\n * <DataTable.PageButton table={table} page=\"next\" />\n * </DataTable.Pagination>\n * ```\n */\nexport const DataTablePagination = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTablePaginationProps<TFeatures, TData>,\n) => {\n const { table, render, className, children, ...rest } = props;\n\n const content =\n children === undefined ? (\n <>\n {hasTableFeature(table, 'rowSelectionFeature') && (\n <DataTableSelectedCount table={table} />\n )}\n\n {/* À direita mesmo sozinho, sem a contagem: o `justify-between` o levaria para a\n esquerda. */}\n <div className=\"ms-auto flex flex-wrap items-center gap-x-4 gap-y-2\">\n <DataTablePageSizeSelect table={table} />\n <DataTableRowRange table={table} />\n <DataTablePageStatus table={table} />\n\n <div className=\"flex items-center gap-1\">\n <DataTablePageButton\n table={table}\n page=\"first\"\n />\n <DataTablePageButton\n table={table}\n page=\"previous\"\n />\n <DataTablePageButton\n table={table}\n page=\"next\"\n />\n <DataTablePageButton\n table={table}\n page=\"last\"\n />\n </div>\n </div>\n </>\n ) : (\n children\n );\n\n const baseProps = {\n 'data-component': 'DataTable.Pagination',\n 'aria-label': 'Paginação',\n className: mergeTwClassNames(\n [\n 'flex',\n 'flex-wrap',\n 'items-center',\n 'justify-between',\n 'gap-x-6',\n 'gap-y-2',\n ],\n className,\n ),\n children: content,\n };\n\n return useRender({\n render,\n defaultTagName: 'nav',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTablePagination.displayName = 'DataTable.Pagination';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,MAAa,uBAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,UAAU,GAAG,SAAS;CAExD,MAAM,UACJ,aAAa,KAAA,IACX,qBAAA,UAAA,EAAA,UAAA,CACG,gBAAgB,OAAO,qBAAqB,KAC3C,oBAAC,wBAAD,EAA+B,MAAQ,CAAA,GAKzC,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,oBAAC,yBAAD,EAAgC,MAAQ,CAAA;GACxC,oBAAC,mBAAD,EAA0B,MAAQ,CAAA;GAClC,oBAAC,qBAAD,EAA4B,MAAQ,CAAA;GAEpC,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,qBAAD;MACS;MACP,MAAK;KACN,CAAA;KACD,oBAAC,qBAAD;MACS;MACP,MAAK;KACN,CAAA;KACD,oBAAC,qBAAD;MACS;MACP,MAAK;KACN,CAAA;KACD,oBAAC,qBAAD;MACS;MACP,MAAK;KACN,CAAA;IACE;;EACF;CACL,CAAA,CAAA,EAAA,CAAA,IAEF;CAGJ,MAAM,YAAY;EAChB,kBAAkB;EAClB,cAAc;EACd,WAAW,kBACT;GACE;GACA;GACA;GACA;GACA;GACA;EACF,GACA,SACF;EACA,UAAU;CACZ;CAEA,OAAO,UAAU;EACf;EACA,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,oBAAoB,cAAc"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { useRender } from "@base-ui/react";
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
7
|
+
//#region src/components/data-table/pagination/data-table-row-range.d.ts
|
|
8
|
+
/** As linhas da página atual e o total, para o texto do `DataTable.RowRange`. */
|
|
9
|
+
export type DataTableRowRangeValues = {
|
|
10
|
+
/** A posição da primeira linha da página, a partir de 1, ou 0 sem linhas. */
|
|
11
|
+
firstRow: number;
|
|
12
|
+
/** A posição da última linha da página, ou 0 sem linhas. */
|
|
13
|
+
lastRow: number;
|
|
14
|
+
/**
|
|
15
|
+
* O total de linhas, ou `-1` sem ele: na paginação pela API, sem o `rowCount` da tabela, e, com
|
|
16
|
+
* `loadingFeature`, na carga sem linhas, antes de o total chegar.
|
|
17
|
+
*/
|
|
18
|
+
rowCount: number;
|
|
19
|
+
};
|
|
20
|
+
export type DataTableRowRangeProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'span'>, {
|
|
21
|
+
/** A tabela. Exige `rowPaginationFeature`. */
|
|
22
|
+
table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;
|
|
23
|
+
/**
|
|
24
|
+
* Uma função que recebe as posições e o total e devolve o texto.
|
|
25
|
+
* @default ({ firstRow, lastRow, rowCount }) => '11–20 de 243', ou '11–20' sem o total
|
|
26
|
+
*/
|
|
27
|
+
children?: (values: DataTableRowRangeValues) => React.ReactNode;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Quais linhas a página mostra, e de quantas: "11–20 de 243". Com a paginação pela API, o total
|
|
31
|
+
* vem do `rowCount` da tabela; sem ele, só "11–20". Na carga sem linhas, como a primeira, fica
|
|
32
|
+
* vazio: o total ainda não chegou.
|
|
33
|
+
*
|
|
34
|
+
* Marca `role="status"`: quando o intervalo muda, como na troca de página, o leitor de tela
|
|
35
|
+
* anuncia o texto novo sem mover o foco.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <DataTable.RowRange table={table}>
|
|
40
|
+
* {({ rowCount }) => `${rowCount} pessoas`}
|
|
41
|
+
* </DataTable.RowRange>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare const DataTableRowRange: {
|
|
45
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableRowRangeProps<TFeatures, TData>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
46
|
+
displayName: string;
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
//# sourceMappingURL=data-table-row-range.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-row-range.d.ts","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-row-range.tsx"],"mappings":";;;;;;;;YAUY;;EAEV;;EAEA;;;;;EAKA;;YAGU,uBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,UAAU,WAAW;;;;;EAK5B,YAAY,QAAQ,4BAA4B,MAAM;;;;;;;;;;;;;;;;;qBAmB7C;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,uBAAuB,WAAW,SAAM,MAAA,+BAAA,MAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getDataTableLoadingWithoutRows } from "../loading/get-data-table-loading-without-rows.js";
|
|
2
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
3
|
+
import { shallow, useSelector } from "@tanstack/react-store";
|
|
4
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
5
|
+
//#region src/components/data-table/pagination/data-table-row-range.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Quais linhas a página mostra, e de quantas: "11–20 de 243". Com a paginação pela API, o total
|
|
8
|
+
* vem do `rowCount` da tabela; sem ele, só "11–20". Na carga sem linhas, como a primeira, fica
|
|
9
|
+
* vazio: o total ainda não chegou.
|
|
10
|
+
*
|
|
11
|
+
* Marca `role="status"`: quando o intervalo muda, como na troca de página, o leitor de tela
|
|
12
|
+
* anuncia o texto novo sem mover o foco.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <DataTable.RowRange table={table}>
|
|
17
|
+
* {({ rowCount }) => `${rowCount} pessoas`}
|
|
18
|
+
* </DataTable.RowRange>
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
const DataTableRowRange = (props) => {
|
|
22
|
+
const { table, render, className, children, ...rest } = props;
|
|
23
|
+
/**
|
|
24
|
+
* Re-renderiza quando a página, o tamanho dela ou as linhas mudam. O store, e não só o atom da
|
|
25
|
+
* paginação: as linhas da página e o total mudam com os dados.
|
|
26
|
+
*/
|
|
27
|
+
const values = useSelector(table.store, () => {
|
|
28
|
+
const { pageIndex, pageSize } = table.atoms.pagination.get();
|
|
29
|
+
const pageRowCount = table.getRowModel().rows.length;
|
|
30
|
+
const offset = pageIndex * pageSize;
|
|
31
|
+
return {
|
|
32
|
+
firstRow: pageRowCount === 0 ? 0 : offset + 1,
|
|
33
|
+
lastRow: pageRowCount === 0 ? 0 : offset + pageRowCount,
|
|
34
|
+
rowCount: getDataTableLoadingWithoutRows(table) || table.options.manualPagination && table.options.rowCount === void 0 ? -1 : table.getRowCount()
|
|
35
|
+
};
|
|
36
|
+
}, { compare: shallow });
|
|
37
|
+
/** Re-renderiza quando a carga sem linhas começa ou termina. */
|
|
38
|
+
const isLoadingWithoutRows = useSelector(table.store, () => getDataTableLoadingWithoutRows(table));
|
|
39
|
+
const range = values.lastRow === 0 ? "0" : `${values.firstRow.toLocaleString("pt-BR")}–${values.lastRow.toLocaleString("pt-BR")}`;
|
|
40
|
+
/** Na carga sem linhas, "0" diria que não há nada, e não que ainda não se sabe. */
|
|
41
|
+
const defaultText = isLoadingWithoutRows ? "" : values.rowCount === -1 ? range : `${range} de ${values.rowCount.toLocaleString("pt-BR")}`;
|
|
42
|
+
const baseProps = {
|
|
43
|
+
"data-component": "DataTable.RowRange",
|
|
44
|
+
role: "status",
|
|
45
|
+
className: mergeTwClassNames([
|
|
46
|
+
"text-gray-11",
|
|
47
|
+
"text-sm",
|
|
48
|
+
"tabular-nums",
|
|
49
|
+
"whitespace-nowrap"
|
|
50
|
+
], className),
|
|
51
|
+
children: children === void 0 ? defaultText : children(values)
|
|
52
|
+
};
|
|
53
|
+
return useRender({
|
|
54
|
+
render,
|
|
55
|
+
defaultTagName: "span",
|
|
56
|
+
props: mergeProps(baseProps, rest)
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
DataTableRowRange.displayName = "DataTable.RowRange";
|
|
60
|
+
//#endregion
|
|
61
|
+
export { DataTableRowRange };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=data-table-row-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-row-range.js","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-row-range.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { shallow, useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport type { TableWith } from '../../../types';\nimport { getDataTableLoadingWithoutRows } from '../loading/get-data-table-loading-without-rows';\n\n/** As linhas da página atual e o total, para o texto do `DataTable.RowRange`. */\nexport type DataTableRowRangeValues = {\n /** A posição da primeira linha da página, a partir de 1, ou 0 sem linhas. */\n firstRow: number;\n /** A posição da última linha da página, ou 0 sem linhas. */\n lastRow: number;\n /**\n * O total de linhas, ou `-1` sem ele: na paginação pela API, sem o `rowCount` da tabela, e, com\n * `loadingFeature`, na carga sem linhas, antes de o total chegar.\n */\n rowCount: number;\n};\n\nexport type DataTableRowRangeProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'span'>,\n {\n /** A tabela. Exige `rowPaginationFeature`. */\n table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;\n /**\n * Uma função que recebe as posições e o total e devolve o texto.\n * @default ({ firstRow, lastRow, rowCount }) => '11–20 de 243', ou '11–20' sem o total\n */\n children?: (values: DataTableRowRangeValues) => React.ReactNode;\n }\n>;\n\n/**\n * Quais linhas a página mostra, e de quantas: \"11–20 de 243\". Com a paginação pela API, o total\n * vem do `rowCount` da tabela; sem ele, só \"11–20\". Na carga sem linhas, como a primeira, fica\n * vazio: o total ainda não chegou.\n *\n * Marca `role=\"status\"`: quando o intervalo muda, como na troca de página, o leitor de tela\n * anuncia o texto novo sem mover o foco.\n *\n * @example\n * ```tsx\n * <DataTable.RowRange table={table}>\n * {({ rowCount }) => `${rowCount} pessoas`}\n * </DataTable.RowRange>\n * ```\n */\nexport const DataTableRowRange = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableRowRangeProps<TFeatures, TData>,\n) => {\n const { table, render, className, children, ...rest } = props;\n\n /**\n * Re-renderiza quando a página, o tamanho dela ou as linhas mudam. O store, e não só o atom da\n * paginação: as linhas da página e o total mudam com os dados.\n */\n const values = useSelector(\n table.store,\n (): DataTableRowRangeValues => {\n const { pageIndex, pageSize } = table.atoms.pagination.get();\n const pageRowCount = table.getRowModel().rows.length;\n const offset = pageIndex * pageSize;\n\n return {\n firstRow: pageRowCount === 0 ? 0 : offset + 1,\n lastRow: pageRowCount === 0 ? 0 : offset + pageRowCount,\n // Sem o `rowCount`, o `getRowCount()` do TanStack conta as linhas carregadas, que na\n // paginação pela API são só as da página.\n rowCount:\n getDataTableLoadingWithoutRows(table) ||\n (table.options.manualPagination &&\n table.options.rowCount === undefined)\n ? -1\n : table.getRowCount(),\n };\n },\n { compare: shallow },\n );\n\n /** Re-renderiza quando a carga sem linhas começa ou termina. */\n const isLoadingWithoutRows = useSelector(table.store, () =>\n getDataTableLoadingWithoutRows(table),\n );\n\n const range =\n values.lastRow === 0\n ? '0'\n : `${values.firstRow.toLocaleString('pt-BR')}–${values.lastRow.toLocaleString('pt-BR')}`;\n\n /** Na carga sem linhas, \"0\" diria que não há nada, e não que ainda não se sabe. */\n const defaultText = isLoadingWithoutRows\n ? ''\n : values.rowCount === -1\n ? range\n : `${range} de ${values.rowCount.toLocaleString('pt-BR')}`;\n\n const baseProps = {\n 'data-component': 'DataTable.RowRange',\n role: 'status',\n className: mergeTwClassNames(\n ['text-gray-11', 'text-sm', 'tabular-nums', 'whitespace-nowrap'],\n className,\n ),\n children: children === undefined ? defaultText : children(values),\n };\n\n return useRender({\n render,\n defaultTagName: 'span',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableRowRange.displayName = 'DataTable.RowRange';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqDA,MAAa,qBAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,UAAU,GAAG,SAAS;;;;;CAMxD,MAAM,SAAS,YACb,MAAM,aACyB;EAC7B,MAAM,EAAE,WAAW,aAAa,MAAM,MAAM,WAAW,IAAI;EAC3D,MAAM,eAAe,MAAM,YAAY,CAAC,CAAC,KAAK;EAC9C,MAAM,SAAS,YAAY;EAE3B,OAAO;GACL,UAAU,iBAAiB,IAAI,IAAI,SAAS;GAC5C,SAAS,iBAAiB,IAAI,IAAI,SAAS;GAG3C,UACE,+BAA+B,KAAK,KACnC,MAAM,QAAQ,oBACb,MAAM,QAAQ,aAAa,KAAA,IACzB,KACA,MAAM,YAAY;EAC1B;CACF,GACA,EAAE,SAAS,QAAQ,CACrB;;CAGA,MAAM,uBAAuB,YAAY,MAAM,aAC7C,+BAA+B,KAAK,CACtC;CAEA,MAAM,QACJ,OAAO,YAAY,IACf,MACA,GAAG,OAAO,SAAS,eAAe,OAAO,EAAE,GAAG,OAAO,QAAQ,eAAe,OAAO;;CAGzF,MAAM,cAAc,uBAChB,KACA,OAAO,aAAa,KAClB,QACA,GAAG,MAAM,MAAM,OAAO,SAAS,eAAe,OAAO;CAE3D,MAAM,YAAY;EAChB,kBAAkB;EAClB,MAAM;EACN,WAAW,kBACT;GAAC;GAAgB;GAAW;GAAgB;EAAmB,GAC/D,SACF;EACA,UAAU,aAAa,KAAA,IAAY,cAAc,SAAS,MAAM;CAClE;CAEA,OAAO,UAAU;EACf;EACA,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,kBAAkB,cAAc"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { useRender } from "@base-ui/react";
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
7
|
+
//#region src/components/data-table/pagination/data-table-selected-count.d.ts
|
|
8
|
+
export type DataTableSelectedCountProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'span'>, {
|
|
9
|
+
/** A tabela. Exige `rowSelectionFeature`. */
|
|
10
|
+
table: TableWith<TFeatures, TData, 'rowSelectionFeature'>;
|
|
11
|
+
/**
|
|
12
|
+
* Uma função que recebe quantas linhas estão marcadas e devolve o texto.
|
|
13
|
+
* @default (count) => '3 selecionadas', '1 selecionada' ou '0 selecionadas'
|
|
14
|
+
*/
|
|
15
|
+
children?: (count: number) => React.ReactNode;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Quantas linhas estão marcadas: "3 selecionadas". Aparece também sem nenhuma, "0 selecionadas":
|
|
19
|
+
* na barra da paginação, o lado esquerdo não some e volta a cada seleção.
|
|
20
|
+
*
|
|
21
|
+
* Conta os ids marcados no estado, e não as linhas carregadas: com a paginação pela API, entram as
|
|
22
|
+
* marcadas em outras páginas. Exige o `getRowId` com o id do registro (ver
|
|
23
|
+
* `DataTable.RowCheckbox`).
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* <DataTable.SelectedCount table={table}>
|
|
28
|
+
* {(count) => `${count} de ${total}`}
|
|
29
|
+
* </DataTable.SelectedCount>
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare const DataTableSelectedCount: {
|
|
33
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableSelectedCountProps<TFeatures, TData>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
34
|
+
displayName: string;
|
|
35
|
+
};
|
|
36
|
+
//#endregion
|
|
37
|
+
//# sourceMappingURL=data-table-selected-count.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-selected-count.d.ts","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-selected-count.tsx"],"mappings":";;;;;;;YAQY,4BACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,UAAU,WAAW;;;;;EAK5B,YAAY,kBAAkB,MAAM;;;;;;;;;;;;;;;;;qBAmB3B;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,4BAA4B,WAAW,SAAM,MAAA,+BAAA,MAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
2
|
+
import { useSelector } from "@tanstack/react-store";
|
|
3
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
4
|
+
//#region src/components/data-table/pagination/data-table-selected-count.tsx
|
|
5
|
+
/**
|
|
6
|
+
* Quantas linhas estão marcadas: "3 selecionadas". Aparece também sem nenhuma, "0 selecionadas":
|
|
7
|
+
* na barra da paginação, o lado esquerdo não some e volta a cada seleção.
|
|
8
|
+
*
|
|
9
|
+
* Conta os ids marcados no estado, e não as linhas carregadas: com a paginação pela API, entram as
|
|
10
|
+
* marcadas em outras páginas. Exige o `getRowId` com o id do registro (ver
|
|
11
|
+
* `DataTable.RowCheckbox`).
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <DataTable.SelectedCount table={table}>
|
|
16
|
+
* {(count) => `${count} de ${total}`}
|
|
17
|
+
* </DataTable.SelectedCount>
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
const DataTableSelectedCount = (props) => {
|
|
21
|
+
const { table, render, className, children, ...rest } = props;
|
|
22
|
+
/** Re-renderiza quando o número de marcadas muda. */
|
|
23
|
+
const count = useSelector(table.atoms.rowSelection, (rowSelection) => Object.values(rowSelection).filter(Boolean).length);
|
|
24
|
+
const baseProps = {
|
|
25
|
+
"data-component": "DataTable.SelectedCount",
|
|
26
|
+
className: mergeTwClassNames([
|
|
27
|
+
"text-gray-11",
|
|
28
|
+
"text-sm",
|
|
29
|
+
"tabular-nums",
|
|
30
|
+
"whitespace-nowrap"
|
|
31
|
+
], className),
|
|
32
|
+
children: children === void 0 ? `${count.toLocaleString("pt-BR")} ${count === 1 ? "selecionada" : "selecionadas"}` : children(count)
|
|
33
|
+
};
|
|
34
|
+
return useRender({
|
|
35
|
+
render,
|
|
36
|
+
defaultTagName: "span",
|
|
37
|
+
props: mergeProps(baseProps, rest)
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
DataTableSelectedCount.displayName = "DataTable.SelectedCount";
|
|
41
|
+
//#endregion
|
|
42
|
+
export { DataTableSelectedCount };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=data-table-selected-count.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-selected-count.js","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-selected-count.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport type { TableWith } from '../../../types';\n\nexport type DataTableSelectedCountProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'span'>,\n {\n /** A tabela. Exige `rowSelectionFeature`. */\n table: TableWith<TFeatures, TData, 'rowSelectionFeature'>;\n /**\n * Uma função que recebe quantas linhas estão marcadas e devolve o texto.\n * @default (count) => '3 selecionadas', '1 selecionada' ou '0 selecionadas'\n */\n children?: (count: number) => React.ReactNode;\n }\n>;\n\n/**\n * Quantas linhas estão marcadas: \"3 selecionadas\". Aparece também sem nenhuma, \"0 selecionadas\":\n * na barra da paginação, o lado esquerdo não some e volta a cada seleção.\n *\n * Conta os ids marcados no estado, e não as linhas carregadas: com a paginação pela API, entram as\n * marcadas em outras páginas. Exige o `getRowId` com o id do registro (ver\n * `DataTable.RowCheckbox`).\n *\n * @example\n * ```tsx\n * <DataTable.SelectedCount table={table}>\n * {(count) => `${count} de ${total}`}\n * </DataTable.SelectedCount>\n * ```\n */\nexport const DataTableSelectedCount = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableSelectedCountProps<TFeatures, TData>,\n) => {\n const { table, render, className, children, ...rest } = props;\n\n /** Re-renderiza quando o número de marcadas muda. */\n const count = useSelector(\n table.atoms.rowSelection,\n (rowSelection) => Object.values(rowSelection).filter(Boolean).length,\n );\n\n const baseProps = {\n 'data-component': 'DataTable.SelectedCount',\n className: mergeTwClassNames(\n [\n 'text-gray-11',\n 'text-sm',\n\n 'tabular-nums',\n 'whitespace-nowrap',\n ],\n className,\n ),\n children:\n children === undefined\n ? `${count.toLocaleString('pt-BR')} ${count === 1 ? 'selecionada' : 'selecionadas'}`\n : children(count),\n };\n\n return useRender({\n render,\n defaultTagName: 'span',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableSelectedCount.displayName = 'DataTable.SelectedCount';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuCA,MAAa,0BAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,UAAU,GAAG,SAAS;;CAGxD,MAAM,QAAQ,YACZ,MAAM,MAAM,eACX,iBAAiB,OAAO,OAAO,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,MAChE;CAEA,MAAM,YAAY;EAChB,kBAAkB;EAClB,WAAW,kBACT;GACE;GACA;GAEA;GACA;EACF,GACA,SACF;EACA,UACE,aAAa,KAAA,IACT,GAAG,MAAM,eAAe,OAAO,EAAE,GAAG,UAAU,IAAI,gBAAgB,mBAClE,SAAS,KAAK;CACtB;CAEA,OAAO,UAAU;EACf;EACA,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,uBAAuB,cAAc"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RowData, Table, TableFeatures } from "@tanstack/react-table";
|
|
2
|
+
import React from "react";
|
|
3
|
+
//#region src/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Volta a rolagem vertical ao topo quando a página ou o tamanho dela mudam. Sem isto, quem rolou
|
|
6
|
+
* até o fim e passou de página cai no fim da página seguinte. A rolagem horizontal fica. Só com
|
|
7
|
+
* `rowPaginationFeature`.
|
|
8
|
+
*
|
|
9
|
+
* Assina a paginação fora do React, como o bloqueio da carga: rolar não re-renderiza o corpo, que
|
|
10
|
+
* recriaria todas as linhas. Na paginação pela API, a página muda antes de as linhas chegarem, e
|
|
11
|
+
* um render ali seria à toa.
|
|
12
|
+
*/
|
|
13
|
+
export declare const useDataTablePageScrollReset: <TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, ref: React.RefObject<HTMLElement | null>) => void;
|
|
14
|
+
//#endregion
|
|
15
|
+
//# sourceMappingURL=use-data-table-page-scroll-reset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-page-scroll-reset.d.ts","names":[],"sources":["../../../../src/components/data-table/pagination/use-data-table-page-scroll-reset.ts"],"mappings":";;;;;;;;;;;;qBAea,8BACX,kBAAkB,eAClB,cAAc,SAEd,OAAO,MAAM,WAAW,QACxB,KAAK,MAAM,UAAU"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { hasTableFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { getDataTableScrollParent } from "../root/get-data-table-scroll-parent.js";
|
|
3
|
+
import { useLayoutEffect } from "react";
|
|
4
|
+
//#region src/components/data-table/pagination/use-data-table-page-scroll-reset.ts
|
|
5
|
+
/**
|
|
6
|
+
* Volta a rolagem vertical ao topo quando a página ou o tamanho dela mudam. Sem isto, quem rolou
|
|
7
|
+
* até o fim e passou de página cai no fim da página seguinte. A rolagem horizontal fica. Só com
|
|
8
|
+
* `rowPaginationFeature`.
|
|
9
|
+
*
|
|
10
|
+
* Assina a paginação fora do React, como o bloqueio da carga: rolar não re-renderiza o corpo, que
|
|
11
|
+
* recriaria todas as linhas. Na paginação pela API, a página muda antes de as linhas chegarem, e
|
|
12
|
+
* um render ali seria à toa.
|
|
13
|
+
*/
|
|
14
|
+
const useDataTablePageScrollReset = (table, ref) => {
|
|
15
|
+
useLayoutEffect(() => {
|
|
16
|
+
if (!hasTableFeature(table, "rowPaginationFeature")) return;
|
|
17
|
+
const paginationAtom = table.atoms.pagination;
|
|
18
|
+
/** A página e o tamanho num texto, para comparar com `===`. */
|
|
19
|
+
const getPageKey = () => {
|
|
20
|
+
const { pageIndex, pageSize } = paginationAtom.get();
|
|
21
|
+
return `${pageIndex}:${pageSize}`;
|
|
22
|
+
};
|
|
23
|
+
/** A página da última rolagem: na montagem, não rola. */
|
|
24
|
+
let lastPageKey = getPageKey();
|
|
25
|
+
const subscription = paginationAtom.subscribe(() => {
|
|
26
|
+
const pageKey = getPageKey();
|
|
27
|
+
if (pageKey === lastPageKey) return;
|
|
28
|
+
lastPageKey = pageKey;
|
|
29
|
+
const scrollParent = ref.current && getDataTableScrollParent(ref.current);
|
|
30
|
+
if (scrollParent) scrollParent.scrollTop = 0;
|
|
31
|
+
});
|
|
32
|
+
return () => subscription.unsubscribe();
|
|
33
|
+
}, [table, ref]);
|
|
34
|
+
};
|
|
35
|
+
//#endregion
|
|
36
|
+
export { useDataTablePageScrollReset };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=use-data-table-page-scroll-reset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-page-scroll-reset.js","names":[],"sources":["../../../../src/components/data-table/pagination/use-data-table-page-scroll-reset.ts"],"sourcesContent":["import type { RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { useLayoutEffect } from 'react';\nimport { hasTableFeature } from '../../../utils';\nimport { getDataTableScrollParent } from '../root/get-data-table-scroll-parent';\n\n/**\n * Volta a rolagem vertical ao topo quando a página ou o tamanho dela mudam. Sem isto, quem rolou\n * até o fim e passou de página cai no fim da página seguinte. A rolagem horizontal fica. Só com\n * `rowPaginationFeature`.\n *\n * Assina a paginação fora do React, como o bloqueio da carga: rolar não re-renderiza o corpo, que\n * recriaria todas as linhas. Na paginação pela API, a página muda antes de as linhas chegarem, e\n * um render ali seria à toa.\n */\nexport const useDataTablePageScrollReset = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table<TFeatures, TData>,\n ref: React.RefObject<HTMLElement | null>,\n) => {\n useLayoutEffect(() => {\n if (!hasTableFeature(table, 'rowPaginationFeature')) {\n return;\n }\n\n const paginationAtom = table.atoms.pagination;\n\n /** A página e o tamanho num texto, para comparar com `===`. */\n const getPageKey = () => {\n const { pageIndex, pageSize } = paginationAtom.get();\n\n return `${pageIndex}:${pageSize}`;\n };\n\n /** A página da última rolagem: na montagem, não rola. */\n let lastPageKey = getPageKey();\n\n const subscription = paginationAtom.subscribe(() => {\n const pageKey = getPageKey();\n\n if (pageKey === lastPageKey) {\n return;\n }\n\n lastPageKey = pageKey;\n\n const scrollParent = ref.current && getDataTableScrollParent(ref.current);\n\n if (scrollParent) {\n scrollParent.scrollTop = 0;\n }\n });\n\n return () => subscription.unsubscribe();\n }, [table, ref]);\n};\n"],"mappings":";;;;;;;;;;;;;AAeA,MAAa,+BAIX,OACA,QACG;CACH,sBAAsB;EACpB,IAAI,CAAC,gBAAgB,OAAO,sBAAsB,GAChD;EAGF,MAAM,iBAAiB,MAAM,MAAM;;EAGnC,MAAM,mBAAmB;GACvB,MAAM,EAAE,WAAW,aAAa,eAAe,IAAI;GAEnD,OAAO,GAAG,UAAU,GAAG;EACzB;;EAGA,IAAI,cAAc,WAAW;EAE7B,MAAM,eAAe,eAAe,gBAAgB;GAClD,MAAM,UAAU,WAAW;GAE3B,IAAI,YAAY,aACd;GAGF,cAAc;GAEd,MAAM,eAAe,IAAI,WAAW,yBAAyB,IAAI,OAAO;GAExE,IAAI,cACF,aAAa,YAAY;EAE7B,CAAC;EAED,aAAa,aAAa,YAAY;CACxC,GAAG,CAAC,OAAO,GAAG,CAAC;AACjB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { HeaderWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { useRender } from "@base-ui/react";
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
7
|
+
//#region src/components/data-table/resize/data-table-resize-handle.d.ts
|
|
8
|
+
export type DataTableResizeHandleProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
|
|
9
|
+
/** O header da coluna. Exige `columnSizingFeature` e `columnResizingFeature`. */
|
|
10
|
+
header: HeaderWith<TFeatures, TData, 'columnResizingFeature' | 'columnSizingFeature'>;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Área de agarre para redimensionar uma coluna, sobre a linha vertical do fim do header (que
|
|
14
|
+
* precisa ser `relative`). Arrastar redimensiona; duplo clique devolve a coluna ao tamanho
|
|
15
|
+
* definido.
|
|
16
|
+
*
|
|
17
|
+
* A caixa tem largura zero, e a área de agarre é um `::before` transparente de 12px centrado na
|
|
18
|
+
* linha, metade sobre a coluna vizinha; na última coluna e antes de uma fixada do fim, toda do
|
|
19
|
+
* lado de dentro. No repouso não aparece; no hover e no arrasto, o handle vira a âncora da
|
|
20
|
+
* linha-guia, que a `DataTable.ScrollArea` desenha na altura toda da tabela.
|
|
21
|
+
* Quando a borda chega à beira de uma fixada do fim ou ao fim da área visível, a rolagem
|
|
22
|
+
* acompanha o arrasto. Numa coluna que não redimensiona (`enableResizing: false`), não
|
|
23
|
+
* renderiza.
|
|
24
|
+
*
|
|
25
|
+
* Durante o arrasto, o `InteractionShield` do `ui` cobre a página: nada, dentro ou fora da
|
|
26
|
+
* tabela, reage ao ponteiro, o cursor de resize vale em toda parte, e o texto não é selecionado.
|
|
27
|
+
* A roda do mouse, por cima dele, não rola a tabela.
|
|
28
|
+
*
|
|
29
|
+
* Exige `columnResizeMode: 'onChange'` na tabela. Com o padrão do TanStack, `'onEnd'`, o tamanho
|
|
30
|
+
* só muda ao soltar: no arrasto nada anda na tela (nem a coluna, nem o handle, nem a guia), e a
|
|
31
|
+
* coluna pula no fim.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* const table = useTable({ features, columns, data, columnResizeMode: 'onChange' });
|
|
36
|
+
*
|
|
37
|
+
* <DataTable.HeaderCell header={header}>
|
|
38
|
+
* <DataTable.HeaderContent header={header} />
|
|
39
|
+
* <DataTable.ResizeHandle header={header} />
|
|
40
|
+
* </DataTable.HeaderCell>
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare const DataTableResizeHandle: {
|
|
44
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableResizeHandleProps<TFeatures, TData>): React.JSX.Element | null;
|
|
45
|
+
displayName: string;
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
//# sourceMappingURL=data-table-resize-handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-resize-handle.d.ts","names":[],"sources":["../../../../src/components/data-table/resize/data-table-resize-handle.tsx"],"mappings":";;;;;;;YAWY,2BACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,QAAQ,WACN,WACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAqCO;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,2BAA2B,WAAW,SAAM,MAAA,IAAA"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { useDataTableResizeScroll } from "./use-data-table-resize-scroll.js";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
4
|
+
import { useSelector } from "@tanstack/react-store";
|
|
5
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
6
|
+
import { useRef } from "react";
|
|
7
|
+
import { InteractionShield } from "@lucasbernardosn/react-ui/utilities/interaction-shield";
|
|
8
|
+
//#region src/components/data-table/resize/data-table-resize-handle.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Área de agarre para redimensionar uma coluna, sobre a linha vertical do fim do header (que
|
|
11
|
+
* precisa ser `relative`). Arrastar redimensiona; duplo clique devolve a coluna ao tamanho
|
|
12
|
+
* definido.
|
|
13
|
+
*
|
|
14
|
+
* A caixa tem largura zero, e a área de agarre é um `::before` transparente de 12px centrado na
|
|
15
|
+
* linha, metade sobre a coluna vizinha; na última coluna e antes de uma fixada do fim, toda do
|
|
16
|
+
* lado de dentro. No repouso não aparece; no hover e no arrasto, o handle vira a âncora da
|
|
17
|
+
* linha-guia, que a `DataTable.ScrollArea` desenha na altura toda da tabela.
|
|
18
|
+
* Quando a borda chega à beira de uma fixada do fim ou ao fim da área visível, a rolagem
|
|
19
|
+
* acompanha o arrasto. Numa coluna que não redimensiona (`enableResizing: false`), não
|
|
20
|
+
* renderiza.
|
|
21
|
+
*
|
|
22
|
+
* Durante o arrasto, o `InteractionShield` do `ui` cobre a página: nada, dentro ou fora da
|
|
23
|
+
* tabela, reage ao ponteiro, o cursor de resize vale em toda parte, e o texto não é selecionado.
|
|
24
|
+
* A roda do mouse, por cima dele, não rola a tabela.
|
|
25
|
+
*
|
|
26
|
+
* Exige `columnResizeMode: 'onChange'` na tabela. Com o padrão do TanStack, `'onEnd'`, o tamanho
|
|
27
|
+
* só muda ao soltar: no arrasto nada anda na tela (nem a coluna, nem o handle, nem a guia), e a
|
|
28
|
+
* coluna pula no fim.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* const table = useTable({ features, columns, data, columnResizeMode: 'onChange' });
|
|
33
|
+
*
|
|
34
|
+
* <DataTable.HeaderCell header={header}>
|
|
35
|
+
* <DataTable.HeaderContent header={header} />
|
|
36
|
+
* <DataTable.ResizeHandle header={header} />
|
|
37
|
+
* </DataTable.HeaderCell>
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
const DataTableResizeHandle = (props) => {
|
|
41
|
+
const { header, render, className, ref, ...rest } = props;
|
|
42
|
+
const handleRef = useRef(null);
|
|
43
|
+
/**
|
|
44
|
+
* O atom do resize muda a cada tick do arrasto, mas o booleano só no começo e no fim: o handle
|
|
45
|
+
* re-renderiza duas vezes por arrasto, e só o da coluna arrastada.
|
|
46
|
+
*/
|
|
47
|
+
const isResizing = useSelector(header.column.table.atoms.columnResizing, () => header.column.getIsResizing());
|
|
48
|
+
useDataTableResizeScroll(header.column.table, isResizing, handleRef);
|
|
49
|
+
const onResizeStart = header.getResizeHandler();
|
|
50
|
+
/**
|
|
51
|
+
* O duplo clique pelo `detail` do `mousedown`, que conta os cliques, e não pelo `dblclick`: o
|
|
52
|
+
* arrasto começa no primeiro `mousedown`, o shield cobre o handle, e o `mouseup` cai nele. O
|
|
53
|
+
* navegador então não manda o `click` nem o `dblclick` ao handle.
|
|
54
|
+
*/
|
|
55
|
+
const handleMouseDown = (event) => {
|
|
56
|
+
if (event.detail === 2) {
|
|
57
|
+
header.column.resetSize();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
onResizeStart(event);
|
|
61
|
+
};
|
|
62
|
+
const baseProps = {
|
|
63
|
+
"data-component": "DataTable.ResizeHandle",
|
|
64
|
+
"data-resizing": isResizing ? "" : void 0,
|
|
65
|
+
"aria-hidden": true,
|
|
66
|
+
onMouseDown: handleMouseDown,
|
|
67
|
+
onTouchStart: onResizeStart,
|
|
68
|
+
className: mergeTwClassNames([
|
|
69
|
+
"absolute",
|
|
70
|
+
"top-0",
|
|
71
|
+
"right-0",
|
|
72
|
+
"in-[[role=columnheader]:last-child]:right-px",
|
|
73
|
+
"z-10",
|
|
74
|
+
"h-full",
|
|
75
|
+
"cursor-col-resize",
|
|
76
|
+
"in-[[role=columnheader]:has([data-popup-open])]:pointer-events-none",
|
|
77
|
+
"touch-none",
|
|
78
|
+
"select-none",
|
|
79
|
+
"before:absolute",
|
|
80
|
+
"before:top-0",
|
|
81
|
+
"before:right-0",
|
|
82
|
+
"before:h-full",
|
|
83
|
+
"before:w-3",
|
|
84
|
+
"before:translate-x-1.5",
|
|
85
|
+
"before:content-[\"\"]",
|
|
86
|
+
"in-[[role=columnheader]:last-child]:before:translate-x-0",
|
|
87
|
+
"in-[[role=columnheader]:has(+[data-pinned=end])]:before:translate-x-0",
|
|
88
|
+
"after:absolute",
|
|
89
|
+
"after:inset-y-0",
|
|
90
|
+
"after:left-0",
|
|
91
|
+
"after:w-0.5",
|
|
92
|
+
"after:-translate-x-1/2",
|
|
93
|
+
"after:content-[\"\"]",
|
|
94
|
+
"hover:after:bg-gray-9",
|
|
95
|
+
"data-resizing:after:bg-black",
|
|
96
|
+
"dark:data-resizing:after:bg-white",
|
|
97
|
+
"hover:[anchor-name:--data-table-resize-handle]",
|
|
98
|
+
"data-resizing:[anchor-name:--data-table-resize-handle]"
|
|
99
|
+
], className)
|
|
100
|
+
};
|
|
101
|
+
const element = useRender({
|
|
102
|
+
render,
|
|
103
|
+
defaultTagName: "div",
|
|
104
|
+
ref: [handleRef, ref ?? null],
|
|
105
|
+
props: mergeProps(baseProps, rest)
|
|
106
|
+
});
|
|
107
|
+
return header.column.getCanResize() ? /* @__PURE__ */ jsxs(Fragment, { children: [element, /* @__PURE__ */ jsx(InteractionShield, {
|
|
108
|
+
active: isResizing,
|
|
109
|
+
cursor: "col-resize"
|
|
110
|
+
})] }) : null;
|
|
111
|
+
};
|
|
112
|
+
DataTableResizeHandle.displayName = "DataTable.ResizeHandle";
|
|
113
|
+
//#endregion
|
|
114
|
+
export { DataTableResizeHandle };
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=data-table-resize-handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-resize-handle.js","names":[],"sources":["../../../../src/components/data-table/resize/data-table-resize-handle.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { InteractionShield } from '@lucasbernardosn/react-ui/utilities/interaction-shield';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport type { HeaderWith } from '../../../types';\nimport { useDataTableResizeScroll } from './use-data-table-resize-scroll';\n\nexport type DataTableResizeHandleProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** O header da coluna. Exige `columnSizingFeature` e `columnResizingFeature`. */\n header: HeaderWith<\n TFeatures,\n TData,\n 'columnResizingFeature' | 'columnSizingFeature'\n >;\n }\n>;\n\n/**\n * Área de agarre para redimensionar uma coluna, sobre a linha vertical do fim do header (que\n * precisa ser `relative`). Arrastar redimensiona; duplo clique devolve a coluna ao tamanho\n * definido.\n *\n * A caixa tem largura zero, e a área de agarre é um `::before` transparente de 12px centrado na\n * linha, metade sobre a coluna vizinha; na última coluna e antes de uma fixada do fim, toda do\n * lado de dentro. No repouso não aparece; no hover e no arrasto, o handle vira a âncora da\n * linha-guia, que a `DataTable.ScrollArea` desenha na altura toda da tabela.\n * Quando a borda chega à beira de uma fixada do fim ou ao fim da área visível, a rolagem\n * acompanha o arrasto. Numa coluna que não redimensiona (`enableResizing: false`), não\n * renderiza.\n *\n * Durante o arrasto, o `InteractionShield` do `ui` cobre a página: nada, dentro ou fora da\n * tabela, reage ao ponteiro, o cursor de resize vale em toda parte, e o texto não é selecionado.\n * A roda do mouse, por cima dele, não rola a tabela.\n *\n * Exige `columnResizeMode: 'onChange'` na tabela. Com o padrão do TanStack, `'onEnd'`, o tamanho\n * só muda ao soltar: no arrasto nada anda na tela (nem a coluna, nem o handle, nem a guia), e a\n * coluna pula no fim.\n *\n * @example\n * ```tsx\n * const table = useTable({ features, columns, data, columnResizeMode: 'onChange' });\n *\n * <DataTable.HeaderCell header={header}>\n * <DataTable.HeaderContent header={header} />\n * <DataTable.ResizeHandle header={header} />\n * </DataTable.HeaderCell>\n * ```\n */\nexport const DataTableResizeHandle = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableResizeHandleProps<TFeatures, TData>,\n) => {\n const { header, render, className, ref, ...rest } = props;\n\n const handleRef = useRef<HTMLDivElement>(null);\n\n /**\n * O atom do resize muda a cada tick do arrasto, mas o booleano só no começo e no fim: o handle\n * re-renderiza duas vezes por arrasto, e só o da coluna arrastada.\n */\n const isResizing = useSelector(header.column.table.atoms.columnResizing, () =>\n header.column.getIsResizing(),\n );\n\n useDataTableResizeScroll(header.column.table, isResizing, handleRef);\n\n const onResizeStart = header.getResizeHandler();\n\n /**\n * O duplo clique pelo `detail` do `mousedown`, que conta os cliques, e não pelo `dblclick`: o\n * arrasto começa no primeiro `mousedown`, o shield cobre o handle, e o `mouseup` cai nele. O\n * navegador então não manda o `click` nem o `dblclick` ao handle.\n */\n const handleMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n if (event.detail === 2) {\n header.column.resetSize();\n\n return;\n }\n\n onResizeStart(event);\n };\n\n const baseProps = {\n 'data-component': 'DataTable.ResizeHandle',\n 'data-resizing': isResizing ? '' : undefined,\n // Só ponteiro: sem resize por teclado, um `separator` prometeria teclas que não existem.\n 'aria-hidden': true,\n onMouseDown: handleMouseDown,\n onTouchStart: onResizeStart,\n className: mergeTwClassNames(\n [\n // Sobre a linha vertical: o `right-0` é o fim do padding, e a borda de 1px que o\n // `divide-x` põe na célula vem logo depois. A última da linha não tem borda, e o\n // `right-px` põe o handle no mesmo ponto em relação ao fim dela. Antes de uma fixada do\n // fim, a célula também perde a borda, mas a linha passa a ser a da fixada, logo depois:\n // o `right-0` continua certo. Pela posição no DOM, com os seletores das bordas da\n // `DataTable.HeaderRow`, o handle e a borda não têm como discordar.\n 'absolute',\n 'top-0',\n 'right-0',\n 'in-[[role=columnheader]:last-child]:right-px',\n 'z-10',\n\n 'h-full',\n\n 'cursor-col-resize',\n // Com um menu aberto no gatilho da célula, o backdrop do Base UI deixa um recorte do\n // tamanho do gatilho, e a metade de dentro da área de agarre cairia nele: o hover acenderia\n // a linha-guia com o menu aberto.\n 'in-[[role=columnheader]:has([data-popup-open])]:pointer-events-none',\n // Sem isto, o arrasto no toque rola a página em vez de redimensionar.\n 'touch-none',\n 'select-none',\n\n // Área de agarre centrada na linha. Conteúdo recortado não recebe clique, então nada\n // entre o handle e o header pode ter `overflow: hidden`.\n 'before:absolute',\n 'before:top-0',\n 'before:right-0',\n 'before:h-full',\n 'before:w-3',\n 'before:translate-x-1.5',\n 'before:content-[\"\"]',\n\n // Onde a metade de fora não serve, os 12px ficam todos do lado de dentro. Na última da\n // linha, ela passaria do fim da tabela e acenderia a barra de rolagem horizontal sem\n // haver o que rolar; antes de uma fixada do fim, ficaria por baixo dela, sem pegar o\n // clique.\n 'in-[[role=columnheader]:last-child]:before:translate-x-0',\n 'in-[[role=columnheader]:has(+[data-pinned=end])]:before:translate-x-0',\n\n // A linha de 2px no cabeçalho, sobre a borda e 1px antes dela, no hover e no arrasto. Onde\n // há anchor positioning, a linha-guia cobre esta no mesmo lugar e segue pelo corpo; sem\n // ele, fica só esta.\n 'after:absolute',\n 'after:inset-y-0',\n 'after:left-0',\n 'after:w-0.5',\n 'after:-translate-x-1/2',\n 'after:content-[\"\"]',\n 'hover:after:bg-gray-9',\n 'data-resizing:after:bg-black',\n 'dark:data-resizing:after:bg-white',\n\n // A âncora da linha-guia (ver `DataTable.ScrollArea`), no hover e no arrasto. Um nome só\n // basta: no arrasto, o shield cobre os outros handles, e nenhum fica em hover junto com\n // o arrastado. Com o nome repetido, a guia iria para o último.\n 'hover:[anchor-name:--data-table-resize-handle]',\n 'data-resizing:[anchor-name:--data-table-resize-handle]',\n ],\n className,\n ),\n };\n\n const element = useRender({\n render,\n defaultTagName: 'div',\n ref: [handleRef, ref ?? null],\n props: mergeProps(baseProps, rest),\n });\n\n return header.column.getCanResize() ? (\n <>\n {element}\n <InteractionShield\n active={isResizing}\n cursor=\"col-resize\"\n />\n </>\n ) : null;\n};\n\nDataTableResizeHandle.displayName = 'DataTable.ResizeHandle';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDA,MAAa,yBAIX,UACG;CACH,MAAM,EAAE,QAAQ,QAAQ,WAAW,KAAK,GAAG,SAAS;CAEpD,MAAM,YAAY,OAAuB,IAAI;;;;;CAM7C,MAAM,aAAa,YAAY,OAAO,OAAO,MAAM,MAAM,sBACvD,OAAO,OAAO,cAAc,CAC9B;CAEA,yBAAyB,OAAO,OAAO,OAAO,YAAY,SAAS;CAEnE,MAAM,gBAAgB,OAAO,iBAAiB;;;;;;CAO9C,MAAM,mBAAmB,UAA4C;EACnE,IAAI,MAAM,WAAW,GAAG;GACtB,OAAO,OAAO,UAAU;GAExB;EACF;EAEA,cAAc,KAAK;CACrB;CAEA,MAAM,YAAY;EAChB,kBAAkB;EAClB,iBAAiB,aAAa,KAAK,KAAA;EAEnC,eAAe;EACf,aAAa;EACb,cAAc;EACd,WAAW,kBACT;GAOE;GACA;GACA;GACA;GACA;GAEA;GAEA;GAIA;GAEA;GACA;GAIA;GACA;GACA;GACA;GACA;GACA;GACA;GAMA;GACA;GAKA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GAKA;GACA;EACF,GACA,SACF;CACF;CAEA,MAAM,UAAU,UAAU;EACxB;EACA,gBAAgB;EAChB,KAAK,CAAC,WAAW,OAAO,IAAI;EAC5B,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;CAED,OAAO,OAAO,OAAO,aAAa,IAChC,qBAAA,UAAA,EAAA,UAAA,CACG,SACD,oBAAC,mBAAD;EACE,QAAQ;EACR,QAAO;CACR,CAAA,CACD,EAAA,CAAA,IACA;AACN;AAEA,sBAAsB,cAAc"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RowData, Table, TableFeatures } from "@tanstack/react-table";
|
|
2
|
+
import React from "react";
|
|
3
|
+
//#region src/components/data-table/resize/use-data-table-resize-scroll.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* No arrasto do resize, a rolagem acompanha a borda da coluna quando ela chega à beira de uma
|
|
6
|
+
* fixada do fim ou ao fim da área visível: a borda para ali, e as colunas de antes andam para a
|
|
7
|
+
* esquerda. Sem isto, a coluna cresceria por baixo da fixada, ou fora da vista, e nada mudaria na
|
|
8
|
+
* tela enquanto o ponteiro anda. Coluna fixada fica de fora: a borda dela não sai da vista.
|
|
9
|
+
*
|
|
10
|
+
* Assina o store só durante o arrasto, fora do React, e mede numa microtarefa: ela roda depois de
|
|
11
|
+
* todas as assinaturas da mesma mudança, inclusive a do `DataTable.Root`, que escreve o template
|
|
12
|
+
* das colunas, e antes da pintura. A medida já tem a largura nova, e a borda não chega a aparecer
|
|
13
|
+
* além da beira. O viewport e as fixadas do fim são lidos no começo do arrasto: o pinning não muda
|
|
14
|
+
* no meio dele.
|
|
15
|
+
*/
|
|
16
|
+
export declare const useDataTableResizeScroll: <TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, isResizing: boolean, ref: React.RefObject<HTMLElement | null>) => void;
|
|
17
|
+
//#endregion
|
|
18
|
+
//# sourceMappingURL=use-data-table-resize-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-resize-scroll.d.ts","names":[],"sources":["../../../../src/components/data-table/resize/use-data-table-resize-scroll.ts"],"mappings":";;;;;;;;;;;;;;;qBAiBa,2BACX,kBAAkB,eAClB,cAAc,SAEd,OAAO,MAAM,WAAW,QACxB,qBACA,KAAK,MAAM,UAAU"}
|