@lucasbernardosn/react-table 0.0.0-stage → 0.1.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/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 +28 -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 +65 -0
- package/dist/components/column-menu/column-menu-pin-items.js.map +1 -0
- package/dist/components/column-menu/column-menu-popup.d.ts +39 -0
- package/dist/components/column-menu/column-menu-popup.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-popup.js +66 -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 +29 -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 +61 -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 +31 -0
- package/dist/components/columns-panel/columns-panel-item.d.ts.map +1 -0
- package/dist/components/columns-panel/columns-panel-item.js +92 -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 +150 -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 +32 -0
- package/dist/components/data-table/index.parts.d.ts.map +1 -0
- package/dist/components/data-table/index.parts.js +60 -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 +115 -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-classes.d.ts +10 -0
- package/dist/components/data-table/root/data-table-grid-classes.d.ts.map +1 -0
- package/dist/components/data-table/root/data-table-grid-classes.js +22 -0
- package/dist/components/data-table/root/data-table-grid-classes.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 +21 -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 +127 -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/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 +47 -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 +78 -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
- package/README.md +0 -3
|
@@ -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,115 @@
|
|
|
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
|
+
"touch-none",
|
|
77
|
+
"select-none",
|
|
78
|
+
"before:absolute",
|
|
79
|
+
"before:top-0",
|
|
80
|
+
"before:right-0",
|
|
81
|
+
"before:h-full",
|
|
82
|
+
"before:w-3",
|
|
83
|
+
"before:translate-x-1.5",
|
|
84
|
+
"before:content-[\"\"]",
|
|
85
|
+
"in-[[role=columnheader]:last-child]:before:translate-x-0",
|
|
86
|
+
"in-[[role=columnheader]:has(+[data-pinned=end])]:before:translate-x-0",
|
|
87
|
+
"after:absolute",
|
|
88
|
+
"after:inset-y-0",
|
|
89
|
+
"after:left-0",
|
|
90
|
+
"after:w-0.5",
|
|
91
|
+
"after:-translate-x-1/2",
|
|
92
|
+
"after:content-[\"\"]",
|
|
93
|
+
"hover:after:bg-gray-9",
|
|
94
|
+
"data-resizing:after:bg-black",
|
|
95
|
+
"dark:data-resizing:after:bg-white",
|
|
96
|
+
"hover:[anchor-name:--data-table-resize-handle]",
|
|
97
|
+
"data-resizing:[anchor-name:--data-table-resize-handle]"
|
|
98
|
+
], className)
|
|
99
|
+
};
|
|
100
|
+
const element = useRender({
|
|
101
|
+
render,
|
|
102
|
+
defaultTagName: "div",
|
|
103
|
+
ref: [handleRef, ref ?? null],
|
|
104
|
+
props: mergeProps(baseProps, rest)
|
|
105
|
+
});
|
|
106
|
+
return header.column.getCanResize() ? /* @__PURE__ */ jsxs(Fragment, { children: [element, /* @__PURE__ */ jsx(InteractionShield, {
|
|
107
|
+
active: isResizing,
|
|
108
|
+
cursor: "col-resize"
|
|
109
|
+
})] }) : null;
|
|
110
|
+
};
|
|
111
|
+
DataTableResizeHandle.displayName = "DataTable.ResizeHandle";
|
|
112
|
+
//#endregion
|
|
113
|
+
export { DataTableResizeHandle };
|
|
114
|
+
|
|
115
|
+
//# 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 // 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;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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { getDataTableScrollParent } from "../root/get-data-table-scroll-parent.js";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
//#region src/components/data-table/resize/use-data-table-resize-scroll.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
|
+
const useDataTableResizeScroll = (table, isResizing, ref) => {
|
|
17
|
+
const { store } = table;
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (!isResizing) return;
|
|
20
|
+
const handle = ref.current;
|
|
21
|
+
const headerCell = handle?.closest("[role=\"columnheader\"]");
|
|
22
|
+
const viewport = handle ? getDataTableScrollParent(handle) : void 0;
|
|
23
|
+
if (!(headerCell instanceof HTMLElement && viewport) || headerCell.dataset.pinned) return;
|
|
24
|
+
/** As fixadas do fim, na mesma linha do cabeçalho. */
|
|
25
|
+
const endPinnedCells = Array.from(headerCell.parentElement?.querySelectorAll("[data-pinned=\"end\"]") ?? []);
|
|
26
|
+
/** Uma medida por mudança: o store pode avisar mais de uma vez antes da microtarefa. */
|
|
27
|
+
let isScheduled = false;
|
|
28
|
+
/**
|
|
29
|
+
* Rola o quanto a borda passou da área visível do centro: o começo da primeira fixada do fim
|
|
30
|
+
* ou, sem ela, o fim do viewport.
|
|
31
|
+
*/
|
|
32
|
+
const scrollToEdge = () => {
|
|
33
|
+
isScheduled = false;
|
|
34
|
+
const viewportRect = viewport.getBoundingClientRect();
|
|
35
|
+
const visibleEnd = Math.min(viewportRect.left + viewport.clientLeft + viewport.clientWidth, ...endPinnedCells.map((cell) => cell.getBoundingClientRect().left));
|
|
36
|
+
const overflow = headerCell.getBoundingClientRect().right - visibleEnd;
|
|
37
|
+
if (overflow > 0) viewport.scrollLeft += overflow;
|
|
38
|
+
};
|
|
39
|
+
const subscription = store.subscribe(() => {
|
|
40
|
+
if (!isScheduled) {
|
|
41
|
+
isScheduled = true;
|
|
42
|
+
queueMicrotask(scrollToEdge);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return () => subscription.unsubscribe();
|
|
46
|
+
}, [
|
|
47
|
+
isResizing,
|
|
48
|
+
ref,
|
|
49
|
+
store
|
|
50
|
+
]);
|
|
51
|
+
};
|
|
52
|
+
//#endregion
|
|
53
|
+
export { useDataTableResizeScroll };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=use-data-table-resize-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-resize-scroll.js","names":[],"sources":["../../../../src/components/data-table/resize/use-data-table-resize-scroll.ts"],"sourcesContent":["import type { RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { useEffect } from 'react';\nimport { getDataTableScrollParent } from '../root/get-data-table-scroll-parent';\n\n/**\n * No arrasto do resize, a rolagem acompanha a borda da coluna quando ela chega à beira de uma\n * fixada do fim ou ao fim da área visível: a borda para ali, e as colunas de antes andam para a\n * esquerda. Sem isto, a coluna cresceria por baixo da fixada, ou fora da vista, e nada mudaria na\n * tela enquanto o ponteiro anda. Coluna fixada fica de fora: a borda dela não sai da vista.\n *\n * Assina o store só durante o arrasto, fora do React, e mede numa microtarefa: ela roda depois de\n * todas as assinaturas da mesma mudança, inclusive a do `DataTable.Root`, que escreve o template\n * das colunas, e antes da pintura. A medida já tem a largura nova, e a borda não chega a aparecer\n * além da beira. O viewport e as fixadas do fim são lidos no começo do arrasto: o pinning não muda\n * no meio dele.\n */\nexport const useDataTableResizeScroll = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table<TFeatures, TData>,\n isResizing: boolean,\n ref: React.RefObject<HTMLElement | null>,\n) => {\n const { store } = table;\n\n useEffect(() => {\n if (!isResizing) {\n return;\n }\n\n const handle = ref.current;\n const headerCell = handle?.closest('[role=\"columnheader\"]');\n const viewport = handle ? getDataTableScrollParent(handle) : undefined;\n\n if (\n !(headerCell instanceof HTMLElement && viewport) ||\n headerCell.dataset.pinned\n ) {\n return;\n }\n\n /** As fixadas do fim, na mesma linha do cabeçalho. */\n const endPinnedCells = Array.from(\n headerCell.parentElement?.querySelectorAll('[data-pinned=\"end\"]') ?? [],\n );\n\n /** Uma medida por mudança: o store pode avisar mais de uma vez antes da microtarefa. */\n let isScheduled = false;\n\n /**\n * Rola o quanto a borda passou da área visível do centro: o começo da primeira fixada do fim\n * ou, sem ela, o fim do viewport.\n */\n const scrollToEdge = () => {\n isScheduled = false;\n\n const viewportRect = viewport.getBoundingClientRect();\n const visibleEnd = Math.min(\n viewportRect.left + viewport.clientLeft + viewport.clientWidth,\n ...endPinnedCells.map((cell) => cell.getBoundingClientRect().left),\n );\n const overflow = headerCell.getBoundingClientRect().right - visibleEnd;\n\n if (overflow > 0) {\n viewport.scrollLeft += overflow;\n }\n };\n\n const subscription = store.subscribe(() => {\n if (!isScheduled) {\n isScheduled = true;\n queueMicrotask(scrollToEdge);\n }\n });\n\n return () => subscription.unsubscribe();\n }, [isResizing, ref, store]);\n};\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAa,4BAIX,OACA,YACA,QACG;CACH,MAAM,EAAE,UAAU;CAElB,gBAAgB;EACd,IAAI,CAAC,YACH;EAGF,MAAM,SAAS,IAAI;EACnB,MAAM,aAAa,QAAQ,QAAQ,yBAAuB;EAC1D,MAAM,WAAW,SAAS,yBAAyB,MAAM,IAAI,KAAA;EAE7D,IACE,EAAE,sBAAsB,eAAe,aACvC,WAAW,QAAQ,QAEnB;;EAIF,MAAM,iBAAiB,MAAM,KAC3B,WAAW,eAAe,iBAAiB,uBAAqB,KAAK,CAAC,CACxE;;EAGA,IAAI,cAAc;;;;;EAMlB,MAAM,qBAAqB;GACzB,cAAc;GAEd,MAAM,eAAe,SAAS,sBAAsB;GACpD,MAAM,aAAa,KAAK,IACtB,aAAa,OAAO,SAAS,aAAa,SAAS,aACnD,GAAG,eAAe,KAAK,SAAS,KAAK,sBAAsB,CAAC,CAAC,IAAI,CACnE;GACA,MAAM,WAAW,WAAW,sBAAsB,CAAC,CAAC,QAAQ;GAE5D,IAAI,WAAW,GACb,SAAS,cAAc;EAE3B;EAEA,MAAM,eAAe,MAAM,gBAAgB;GACzC,IAAI,CAAC,aAAa;IAChB,cAAc;IACd,eAAe,YAAY;GAC7B;EACF,CAAC;EAED,aAAa,aAAa,YAAY;CACxC,GAAG;EAAC;EAAY;EAAK;CAAK,CAAC;AAC7B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/components/data-table/root/data-table-grid-classes.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* A grade de uma linha, comum à `DataTable.Row`, à `DataTable.HeaderRow` e às linhas-fantasma do
|
|
4
|
+
* `DataTable.Body`: o grid com o template das colunas, a linha vertical entre as células e a
|
|
5
|
+
* horizontal embaixo. Num lugar só, para as três não divergirem; a regra da última linha fica em
|
|
6
|
+
* cada uma.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DATA_TABLE_GRID_CLASS_NAMES: string[];
|
|
9
|
+
//#endregion
|
|
10
|
+
//# sourceMappingURL=data-table-grid-classes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-grid-classes.d.ts","names":[],"sources":["../../../../src/components/data-table/root/data-table-grid-classes.ts"],"mappings":";;;;;;;qBAMa"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/components/data-table/root/data-table-grid-classes.ts
|
|
2
|
+
/**
|
|
3
|
+
* A grade de uma linha, comum à `DataTable.Row`, à `DataTable.HeaderRow` e às linhas-fantasma do
|
|
4
|
+
* `DataTable.Body`: o grid com o template das colunas, a linha vertical entre as células e a
|
|
5
|
+
* horizontal embaixo. Num lugar só, para as três não divergirem; a regra da última linha fica em
|
|
6
|
+
* cada uma.
|
|
7
|
+
*/
|
|
8
|
+
const DATA_TABLE_GRID_CLASS_NAMES = [
|
|
9
|
+
"grid",
|
|
10
|
+
"grid-cols-(--data-table-template)",
|
|
11
|
+
"divide-x",
|
|
12
|
+
"divide-gray-6",
|
|
13
|
+
"*:data-[pinned=end]:border-s",
|
|
14
|
+
"*:data-[pinned=end]:border-gray-6",
|
|
15
|
+
"*:has-[+[data-pinned=end]]:border-e-0",
|
|
16
|
+
"border-b",
|
|
17
|
+
"border-gray-6"
|
|
18
|
+
];
|
|
19
|
+
//#endregion
|
|
20
|
+
export { DATA_TABLE_GRID_CLASS_NAMES };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=data-table-grid-classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-grid-classes.js","names":[],"sources":["../../../../src/components/data-table/root/data-table-grid-classes.ts"],"sourcesContent":["/**\n * A grade de uma linha, comum à `DataTable.Row`, à `DataTable.HeaderRow` e às linhas-fantasma do\n * `DataTable.Body`: o grid com o template das colunas, a linha vertical entre as células e a\n * horizontal embaixo. Num lugar só, para as três não divergirem; a regra da última linha fica em\n * cada uma.\n */\nexport const DATA_TABLE_GRID_CLASS_NAMES: string[] = [\n 'grid',\n 'grid-cols-(--data-table-template)',\n\n // Linha vertical entre as células: o `divide-x` põe borda no fim de cada filho, menos no\n // último, e assim a linha não tem borda na ponta direita. Fica na linha, e não na célula, para\n // a célula não precisar saber se é a última.\n 'divide-x',\n 'divide-gray-6',\n // Na fixada do fim, a linha vertical fica do lado do início, e a célula antes dela perde a do\n // fim: o centro rola por baixo e levaria a borda junto, e as duas somariam 2px quando encostam.\n '*:data-[pinned=end]:border-s',\n '*:data-[pinned=end]:border-gray-6',\n '*:has-[+[data-pinned=end]]:border-e-0',\n\n // Linha horizontal embaixo da linha.\n 'border-b',\n 'border-gray-6',\n];\n"],"mappings":";;;;;;;AAMA,MAAa,8BAAwC;CACnD;CACA;CAKA;CACA;CAGA;CACA;CACA;CAGA;CACA;AACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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 { MergeOverride } from "@lucasbernardosn/utils";
|
|
6
|
+
//#region src/components/data-table/root/data-table-root.d.ts
|
|
7
|
+
export type DataTableRootProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
|
|
8
|
+
/** A tabela do `useTable`. Exige `columnSizingFeature`. */
|
|
9
|
+
table: TableWith<TFeatures, TData, 'columnSizingFeature'>;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* O elemento do grid (`role="table"`; com `activeRowFeature`, `role="grid"`, que diz ao leitor
|
|
13
|
+
* de tela que as setas são da tabela). Escreve as variáveis das colunas, que toda
|
|
14
|
+
* `DataTable.Row` lê, e tem a largura exata da soma delas.
|
|
15
|
+
*
|
|
16
|
+
* Declara também a altura das linhas e dos headers e o espaçamento das células, que as partes
|
|
17
|
+
* leem. Com `rowDensityFeature`, marca o grid com `data-density`, e esses valores seguem a
|
|
18
|
+
* densidade; para outros valores, redefina as variáveis pela `className`.
|
|
19
|
+
*
|
|
20
|
+
* Com `loadingFeature`, marca `aria-busy` enquanto carrega e, depois de 200ms, `data-loading`: as
|
|
21
|
+
* células trocam o conteúdo por um skeleton, e o `DataTable.ScrollArea` mostra uma barra sob o
|
|
22
|
+
* cabeçalho. Uma resposta mais rápida que isso não mostra nada.
|
|
23
|
+
*
|
|
24
|
+
* Não rola: para rolar, e para o cabeçalho grudar, ponha-o num `DataTable.ScrollArea` ou em
|
|
25
|
+
* outro contêiner com `overflow`.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* <DataTable.ScrollArea>
|
|
30
|
+
* <DataTable.Root table={table} aria-label="Clientes">
|
|
31
|
+
* …
|
|
32
|
+
* </DataTable.Root>
|
|
33
|
+
* </DataTable.ScrollArea>
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare const DataTableRoot: {
|
|
37
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableRootProps<TFeatures, TData>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
38
|
+
displayName: string;
|
|
39
|
+
};
|
|
40
|
+
//#endregion
|
|
41
|
+
//# sourceMappingURL=data-table-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-root.d.ts","names":[],"sources":["../../../../src/components/data-table/root/data-table-root.tsx"],"mappings":";;;;;;YAWY,mBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,UAAU,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA6BnB;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,mBAAmB,WAAW,yBAAM,+CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { hasTableFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { useDataTableLoading } from "../loading/use-data-table-loading.js";
|
|
3
|
+
import { useDataTableColumnLayout } from "./use-data-table-column-layout.js";
|
|
4
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
5
|
+
import { useSelector } from "@tanstack/react-store";
|
|
6
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
7
|
+
//#region src/components/data-table/root/data-table-root.tsx
|
|
8
|
+
/**
|
|
9
|
+
* O elemento do grid (`role="table"`; com `activeRowFeature`, `role="grid"`, que diz ao leitor
|
|
10
|
+
* de tela que as setas são da tabela). Escreve as variáveis das colunas, que toda
|
|
11
|
+
* `DataTable.Row` lê, e tem a largura exata da soma delas.
|
|
12
|
+
*
|
|
13
|
+
* Declara também a altura das linhas e dos headers e o espaçamento das células, que as partes
|
|
14
|
+
* leem. Com `rowDensityFeature`, marca o grid com `data-density`, e esses valores seguem a
|
|
15
|
+
* densidade; para outros valores, redefina as variáveis pela `className`.
|
|
16
|
+
*
|
|
17
|
+
* Com `loadingFeature`, marca `aria-busy` enquanto carrega e, depois de 200ms, `data-loading`: as
|
|
18
|
+
* células trocam o conteúdo por um skeleton, e o `DataTable.ScrollArea` mostra uma barra sob o
|
|
19
|
+
* cabeçalho. Uma resposta mais rápida que isso não mostra nada.
|
|
20
|
+
*
|
|
21
|
+
* Não rola: para rolar, e para o cabeçalho grudar, ponha-o num `DataTable.ScrollArea` ou em
|
|
22
|
+
* outro contêiner com `overflow`.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <DataTable.ScrollArea>
|
|
27
|
+
* <DataTable.Root table={table} aria-label="Clientes">
|
|
28
|
+
* …
|
|
29
|
+
* </DataTable.Root>
|
|
30
|
+
* </DataTable.ScrollArea>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
const DataTableRoot = (props) => {
|
|
34
|
+
const { table, render, className, ref, ...rest } = props;
|
|
35
|
+
const rootRef = useDataTableColumnLayout(table);
|
|
36
|
+
/**
|
|
37
|
+
* Re-renderiza só o `Root`, e só quando a densidade muda: as linhas chegam prontas por
|
|
38
|
+
* `children`, e as células mudam de tamanho pelas variáveis, sem render.
|
|
39
|
+
*/
|
|
40
|
+
const density = useSelector(table.store, () => hasTableFeature(table, "rowDensityFeature") ? table.atoms.rowDensity.get() : void 0);
|
|
41
|
+
const loading = useDataTableLoading(table);
|
|
42
|
+
const baseProps = {
|
|
43
|
+
"data-component": "DataTable.Root",
|
|
44
|
+
"data-density": density,
|
|
45
|
+
"data-loading": loading.isLoadingVisible ? "" : void 0,
|
|
46
|
+
"aria-busy": loading.isLoading || void 0,
|
|
47
|
+
role: hasTableFeature(table, "activeRowFeature") ? "grid" : "table",
|
|
48
|
+
className: mergeTwClassNames([
|
|
49
|
+
"w-(--data-table-width)",
|
|
50
|
+
"data-[density=compact]:[--data-table-header-height:--spacing(7)]",
|
|
51
|
+
"data-[density=compact]:[--data-table-row-height:--spacing(8)]",
|
|
52
|
+
"data-[density=compact]:[--data-table-cell-padding:--spacing(1.5)]",
|
|
53
|
+
"[--data-table-header-height:--spacing(8)]",
|
|
54
|
+
"[--data-table-row-height:--spacing(10)]",
|
|
55
|
+
"[--data-table-cell-padding:--spacing(2)]",
|
|
56
|
+
"data-[density=comfortable]:[--data-table-header-height:--spacing(10)]",
|
|
57
|
+
"data-[density=comfortable]:[--data-table-row-height:--spacing(12)]",
|
|
58
|
+
"data-[density=comfortable]:[--data-table-cell-padding:--spacing(3)]"
|
|
59
|
+
], className)
|
|
60
|
+
};
|
|
61
|
+
return useRender({
|
|
62
|
+
render,
|
|
63
|
+
ref: [rootRef, ref ?? null],
|
|
64
|
+
defaultTagName: "div",
|
|
65
|
+
props: mergeProps(baseProps, rest)
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
DataTableRoot.displayName = "DataTable.Root";
|
|
69
|
+
//#endregion
|
|
70
|
+
export { DataTableRoot };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=data-table-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-root.js","names":[],"sources":["../../../../src/components/data-table/root/data-table-root.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 { RowDensity } from '../../../features';\nimport type { TableWith } from '../../../types';\nimport { hasTableFeature } from '../../../utils';\nimport { useDataTableLoading } from '../loading/use-data-table-loading';\nimport { useDataTableColumnLayout } from './use-data-table-column-layout';\n\nexport type DataTableRootProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** A tabela do `useTable`. Exige `columnSizingFeature`. */\n table: TableWith<TFeatures, TData, 'columnSizingFeature'>;\n }\n>;\n\n/**\n * O elemento do grid (`role=\"table\"`; com `activeRowFeature`, `role=\"grid\"`, que diz ao leitor\n * de tela que as setas são da tabela). Escreve as variáveis das colunas, que toda\n * `DataTable.Row` lê, e tem a largura exata da soma delas.\n *\n * Declara também a altura das linhas e dos headers e o espaçamento das células, que as partes\n * leem. Com `rowDensityFeature`, marca o grid com `data-density`, e esses valores seguem a\n * densidade; para outros valores, redefina as variáveis pela `className`.\n *\n * Com `loadingFeature`, marca `aria-busy` enquanto carrega e, depois de 200ms, `data-loading`: as\n * células trocam o conteúdo por um skeleton, e o `DataTable.ScrollArea` mostra uma barra sob o\n * cabeçalho. Uma resposta mais rápida que isso não mostra nada.\n *\n * Não rola: para rolar, e para o cabeçalho grudar, ponha-o num `DataTable.ScrollArea` ou em\n * outro contêiner com `overflow`.\n *\n * @example\n * ```tsx\n * <DataTable.ScrollArea>\n * <DataTable.Root table={table} aria-label=\"Clientes\">\n * …\n * </DataTable.Root>\n * </DataTable.ScrollArea>\n * ```\n */\nexport const DataTableRoot = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableRootProps<TFeatures, TData>,\n) => {\n const { table, render, className, ref, ...rest } = props;\n\n const rootRef = useDataTableColumnLayout(table);\n\n /**\n * Re-renderiza só o `Root`, e só quando a densidade muda: as linhas chegam prontas por\n * `children`, e as células mudam de tamanho pelas variáveis, sem render.\n */\n const density = useSelector(table.store, (): RowDensity | undefined =>\n hasTableFeature(table, 'rowDensityFeature')\n ? table.atoms.rowDensity.get()\n : undefined,\n );\n\n const loading = useDataTableLoading(table);\n\n const baseProps = {\n 'data-component': 'DataTable.Root',\n 'data-density': density,\n 'data-loading': loading.isLoadingVisible ? '' : undefined,\n // Avisa o leitor de tela que o conteúdo está mudando, e que deve esperar para ler.\n 'aria-busy': loading.isLoading || undefined,\n role: hasTableFeature(table, 'activeRowFeature') ? 'grid' : 'table',\n className: mergeTwClassNames(\n [\n // Largura definida, e não `max-content`: com zoom, o px fracionário faria o conteúdo e\n // as larguras das partes se medirem em ciclo, e o cabeçalho e o corpo parariam em\n // larguras diferentes. Antes do primeiro sync, a variável não existe e vale `auto`.\n 'w-(--data-table-width)',\n\n 'data-[density=compact]:[--data-table-header-height:--spacing(7)]',\n 'data-[density=compact]:[--data-table-row-height:--spacing(8)]',\n 'data-[density=compact]:[--data-table-cell-padding:--spacing(1.5)]',\n\n // Densidade: a padrão vale também sem `rowDensityFeature`.\n '[--data-table-header-height:--spacing(8)]',\n '[--data-table-row-height:--spacing(10)]',\n '[--data-table-cell-padding:--spacing(2)]',\n\n 'data-[density=comfortable]:[--data-table-header-height:--spacing(10)]',\n 'data-[density=comfortable]:[--data-table-row-height:--spacing(12)]',\n 'data-[density=comfortable]:[--data-table-cell-padding:--spacing(3)]',\n ],\n className,\n ),\n };\n\n return useRender({\n render,\n ref: [rootRef, ref ?? null],\n defaultTagName: 'div',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableRoot.displayName = 'DataTable.Root';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAa,iBAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,KAAK,GAAG,SAAS;CAEnD,MAAM,UAAU,yBAAyB,KAAK;;;;;CAM9C,MAAM,UAAU,YAAY,MAAM,aAChC,gBAAgB,OAAO,mBAAmB,IACtC,MAAM,MAAM,WAAW,IAAI,IAC3B,KAAA,CACN;CAEA,MAAM,UAAU,oBAAoB,KAAK;CAEzC,MAAM,YAAY;EAChB,kBAAkB;EAClB,gBAAgB;EAChB,gBAAgB,QAAQ,mBAAmB,KAAK,KAAA;EAEhD,aAAa,QAAQ,aAAa,KAAA;EAClC,MAAM,gBAAgB,OAAO,kBAAkB,IAAI,SAAS;EAC5D,WAAW,kBACT;GAIE;GAEA;GACA;GACA;GAGA;GACA;GACA;GAEA;GACA;GACA;EACF,GACA,SACF;CACF;CAEA,OAAO,UAAU;EACf;EACA,KAAK,CAAC,SAAS,OAAO,IAAI;EAC1B,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,cAAc,cAAc"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ScrollArea } from "@lucasbernardosn/react-ui/layout/scroll-area";
|
|
2
|
+
//#region src/components/data-table/root/data-table-scroll-area.d.ts
|
|
3
|
+
export type DataTableScrollAreaProps = ScrollArea.RootProps;
|
|
4
|
+
/**
|
|
5
|
+
* A área de rolagem da tabela, montada com o `ScrollArea` da lib: `Root`, uma moldura com a
|
|
6
|
+
* borda, `Viewport`, `Content` e as barras. Os filhos vão no `Content`, e as props no `Root`.
|
|
7
|
+
*
|
|
8
|
+
* O viewport é o ancestral que rola, e é nele que o cabeçalho sticky se ancora. Na largura,
|
|
9
|
+
* abraça o grid e para no pai. Na altura, tem a das linhas: dentro de um pai com altura
|
|
10
|
+
* limitada, encolhe e as linhas rolam por dentro; sem limite, cresce e só rola na horizontal.
|
|
11
|
+
*
|
|
12
|
+
* As barras ficam numa faixa fora da moldura, só no eixo que transborda: não passam por cima das
|
|
13
|
+
* linhas, da seleção nem das colunas fixadas. A vertical começa abaixo do `DataTable.Header`,
|
|
14
|
+
* cuja altura é medida aqui.
|
|
15
|
+
*/
|
|
16
|
+
export declare const DataTableScrollArea: {
|
|
17
|
+
(props: DataTableScrollAreaProps): import("react").JSX.Element;
|
|
18
|
+
displayName: string;
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
//# sourceMappingURL=data-table-scroll-area.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-scroll-area.d.ts","names":[],"sources":["../../../../src/components/data-table/root/data-table-scroll-area.tsx"],"mappings":";;YASY,2BAA2B,WAAW;;;;;;;;;;;;;qBAcrC;GAA8B,OAAA,2CAAwB,IAAA"}
|