@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,46 @@
|
|
|
1
|
+
import { hasColumnFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
//#region src/components/data-table/root/get-data-table-column-pinning.ts
|
|
3
|
+
/**
|
|
4
|
+
* A fixação de uma coluna. Sem `columnPinningFeature`, a coluna não está fixada.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* // Com `columnPinning: { start: ['select', 'name'], end: [] }`:
|
|
9
|
+
* getDataTableColumnPinning(table.getColumn('name'));
|
|
10
|
+
* // → { position: 'start', index: 1 }
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
const getDataTableColumnPinning = (column) => hasColumnFeature(column, "columnPinningFeature") ? {
|
|
14
|
+
position: column.getIsPinned(),
|
|
15
|
+
index: column.getPinnedIndex()
|
|
16
|
+
} : {
|
|
17
|
+
position: false,
|
|
18
|
+
index: 0
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* O nome da variável com o deslocamento de uma coluna fixada: o `DataTable.Root` escreve, e a
|
|
22
|
+
* célula e o header da coluna leem. Os dois lados usam o mesmo índice, o da fixação, e batem
|
|
23
|
+
* mesmo com uma coluna fixada escondida.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* getDataTablePinnedOffsetVariable('start', 1);
|
|
28
|
+
* // → '--data-table-pin-start-1'
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
const getDataTablePinnedOffsetVariable = (position, index) => `--data-table-pin-${position}-${index}`;
|
|
32
|
+
/**
|
|
33
|
+
* O estilo de uma célula fixada: o deslocamento do lado dela, pela variável que o
|
|
34
|
+
* `DataTable.Root` escreve. Fora da fixação, nenhum.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* getDataTablePinnedStyle({ position: 'start', index: 1 });
|
|
39
|
+
* // → { insetInlineStart: 'var(--data-table-pin-start-1)' }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
const getDataTablePinnedStyle = (pinning) => pinning.position === "start" ? { insetInlineStart: `var(${getDataTablePinnedOffsetVariable("start", pinning.index)})` } : pinning.position === "end" ? { insetInlineEnd: `var(${getDataTablePinnedOffsetVariable("end", pinning.index)})` } : void 0;
|
|
43
|
+
//#endregion
|
|
44
|
+
export { getDataTableColumnPinning, getDataTablePinnedOffsetVariable, getDataTablePinnedStyle };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=get-data-table-column-pinning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-data-table-column-pinning.js","names":[],"sources":["../../../../src/components/data-table/root/get-data-table-column-pinning.ts"],"sourcesContent":["import type {\n Column,\n ColumnPinningPosition,\n RowData,\n TableFeatures,\n} from '@tanstack/react-table';\nimport type React from 'react';\nimport { hasColumnFeature } from '../../../utils';\n\n/** Onde uma coluna está fixada, e a posição dela entre as fixadas do mesmo lado. */\nexport type DataTableColumnPinning = {\n /** O lado da fixação, ou `false` fora dela. */\n position: ColumnPinningPosition;\n /** O `column.getPinnedIndex()`: a posição no estado do pinning, que conta as escondidas. */\n index: number;\n};\n\n/**\n * A fixação de uma coluna. Sem `columnPinningFeature`, a coluna não está fixada.\n *\n * @example\n * ```ts\n * // Com `columnPinning: { start: ['select', 'name'], end: [] }`:\n * getDataTableColumnPinning(table.getColumn('name'));\n * // → { position: 'start', index: 1 }\n * ```\n */\nexport const getDataTableColumnPinning = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue,\n>(\n column: Column<TFeatures, TData, TValue>,\n): DataTableColumnPinning =>\n hasColumnFeature(column, 'columnPinningFeature')\n ? { position: column.getIsPinned(), index: column.getPinnedIndex() }\n : { position: false, index: 0 };\n\n/**\n * O nome da variável com o deslocamento de uma coluna fixada: o `DataTable.Root` escreve, e a\n * célula e o header da coluna leem. Os dois lados usam o mesmo índice, o da fixação, e batem\n * mesmo com uma coluna fixada escondida.\n *\n * @example\n * ```ts\n * getDataTablePinnedOffsetVariable('start', 1);\n * // → '--data-table-pin-start-1'\n * ```\n */\nexport const getDataTablePinnedOffsetVariable = (\n position: 'start' | 'end',\n index: number,\n) => `--data-table-pin-${position}-${index}`;\n\n/**\n * O estilo de uma célula fixada: o deslocamento do lado dela, pela variável que o\n * `DataTable.Root` escreve. Fora da fixação, nenhum.\n *\n * @example\n * ```ts\n * getDataTablePinnedStyle({ position: 'start', index: 1 });\n * // → { insetInlineStart: 'var(--data-table-pin-start-1)' }\n * ```\n */\nexport const getDataTablePinnedStyle = (\n pinning: DataTableColumnPinning,\n): React.CSSProperties | undefined =>\n pinning.position === 'start'\n ? {\n insetInlineStart: `var(${getDataTablePinnedOffsetVariable('start', pinning.index)})`,\n }\n : pinning.position === 'end'\n ? {\n insetInlineEnd: `var(${getDataTablePinnedOffsetVariable('end', pinning.index)})`,\n }\n : undefined;\n"],"mappings":";;;;;;;;;;;;AA2BA,MAAa,6BAKX,WAEA,iBAAiB,QAAQ,sBAAsB,IAC3C;CAAE,UAAU,OAAO,YAAY;CAAG,OAAO,OAAO,eAAe;AAAE,IACjE;CAAE,UAAU;CAAO,OAAO;AAAE;;;;;;;;;;;;AAalC,MAAa,oCACX,UACA,UACG,oBAAoB,SAAS,GAAG;;;;;;;;;;;AAYrC,MAAa,2BACX,YAEA,QAAQ,aAAa,UACjB,EACE,kBAAkB,OAAO,iCAAiC,SAAS,QAAQ,KAAK,EAAE,GACpF,IACA,QAAQ,aAAa,QACnB,EACE,gBAAgB,OAAO,iCAAiC,OAAO,QAAQ,KAAK,EAAE,GAChF,IACA,KAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/components/data-table/root/get-data-table-scroll-parent.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* O ancestral que rola a tabela. A `DataTable.ScrollArea` põe nele o `scroll-padding-top` com a
|
|
4
|
+
* altura do cabeçalho.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* getDataTableScrollParent(bodyElement)?.scrollTo({ top: 0 });
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export declare const getDataTableScrollParent: (element: Element) => HTMLElement | undefined;
|
|
12
|
+
//#endregion
|
|
13
|
+
//# sourceMappingURL=get-data-table-scroll-parent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-data-table-scroll-parent.d.ts","names":[],"sources":["../../../../src/components/data-table/root/get-data-table-scroll-parent.ts"],"mappings":";;;;;;;;;;qBASa,2BAA4B,SAAS,YAAO"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/components/data-table/root/get-data-table-scroll-parent.ts
|
|
2
|
+
/**
|
|
3
|
+
* O ancestral que rola a tabela. A `DataTable.ScrollArea` põe nele o `scroll-padding-top` com a
|
|
4
|
+
* altura do cabeçalho.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* getDataTableScrollParent(bodyElement)?.scrollTo({ top: 0 });
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
const getDataTableScrollParent = (element) => {
|
|
12
|
+
for (let parent = element.parentElement; parent; parent = parent.parentElement) {
|
|
13
|
+
const { overflowY } = getComputedStyle(parent);
|
|
14
|
+
if (overflowY === "auto" || overflowY === "scroll") return parent;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
export { getDataTableScrollParent };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=get-data-table-scroll-parent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-data-table-scroll-parent.js","names":[],"sources":["../../../../src/components/data-table/root/get-data-table-scroll-parent.ts"],"sourcesContent":["/**\n * O ancestral que rola a tabela. A `DataTable.ScrollArea` põe nele o `scroll-padding-top` com a\n * altura do cabeçalho.\n *\n * @example\n * ```ts\n * getDataTableScrollParent(bodyElement)?.scrollTo({ top: 0 });\n * ```\n */\nexport const getDataTableScrollParent = (element: Element) => {\n for (\n let parent = element.parentElement;\n parent;\n parent = parent.parentElement\n ) {\n const { overflowY } = getComputedStyle(parent);\n\n if (overflowY === 'auto' || overflowY === 'scroll') {\n return parent;\n }\n }\n\n return undefined;\n};\n"],"mappings":";;;;;;;;;;AASA,MAAa,4BAA4B,YAAqB;CAC5D,KACE,IAAI,SAAS,QAAQ,eACrB,QACA,SAAS,OAAO,eAChB;EACA,MAAM,EAAE,cAAc,iBAAiB,MAAM;EAE7C,IAAI,cAAc,UAAU,cAAc,UACxC,OAAO;CAEX;AAGF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
//#region src/components/data-table/root/use-data-table-column-layout.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Sincroniza o layout das colunas com o elemento do grid, nas variáveis que as partes leem:
|
|
7
|
+
*
|
|
8
|
+
* - `--data-table-template`: a largura de cada coluna visível, em px, na ordem das células;
|
|
9
|
+
* - `--data-table-width`: a soma delas;
|
|
10
|
+
* - `--data-table-pin-<lado>-<n>`: o deslocamento de cada coluna fixada, que a célula dela lê.
|
|
11
|
+
*
|
|
12
|
+
* Escreve também o `scroll-padding` lateral do contêiner que rola, com a largura das fixadas de
|
|
13
|
+
* cada lado: o foco que vai para um elemento coberto por uma fixada (o Tab no cabeçalho, um
|
|
14
|
+
* controle numa célula) rola até ele.
|
|
15
|
+
*
|
|
16
|
+
* Assina o store da tabela, fora do React: quando tamanho, visibilidade, ordem ou pinning das
|
|
17
|
+
* colunas mudam, só as variáveis mudam, sem render. A cada render do `Root` também sincroniza,
|
|
18
|
+
* para `columns` novos, que não passam pelo store. Nos dois casos, só toca no estilo se o layout
|
|
19
|
+
* mudou, e tira a variável de uma coluna que deixou de ser fixada.
|
|
20
|
+
*
|
|
21
|
+
* Devolve o callback ref do elemento do grid.
|
|
22
|
+
*/
|
|
23
|
+
export declare const useDataTableColumnLayout: <TFeatures extends TableFeatures, TData extends RowData>(table: TableWith<TFeatures, TData, "columnSizingFeature">) => (element: HTMLDivElement | null) => void;
|
|
24
|
+
//#endregion
|
|
25
|
+
//# sourceMappingURL=use-data-table-column-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-column-layout.d.ts","names":[],"sources":["../../../../src/components/data-table/root/use-data-table-column-layout.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;qBAwBa,2BACX,kBAAkB,eAClB,cAAc,SAEd,OAAO,UAAU,WAAW,mCAA6B,SA8E7C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { getDataTableScrollParent } from "./get-data-table-scroll-parent.js";
|
|
2
|
+
import { getDataTableColumnLayout } from "./get-data-table-column-layout.js";
|
|
3
|
+
import { useCallback, useLayoutEffect, useRef } from "react";
|
|
4
|
+
//#region src/components/data-table/root/use-data-table-column-layout.ts
|
|
5
|
+
/**
|
|
6
|
+
* Sincroniza o layout das colunas com o elemento do grid, nas variáveis que as partes leem:
|
|
7
|
+
*
|
|
8
|
+
* - `--data-table-template`: a largura de cada coluna visível, em px, na ordem das células;
|
|
9
|
+
* - `--data-table-width`: a soma delas;
|
|
10
|
+
* - `--data-table-pin-<lado>-<n>`: o deslocamento de cada coluna fixada, que a célula dela lê.
|
|
11
|
+
*
|
|
12
|
+
* Escreve também o `scroll-padding` lateral do contêiner que rola, com a largura das fixadas de
|
|
13
|
+
* cada lado: o foco que vai para um elemento coberto por uma fixada (o Tab no cabeçalho, um
|
|
14
|
+
* controle numa célula) rola até ele.
|
|
15
|
+
*
|
|
16
|
+
* Assina o store da tabela, fora do React: quando tamanho, visibilidade, ordem ou pinning das
|
|
17
|
+
* colunas mudam, só as variáveis mudam, sem render. A cada render do `Root` também sincroniza,
|
|
18
|
+
* para `columns` novos, que não passam pelo store. Nos dois casos, só toca no estilo se o layout
|
|
19
|
+
* mudou, e tira a variável de uma coluna que deixou de ser fixada.
|
|
20
|
+
*
|
|
21
|
+
* Devolve o callback ref do elemento do grid.
|
|
22
|
+
*/
|
|
23
|
+
const useDataTableColumnLayout = (table) => {
|
|
24
|
+
/**
|
|
25
|
+
* O elemento do grid, ligado pelo callback ref devolvido no fim.
|
|
26
|
+
*/
|
|
27
|
+
const elementRef = useRef(null);
|
|
28
|
+
/**
|
|
29
|
+
* As variáveis aplicadas no elemento atual, pelo nome. O `syncColumnLayout` compara com elas e
|
|
30
|
+
* só toca no estilo do que mudou: a maioria das mudanças do store (seleção, página) não mexe
|
|
31
|
+
* nas colunas.
|
|
32
|
+
*/
|
|
33
|
+
const lastVariablesRef = useRef({});
|
|
34
|
+
/**
|
|
35
|
+
* O contêiner que rola, procurado uma vez ao ligar o elemento: a busca lê o estilo computado dos
|
|
36
|
+
* ancestrais, e a cada tick do arrasto de uma coluna forçaria um recálculo de estilo.
|
|
37
|
+
*/
|
|
38
|
+
const scrollParentRef = useRef(void 0);
|
|
39
|
+
/** O `scroll-padding` lateral aplicado no contêiner, para só tocar no estilo se mudou. */
|
|
40
|
+
const lastScrollPaddingRef = useRef("");
|
|
41
|
+
/**
|
|
42
|
+
* A tabela do último render. O objeto `table` é novo a cada render; lido por ref, ele não entra
|
|
43
|
+
* nas dependências da assinatura, que senão seria desfeita e refeita em todo render.
|
|
44
|
+
*/
|
|
45
|
+
const tableRef = useRef(table);
|
|
46
|
+
/**
|
|
47
|
+
* Calcula o layout e o aplica no elemento, se mudou. Chamado de três lugares: ao ligar um
|
|
48
|
+
* elemento, depois de cada commit e a cada mudança do store. Lê tudo por ref, então a
|
|
49
|
+
* identidade é estável e não refaz o callback ref nem a assinatura.
|
|
50
|
+
*/
|
|
51
|
+
const syncColumnLayout = useCallback(() => {
|
|
52
|
+
const element = elementRef.current;
|
|
53
|
+
if (!element) return;
|
|
54
|
+
const layout = getDataTableColumnLayout(tableRef.current);
|
|
55
|
+
const variables = {
|
|
56
|
+
"--data-table-template": layout.template,
|
|
57
|
+
"--data-table-width": layout.width,
|
|
58
|
+
...layout.offsets
|
|
59
|
+
};
|
|
60
|
+
const lastVariables = lastVariablesRef.current;
|
|
61
|
+
for (const name of Object.keys(lastVariables)) if (!(name in variables)) element.style.removeProperty(name);
|
|
62
|
+
for (const [name, value] of Object.entries(variables)) if (lastVariables[name] !== value) element.style.setProperty(name, value);
|
|
63
|
+
lastVariablesRef.current = variables;
|
|
64
|
+
const scrollParent = scrollParentRef.current;
|
|
65
|
+
const scrollPadding = `${layout.scrollPadding.start} ${layout.scrollPadding.end}`;
|
|
66
|
+
if (scrollParent && lastScrollPaddingRef.current !== scrollPadding) {
|
|
67
|
+
scrollParent.style.scrollPaddingInline = scrollPadding;
|
|
68
|
+
lastScrollPaddingRef.current = scrollPadding;
|
|
69
|
+
}
|
|
70
|
+
}, []);
|
|
71
|
+
/**
|
|
72
|
+
* Um elemento novo (outro `render`, ou um remount só do elemento) nasce sem as variáveis. O que
|
|
73
|
+
* está em `lastVariablesRef` era do anterior: sem descartar, o sync acharia que nada mudou e não
|
|
74
|
+
* aplicaria no novo.
|
|
75
|
+
*/
|
|
76
|
+
const ref = useCallback((element) => {
|
|
77
|
+
elementRef.current = element;
|
|
78
|
+
lastVariablesRef.current = {};
|
|
79
|
+
scrollParentRef.current = element ? getDataTableScrollParent(element) : void 0;
|
|
80
|
+
lastScrollPaddingRef.current = "";
|
|
81
|
+
syncColumnLayout();
|
|
82
|
+
}, [syncColumnLayout]);
|
|
83
|
+
/**
|
|
84
|
+
* Sem dependências: roda depois de todo commit do `Root`. Cobre o que muda as colunas sem passar
|
|
85
|
+
* pelo store, como `columns` novos. Layout effect, e não effect, para o grid nunca pintar com o
|
|
86
|
+
* template antigo.
|
|
87
|
+
*/
|
|
88
|
+
useLayoutEffect(() => {
|
|
89
|
+
tableRef.current = table;
|
|
90
|
+
syncColumnLayout();
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* Tamanho, visibilidade, ordem e pinning mudam pelo store, inclusive a cada tick do arrasto de
|
|
94
|
+
* uma coluna: sincronizar daqui mantém tudo isso fora do React, sem render. O store é estável,
|
|
95
|
+
* então a assinatura vive enquanto o `Root` estiver montado.
|
|
96
|
+
*/
|
|
97
|
+
useLayoutEffect(() => {
|
|
98
|
+
const subscription = table.store.subscribe(syncColumnLayout);
|
|
99
|
+
return () => subscription.unsubscribe();
|
|
100
|
+
}, [table.store, syncColumnLayout]);
|
|
101
|
+
return ref;
|
|
102
|
+
};
|
|
103
|
+
//#endregion
|
|
104
|
+
export { useDataTableColumnLayout };
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=use-data-table-column-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-column-layout.js","names":[],"sources":["../../../../src/components/data-table/root/use-data-table-column-layout.ts"],"sourcesContent":["import type { RowData, TableFeatures } from '@tanstack/react-table';\nimport { useCallback, useLayoutEffect, useRef } from 'react';\nimport type { TableWith } from '../../../types';\nimport { getDataTableColumnLayout } from './get-data-table-column-layout';\nimport { getDataTableScrollParent } from './get-data-table-scroll-parent';\n\n/**\n * Sincroniza o layout das colunas com o elemento do grid, nas variáveis que as partes leem:\n *\n * - `--data-table-template`: a largura de cada coluna visível, em px, na ordem das células;\n * - `--data-table-width`: a soma delas;\n * - `--data-table-pin-<lado>-<n>`: o deslocamento de cada coluna fixada, que a célula dela lê.\n *\n * Escreve também o `scroll-padding` lateral do contêiner que rola, com a largura das fixadas de\n * cada lado: o foco que vai para um elemento coberto por uma fixada (o Tab no cabeçalho, um\n * controle numa célula) rola até ele.\n *\n * Assina o store da tabela, fora do React: quando tamanho, visibilidade, ordem ou pinning das\n * colunas mudam, só as variáveis mudam, sem render. A cada render do `Root` também sincroniza,\n * para `columns` novos, que não passam pelo store. Nos dois casos, só toca no estilo se o layout\n * mudou, e tira a variável de uma coluna que deixou de ser fixada.\n *\n * Devolve o callback ref do elemento do grid.\n */\nexport const useDataTableColumnLayout = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: TableWith<TFeatures, TData, 'columnSizingFeature'>,\n) => {\n /**\n * O elemento do grid, ligado pelo callback ref devolvido no fim.\n */\n const elementRef = useRef<HTMLDivElement | null>(null);\n\n /**\n * As variáveis aplicadas no elemento atual, pelo nome. O `syncColumnLayout` compara com elas e\n * só toca no estilo do que mudou: a maioria das mudanças do store (seleção, página) não mexe\n * nas colunas.\n */\n const lastVariablesRef = useRef<Record<string, string>>({});\n\n /**\n * O contêiner que rola, procurado uma vez ao ligar o elemento: a busca lê o estilo computado dos\n * ancestrais, e a cada tick do arrasto de uma coluna forçaria um recálculo de estilo.\n */\n const scrollParentRef = useRef<HTMLElement | undefined>(undefined);\n\n /** O `scroll-padding` lateral aplicado no contêiner, para só tocar no estilo se mudou. */\n const lastScrollPaddingRef = useRef('');\n\n /**\n * A tabela do último render. O objeto `table` é novo a cada render; lido por ref, ele não entra\n * nas dependências da assinatura, que senão seria desfeita e refeita em todo render.\n */\n const tableRef = useRef(table);\n\n /**\n * Calcula o layout e o aplica no elemento, se mudou. Chamado de três lugares: ao ligar um\n * elemento, depois de cada commit e a cada mudança do store. Lê tudo por ref, então a\n * identidade é estável e não refaz o callback ref nem a assinatura.\n */\n const syncColumnLayout = useCallback(() => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n const layout = getDataTableColumnLayout(tableRef.current);\n const variables: Record<string, string> = {\n '--data-table-template': layout.template,\n '--data-table-width': layout.width,\n ...layout.offsets,\n };\n const lastVariables = lastVariablesRef.current;\n\n for (const name of Object.keys(lastVariables)) {\n if (!(name in variables)) {\n element.style.removeProperty(name);\n }\n }\n\n for (const [name, value] of Object.entries(variables)) {\n if (lastVariables[name] !== value) {\n element.style.setProperty(name, value);\n }\n }\n\n lastVariablesRef.current = variables;\n\n const scrollParent = scrollParentRef.current;\n const scrollPadding = `${layout.scrollPadding.start} ${layout.scrollPadding.end}`;\n\n if (scrollParent && lastScrollPaddingRef.current !== scrollPadding) {\n scrollParent.style.scrollPaddingInline = scrollPadding;\n lastScrollPaddingRef.current = scrollPadding;\n }\n }, []);\n\n /**\n * Um elemento novo (outro `render`, ou um remount só do elemento) nasce sem as variáveis. O que\n * está em `lastVariablesRef` era do anterior: sem descartar, o sync acharia que nada mudou e não\n * aplicaria no novo.\n */\n const ref = useCallback(\n (element: HTMLDivElement | null) => {\n elementRef.current = element;\n lastVariablesRef.current = {};\n scrollParentRef.current = element\n ? getDataTableScrollParent(element)\n : undefined;\n lastScrollPaddingRef.current = '';\n\n syncColumnLayout();\n },\n [syncColumnLayout],\n );\n\n /**\n * Sem dependências: roda depois de todo commit do `Root`. Cobre o que muda as colunas sem passar\n * pelo store, como `columns` novos. Layout effect, e não effect, para o grid nunca pintar com o\n * template antigo.\n */\n useLayoutEffect(() => {\n tableRef.current = table;\n\n syncColumnLayout();\n });\n\n /**\n * Tamanho, visibilidade, ordem e pinning mudam pelo store, inclusive a cada tick do arrasto de\n * uma coluna: sincronizar daqui mantém tudo isso fora do React, sem render. O store é estável,\n * então a assinatura vive enquanto o `Root` estiver montado.\n */\n useLayoutEffect(() => {\n const subscription = table.store.subscribe(syncColumnLayout);\n\n return () => subscription.unsubscribe();\n }, [table.store, syncColumnLayout]);\n\n return ref;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,4BAIX,UACG;;;;CAIH,MAAM,aAAa,OAA8B,IAAI;;;;;;CAOrD,MAAM,mBAAmB,OAA+B,CAAC,CAAC;;;;;CAM1D,MAAM,kBAAkB,OAAgC,KAAA,CAAS;;CAGjE,MAAM,uBAAuB,OAAO,EAAE;;;;;CAMtC,MAAM,WAAW,OAAO,KAAK;;;;;;CAO7B,MAAM,mBAAmB,kBAAkB;EACzC,MAAM,UAAU,WAAW;EAE3B,IAAI,CAAC,SACH;EAGF,MAAM,SAAS,yBAAyB,SAAS,OAAO;EACxD,MAAM,YAAoC;GACxC,yBAAyB,OAAO;GAChC,sBAAsB,OAAO;GAC7B,GAAG,OAAO;EACZ;EACA,MAAM,gBAAgB,iBAAiB;EAEvC,KAAK,MAAM,QAAQ,OAAO,KAAK,aAAa,GAC1C,IAAI,EAAE,QAAQ,YACZ,QAAQ,MAAM,eAAe,IAAI;EAIrC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,GAClD,IAAI,cAAc,UAAU,OAC1B,QAAQ,MAAM,YAAY,MAAM,KAAK;EAIzC,iBAAiB,UAAU;EAE3B,MAAM,eAAe,gBAAgB;EACrC,MAAM,gBAAgB,GAAG,OAAO,cAAc,MAAM,GAAG,OAAO,cAAc;EAE5E,IAAI,gBAAgB,qBAAqB,YAAY,eAAe;GAClE,aAAa,MAAM,sBAAsB;GACzC,qBAAqB,UAAU;EACjC;CACF,GAAG,CAAC,CAAC;;;;;;CAOL,MAAM,MAAM,aACT,YAAmC;EAClC,WAAW,UAAU;EACrB,iBAAiB,UAAU,CAAC;EAC5B,gBAAgB,UAAU,UACtB,yBAAyB,OAAO,IAChC,KAAA;EACJ,qBAAqB,UAAU;EAE/B,iBAAiB;CACnB,GACA,CAAC,gBAAgB,CACnB;;;;;;CAOA,sBAAsB;EACpB,SAAS,UAAU;EAEnB,iBAAiB;CACnB,CAAC;;;;;;CAOD,sBAAsB;EACpB,MAAM,eAAe,MAAM,MAAM,UAAU,gBAAgB;EAE3D,aAAa,aAAa,YAAY;CACxC,GAAG,CAAC,MAAM,OAAO,gBAAgB,CAAC;CAElC,OAAO;AACT"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/components/data-table/root/use-data-table-header-offset.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Mede a altura do `DataTable.Header` dentro do contêiner e a escreve em
|
|
4
|
+
* `--data-table-header-offset`, no próprio contêiner. A barra de rolagem vertical lê a variável
|
|
5
|
+
* para começar abaixo do cabeçalho, que é sticky e cobriria o começo dela.
|
|
6
|
+
*
|
|
7
|
+
* Mede pelo `ResizeObserver`, fora do React: a altura muda com a densidade e com os níveis de um
|
|
8
|
+
* cabeçalho agrupado, sem render do contêiner. O cabeçalho é procurado quando o contêiner monta;
|
|
9
|
+
* um que monte depois não é medido, e a barra começa no topo.
|
|
10
|
+
*
|
|
11
|
+
* Devolve o callback ref do contêiner.
|
|
12
|
+
*/
|
|
13
|
+
export declare const useDataTableHeaderOffset: () => (element: HTMLElement | null) => void;
|
|
14
|
+
//#endregion
|
|
15
|
+
//# sourceMappingURL=use-data-table-header-offset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-header-offset.d.ts","names":[],"sources":["../../../../src/components/data-table/root/use-data-table-header-offset.ts"],"mappings":";;;;;;;;;;;;qBAgBa,iCAAwB,SAIN"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useCallback, useRef } from "react";
|
|
2
|
+
//#region src/components/data-table/root/use-data-table-header-offset.ts
|
|
3
|
+
/** O cabeçalho da tabela, pelo `data-component` que o `DataTable.Header` põe. */
|
|
4
|
+
const HEADER_SELECTOR = "[data-component=\"DataTable.Header\"]";
|
|
5
|
+
/**
|
|
6
|
+
* Mede a altura do `DataTable.Header` dentro do contêiner e a escreve em
|
|
7
|
+
* `--data-table-header-offset`, no próprio contêiner. A barra de rolagem vertical lê a variável
|
|
8
|
+
* para começar abaixo do cabeçalho, que é sticky e cobriria o começo dela.
|
|
9
|
+
*
|
|
10
|
+
* Mede pelo `ResizeObserver`, fora do React: a altura muda com a densidade e com os níveis de um
|
|
11
|
+
* cabeçalho agrupado, sem render do contêiner. O cabeçalho é procurado quando o contêiner monta;
|
|
12
|
+
* um que monte depois não é medido, e a barra começa no topo.
|
|
13
|
+
*
|
|
14
|
+
* Devolve o callback ref do contêiner.
|
|
15
|
+
*/
|
|
16
|
+
const useDataTableHeaderOffset = () => {
|
|
17
|
+
/** O observer do contêiner atual, desligado quando o elemento sai ou é trocado. */
|
|
18
|
+
const observerRef = useRef(null);
|
|
19
|
+
return useCallback((element) => {
|
|
20
|
+
observerRef.current?.disconnect();
|
|
21
|
+
observerRef.current = null;
|
|
22
|
+
const header = element?.querySelector(HEADER_SELECTOR);
|
|
23
|
+
if (!(element && header)) return;
|
|
24
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
25
|
+
const height = entry?.borderBoxSize[0]?.blockSize ?? 0;
|
|
26
|
+
element.style.setProperty("--data-table-header-offset", `${height}px`);
|
|
27
|
+
});
|
|
28
|
+
observer.observe(header);
|
|
29
|
+
observerRef.current = observer;
|
|
30
|
+
}, []);
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
export { useDataTableHeaderOffset };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=use-data-table-header-offset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-header-offset.js","names":[],"sources":["../../../../src/components/data-table/root/use-data-table-header-offset.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\n/** O cabeçalho da tabela, pelo `data-component` que o `DataTable.Header` põe. */\nconst HEADER_SELECTOR = '[data-component=\"DataTable.Header\"]';\n\n/**\n * Mede a altura do `DataTable.Header` dentro do contêiner e a escreve em\n * `--data-table-header-offset`, no próprio contêiner. A barra de rolagem vertical lê a variável\n * para começar abaixo do cabeçalho, que é sticky e cobriria o começo dela.\n *\n * Mede pelo `ResizeObserver`, fora do React: a altura muda com a densidade e com os níveis de um\n * cabeçalho agrupado, sem render do contêiner. O cabeçalho é procurado quando o contêiner monta;\n * um que monte depois não é medido, e a barra começa no topo.\n *\n * Devolve o callback ref do contêiner.\n */\nexport const useDataTableHeaderOffset = () => {\n /** O observer do contêiner atual, desligado quando o elemento sai ou é trocado. */\n const observerRef = useRef<ResizeObserver | null>(null);\n\n return useCallback((element: HTMLElement | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n\n const header = element?.querySelector(HEADER_SELECTOR);\n\n if (!(element && header)) {\n return;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n const height = entry?.borderBoxSize[0]?.blockSize ?? 0;\n\n element.style.setProperty('--data-table-header-offset', `${height}px`);\n });\n\n observer.observe(header);\n observerRef.current = observer;\n }, []);\n};\n"],"mappings":";;;AAGA,MAAM,kBAAkB;;;;;;;;;;;;AAaxB,MAAa,iCAAiC;;CAE5C,MAAM,cAAc,OAA8B,IAAI;CAEtD,OAAO,aAAa,YAAgC;EAClD,YAAY,SAAS,WAAW;EAChC,YAAY,UAAU;EAEtB,MAAM,SAAS,SAAS,cAAc,eAAe;EAErD,IAAI,EAAE,WAAW,SACf;EAGF,MAAM,WAAW,IAAI,gBAAgB,CAAC,WAAW;GAC/C,MAAM,SAAS,OAAO,cAAc,EAAE,EAAE,aAAa;GAErD,QAAQ,MAAM,YAAY,8BAA8B,GAAG,OAAO,GAAG;EACvE,CAAC;EAED,SAAS,QAAQ,MAAM;EACvB,YAAY,UAAU;CACxB,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RowWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { Checkbox } from "@lucasbernardosn/react-ui/fields/checkbox";
|
|
5
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
6
|
+
//#region src/components/data-table/selection/data-table-row-checkbox.d.ts
|
|
7
|
+
export type DataTableRowCheckboxProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<Omit<Checkbox.RootProps, 'checked' | 'defaultChecked' | 'indeterminate' | 'onCheckedChange'>, {
|
|
8
|
+
/** A linha. Exige `rowSelectionFeature`. */
|
|
9
|
+
row: RowWith<TFeatures, TData, 'rowSelectionFeature'>;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* O checkbox de seleção de uma linha, para a célula de uma coluna de seleção. Shift+clique
|
|
13
|
+
* seleciona o intervalo desde a última linha marcada (`enableRowRangeSelection: false` desliga).
|
|
14
|
+
* Numa linha que não seleciona (`enableRowSelection`), fica desabilitado; com sub-linhas em parte
|
|
15
|
+
* selecionadas, mostra o estado misto.
|
|
16
|
+
*
|
|
17
|
+
* A seleção guarda só os ids das linhas (`{ [rowId]: true }`) e sobrevive à troca de página: com
|
|
18
|
+
* a paginação pela API, os ids de outras páginas ficam no estado, e a linha volta marcada quando
|
|
19
|
+
* a página volta. Para isso, a tabela precisa do `getRowId` com o id do registro: sem ele, o id é
|
|
20
|
+
* a posição na página, que se repete em todas, e marcar a primeira linha de uma marcaria a
|
|
21
|
+
* primeira de todas. Os dados das linhas de outras páginas não estão na tabela
|
|
22
|
+
* (`getSelectedRowModel()` só traz as carregadas): para agir sobre a seleção, mande os ids à API
|
|
23
|
+
* e limpe com `table.resetRowSelection()` depois.
|
|
24
|
+
*
|
|
25
|
+
* Assina só a seleção. As props do `Checkbox.Root` passam adiante, como `colorScheme` e
|
|
26
|
+
* `aria-label`.
|
|
27
|
+
*/
|
|
28
|
+
export declare const DataTableRowCheckbox: {
|
|
29
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableRowCheckboxProps<TFeatures, TData>): import("react").JSX.Element;
|
|
30
|
+
displayName: string;
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
//# sourceMappingURL=data-table-row-checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-row-checkbox.d.ts","names":[],"sources":["../../../../src/components/data-table/selection/data-table-row-checkbox.tsx"],"mappings":";;;;;;YAOY,0BACV,kBAAkB,eAClB,cAAc,WACZ,cACF,KACE,SAAS;;EAKT,KAAK,QAAQ,WAAW;;;;;;;;;;;;;;;;;;;qBAqBf;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,0BAA0B,WAAW,yBAAM,IAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { hasRowFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useSelector } from "@tanstack/react-store";
|
|
4
|
+
import { Checkbox } from "@lucasbernardosn/react-ui/fields/checkbox";
|
|
5
|
+
//#region src/components/data-table/selection/data-table-row-checkbox.tsx
|
|
6
|
+
/**
|
|
7
|
+
* O checkbox de seleção de uma linha, para a célula de uma coluna de seleção. Shift+clique
|
|
8
|
+
* seleciona o intervalo desde a última linha marcada (`enableRowRangeSelection: false` desliga).
|
|
9
|
+
* Numa linha que não seleciona (`enableRowSelection`), fica desabilitado; com sub-linhas em parte
|
|
10
|
+
* selecionadas, mostra o estado misto.
|
|
11
|
+
*
|
|
12
|
+
* A seleção guarda só os ids das linhas (`{ [rowId]: true }`) e sobrevive à troca de página: com
|
|
13
|
+
* a paginação pela API, os ids de outras páginas ficam no estado, e a linha volta marcada quando
|
|
14
|
+
* a página volta. Para isso, a tabela precisa do `getRowId` com o id do registro: sem ele, o id é
|
|
15
|
+
* a posição na página, que se repete em todas, e marcar a primeira linha de uma marcaria a
|
|
16
|
+
* primeira de todas. Os dados das linhas de outras páginas não estão na tabela
|
|
17
|
+
* (`getSelectedRowModel()` só traz as carregadas): para agir sobre a seleção, mande os ids à API
|
|
18
|
+
* e limpe com `table.resetRowSelection()` depois.
|
|
19
|
+
*
|
|
20
|
+
* Assina só a seleção. As props do `Checkbox.Root` passam adiante, como `colorScheme` e
|
|
21
|
+
* `aria-label`.
|
|
22
|
+
*/
|
|
23
|
+
const DataTableRowCheckbox = (props) => {
|
|
24
|
+
const { row, children, ...rest } = props;
|
|
25
|
+
/**
|
|
26
|
+
* O estado do checkbox num valor só, para uma assinatura por linha. Re-renderiza quando muda a
|
|
27
|
+
* seleção desta linha ou das sub-linhas; as sub-linhas mudam com os dados, que já trazem uma
|
|
28
|
+
* linha nova por prop.
|
|
29
|
+
*/
|
|
30
|
+
const checkedState = useSelector(row.table.atoms.rowSelection, () => row.getIsSelected() ? "checked" : row.getIsSomeSelected() ? "indeterminate" : "unchecked");
|
|
31
|
+
return /* @__PURE__ */ jsx(Checkbox.Root, {
|
|
32
|
+
"data-component": "DataTable.RowCheckbox",
|
|
33
|
+
"aria-label": "Selecionar linha",
|
|
34
|
+
checked: checkedState === "checked",
|
|
35
|
+
indeterminate: checkedState === "indeterminate",
|
|
36
|
+
disabled: !row.getCanSelect(),
|
|
37
|
+
tabIndex: hasRowFeature(row, "activeRowFeature") ? -1 : void 0,
|
|
38
|
+
onCheckedChange: (checked, eventDetails) => row.getToggleSelectedHandler()({
|
|
39
|
+
target: { checked },
|
|
40
|
+
nativeEvent: eventDetails.event
|
|
41
|
+
}),
|
|
42
|
+
...rest,
|
|
43
|
+
children: children === void 0 ? /* @__PURE__ */ jsx(Checkbox.Indicator, {}) : children
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
DataTableRowCheckbox.displayName = "DataTable.RowCheckbox";
|
|
47
|
+
//#endregion
|
|
48
|
+
export { DataTableRowCheckbox };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=data-table-row-checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-row-checkbox.js","names":[],"sources":["../../../../src/components/data-table/selection/data-table-row-checkbox.tsx"],"sourcesContent":["import { Checkbox } from '@lucasbernardosn/react-ui/fields/checkbox';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type { RowWith } from '../../../types';\nimport { hasRowFeature } from '../../../utils';\n\nexport type DataTableRowCheckboxProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n Omit<\n Checkbox.RootProps,\n 'checked' | 'defaultChecked' | 'indeterminate' | 'onCheckedChange'\n >,\n {\n /** A linha. Exige `rowSelectionFeature`. */\n row: RowWith<TFeatures, TData, 'rowSelectionFeature'>;\n }\n>;\n\n/**\n * O checkbox de seleção de uma linha, para a célula de uma coluna de seleção. Shift+clique\n * seleciona o intervalo desde a última linha marcada (`enableRowRangeSelection: false` desliga).\n * Numa linha que não seleciona (`enableRowSelection`), fica desabilitado; com sub-linhas em parte\n * selecionadas, mostra o estado misto.\n *\n * A seleção guarda só os ids das linhas (`{ [rowId]: true }`) e sobrevive à troca de página: com\n * a paginação pela API, os ids de outras páginas ficam no estado, e a linha volta marcada quando\n * a página volta. Para isso, a tabela precisa do `getRowId` com o id do registro: sem ele, o id é\n * a posição na página, que se repete em todas, e marcar a primeira linha de uma marcaria a\n * primeira de todas. Os dados das linhas de outras páginas não estão na tabela\n * (`getSelectedRowModel()` só traz as carregadas): para agir sobre a seleção, mande os ids à API\n * e limpe com `table.resetRowSelection()` depois.\n *\n * Assina só a seleção. As props do `Checkbox.Root` passam adiante, como `colorScheme` e\n * `aria-label`.\n */\nexport const DataTableRowCheckbox = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableRowCheckboxProps<TFeatures, TData>,\n) => {\n const { row, children, ...rest } = props;\n\n /**\n * O estado do checkbox num valor só, para uma assinatura por linha. Re-renderiza quando muda a\n * seleção desta linha ou das sub-linhas; as sub-linhas mudam com os dados, que já trazem uma\n * linha nova por prop.\n */\n const checkedState = useSelector(row.table.atoms.rowSelection, () =>\n row.getIsSelected()\n ? 'checked'\n : row.getIsSomeSelected()\n ? 'indeterminate'\n : 'unchecked',\n );\n\n return (\n <Checkbox.Root\n data-component=\"DataTable.RowCheckbox\"\n aria-label=\"Selecionar linha\"\n checked={checkedState === 'checked'}\n indeterminate={checkedState === 'indeterminate'}\n disabled={!row.getCanSelect()}\n // Com a navegação, a tabela tem um ponto de Tab só, a linha ativa, e o Espaço nela alterna\n // a seleção. O clique continua.\n tabIndex={hasRowFeature(row, 'activeRowFeature') ? -1 : undefined}\n // O handler lê `target.checked` e o Shift do evento; o Base UI entrega os dois separados.\n onCheckedChange={(checked, eventDetails) =>\n row.getToggleSelectedHandler()({\n target: { checked },\n nativeEvent: eventDetails.event,\n })\n }\n {...rest}\n >\n {children === undefined ? <Checkbox.Indicator /> : children}\n </Checkbox.Root>\n );\n};\n\nDataTableRowCheckbox.displayName = 'DataTable.RowCheckbox';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAsCA,MAAa,wBAIX,UACG;CACH,MAAM,EAAE,KAAK,UAAU,GAAG,SAAS;;;;;;CAOnC,MAAM,eAAe,YAAY,IAAI,MAAM,MAAM,oBAC/C,IAAI,cAAc,IACd,YACA,IAAI,kBAAkB,IACpB,kBACA,WACR;CAEA,OACE,oBAAC,SAAS,MAAV;EACE,kBAAe;EACf,cAAW;EACX,SAAS,iBAAiB;EAC1B,eAAe,iBAAiB;EAChC,UAAU,CAAC,IAAI,aAAa;EAG5B,UAAU,cAAc,KAAK,kBAAkB,IAAI,KAAK,KAAA;EAExD,kBAAkB,SAAS,iBACzB,IAAI,yBAAyB,CAAC,CAAC;GAC7B,QAAQ,EAAE,QAAQ;GAClB,aAAa,aAAa;EAC5B,CAAC;EAEH,GAAI;EAEH,UAAA,aAAa,KAAA,IAAY,oBAAC,SAAS,WAAV,CAAqB,CAAA,IAAI;CACtC,CAAA;AAEnB;AAEA,qBAAqB,cAAc"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { Checkbox } from "@lucasbernardosn/react-ui/fields/checkbox";
|
|
5
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
6
|
+
//#region src/components/data-table/selection/data-table-select-all-checkbox.d.ts
|
|
7
|
+
export type DataTableSelectAllCheckboxProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<Omit<Checkbox.RootProps, 'checked' | 'defaultChecked' | 'indeterminate' | 'onCheckedChange'>, {
|
|
8
|
+
/** A tabela. Exige `rowSelectionFeature`. */
|
|
9
|
+
table: TableWith<TFeatures, TData, 'rowSelectionFeature'>;
|
|
10
|
+
/**
|
|
11
|
+
* O que o checkbox marca e mede: as linhas da página ou todas as linhas da tabela. Com
|
|
12
|
+
* paginação, a página: o checkbox fica no cabeçalho da página à vista, e marcar linhas
|
|
13
|
+
* escondidas em outras surpreende. Com a paginação pela API (`manualPagination`), a tabela só
|
|
14
|
+
* tem a página carregada, e `'all'` contaria os ids selecionados em outras páginas.
|
|
15
|
+
* @default 'page' com `rowPaginationFeature`, 'all' sem
|
|
16
|
+
*/
|
|
17
|
+
scope?: 'page' | 'all';
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* O checkbox que marca ou desmarca todas as linhas, para o header de uma coluna de seleção. Com
|
|
21
|
+
* parte das linhas marcadas, mostra o estado misto; o clique então marca todas. Com
|
|
22
|
+
* `loadingFeature`, fica desabilitado enquanto a tabela carrega.
|
|
23
|
+
*
|
|
24
|
+
* As props do `Checkbox.Root` passam adiante, como `colorScheme` e `aria-label`.
|
|
25
|
+
*/
|
|
26
|
+
export declare const DataTableSelectAllCheckbox: {
|
|
27
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableSelectAllCheckboxProps<TFeatures, TData>): import("react").JSX.Element;
|
|
28
|
+
displayName: string;
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
//# sourceMappingURL=data-table-select-all-checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-select-all-checkbox.d.ts","names":[],"sources":["../../../../src/components/data-table/selection/data-table-select-all-checkbox.tsx"],"mappings":";;;;;;YAOY,gCACV,kBAAkB,eAClB,cAAc,WACZ,cACF,KACE,SAAS;;EAKT,OAAO,UAAU,WAAW;;;;;;;;EAQ5B;;;;;;;;;qBAWS;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,gCAAgC,WAAW,yBAAM,IAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { hasTableFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useSelector } from "@tanstack/react-store";
|
|
4
|
+
import { Checkbox } from "@lucasbernardosn/react-ui/fields/checkbox";
|
|
5
|
+
//#region src/components/data-table/selection/data-table-select-all-checkbox.tsx
|
|
6
|
+
/**
|
|
7
|
+
* O checkbox que marca ou desmarca todas as linhas, para o header de uma coluna de seleção. Com
|
|
8
|
+
* parte das linhas marcadas, mostra o estado misto; o clique então marca todas. Com
|
|
9
|
+
* `loadingFeature`, fica desabilitado enquanto a tabela carrega.
|
|
10
|
+
*
|
|
11
|
+
* As props do `Checkbox.Root` passam adiante, como `colorScheme` e `aria-label`.
|
|
12
|
+
*/
|
|
13
|
+
const DataTableSelectAllCheckbox = (props) => {
|
|
14
|
+
const { table, scope, children, ...rest } = props;
|
|
15
|
+
const isPageScope = scope === void 0 ? hasTableFeature(table, "rowPaginationFeature") : scope === "page";
|
|
16
|
+
/**
|
|
17
|
+
* O estado do checkbox num valor só. Re-renderiza quando ele muda. O store, e não só o atom da
|
|
18
|
+
* seleção: o resultado também muda com as linhas, como na troca de página ou de dados.
|
|
19
|
+
*/
|
|
20
|
+
const checkedState = useSelector(table.store, () => {
|
|
21
|
+
if (isPageScope) return table.getIsAllPageRowsSelected() ? "checked" : table.getIsSomePageRowsSelected() ? "indeterminate" : "unchecked";
|
|
22
|
+
return table.getIsAllRowsSelected() ? "checked" : table.getIsSomeRowsSelected() ? "indeterminate" : "unchecked";
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* Re-renderiza quando o carregamento liga ou desliga. A feature é opcional: assina o store. Na
|
|
26
|
+
* hora, e não depois dos 200ms do visual, para não sobrar uma janela em que o clique passa.
|
|
27
|
+
*/
|
|
28
|
+
const isLoading = useSelector(table.store, () => hasTableFeature(table, "loadingFeature") && table.atoms.isLoading.get());
|
|
29
|
+
return /* @__PURE__ */ jsx(Checkbox.Root, {
|
|
30
|
+
"data-component": "DataTable.SelectAllCheckbox",
|
|
31
|
+
"aria-label": isPageScope ? "Selecionar todas as linhas da página" : "Selecionar todas as linhas",
|
|
32
|
+
checked: checkedState === "checked",
|
|
33
|
+
indeterminate: checkedState === "indeterminate",
|
|
34
|
+
disabled: isLoading,
|
|
35
|
+
onCheckedChange: (checked) => isPageScope ? table.toggleAllPageRowsSelected(checked) : table.toggleAllRowsSelected(checked),
|
|
36
|
+
...rest,
|
|
37
|
+
children: children === void 0 ? /* @__PURE__ */ jsx(Checkbox.Indicator, {}) : children
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
DataTableSelectAllCheckbox.displayName = "DataTable.SelectAllCheckbox";
|
|
41
|
+
//#endregion
|
|
42
|
+
export { DataTableSelectAllCheckbox };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=data-table-select-all-checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-select-all-checkbox.js","names":[],"sources":["../../../../src/components/data-table/selection/data-table-select-all-checkbox.tsx"],"sourcesContent":["import { Checkbox } from '@lucasbernardosn/react-ui/fields/checkbox';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type { TableWith } from '../../../types';\nimport { hasTableFeature } from '../../../utils';\n\nexport type DataTableSelectAllCheckboxProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n Omit<\n Checkbox.RootProps,\n 'checked' | 'defaultChecked' | 'indeterminate' | 'onCheckedChange'\n >,\n {\n /** A tabela. Exige `rowSelectionFeature`. */\n table: TableWith<TFeatures, TData, 'rowSelectionFeature'>;\n /**\n * O que o checkbox marca e mede: as linhas da página ou todas as linhas da tabela. Com\n * paginação, a página: o checkbox fica no cabeçalho da página à vista, e marcar linhas\n * escondidas em outras surpreende. Com a paginação pela API (`manualPagination`), a tabela só\n * tem a página carregada, e `'all'` contaria os ids selecionados em outras páginas.\n * @default 'page' com `rowPaginationFeature`, 'all' sem\n */\n scope?: 'page' | 'all';\n }\n>;\n\n/**\n * O checkbox que marca ou desmarca todas as linhas, para o header de uma coluna de seleção. Com\n * parte das linhas marcadas, mostra o estado misto; o clique então marca todas. Com\n * `loadingFeature`, fica desabilitado enquanto a tabela carrega.\n *\n * As props do `Checkbox.Root` passam adiante, como `colorScheme` e `aria-label`.\n */\nexport const DataTableSelectAllCheckbox = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableSelectAllCheckboxProps<TFeatures, TData>,\n) => {\n const { table, scope, children, ...rest } = props;\n\n const isPageScope =\n scope === undefined\n ? hasTableFeature(table, 'rowPaginationFeature')\n : scope === 'page';\n\n /**\n * O estado do checkbox num valor só. Re-renderiza quando ele muda. O store, e não só o atom da\n * seleção: o resultado também muda com as linhas, como na troca de página ou de dados.\n */\n const checkedState = useSelector(table.store, () => {\n if (isPageScope) {\n return table.getIsAllPageRowsSelected()\n ? 'checked'\n : table.getIsSomePageRowsSelected()\n ? 'indeterminate'\n : 'unchecked';\n }\n\n return table.getIsAllRowsSelected()\n ? 'checked'\n : table.getIsSomeRowsSelected()\n ? 'indeterminate'\n : 'unchecked';\n });\n\n /**\n * Re-renderiza quando o carregamento liga ou desliga. A feature é opcional: assina o store. Na\n * hora, e não depois dos 200ms do visual, para não sobrar uma janela em que o clique passa.\n */\n const isLoading = useSelector(\n table.store,\n () =>\n hasTableFeature(table, 'loadingFeature') && table.atoms.isLoading.get(),\n );\n\n return (\n <Checkbox.Root\n data-component=\"DataTable.SelectAllCheckbox\"\n aria-label={\n isPageScope\n ? 'Selecionar todas as linhas da página'\n : 'Selecionar todas as linhas'\n }\n checked={checkedState === 'checked'}\n indeterminate={checkedState === 'indeterminate'}\n // Durante a carga, as linhas ainda são as antigas: marcar todas marcaria os ids delas.\n disabled={isLoading}\n onCheckedChange={(checked) =>\n isPageScope\n ? table.toggleAllPageRowsSelected(checked)\n : table.toggleAllRowsSelected(checked)\n }\n {...rest}\n >\n {children === undefined ? <Checkbox.Indicator /> : children}\n </Checkbox.Root>\n );\n};\n\nDataTableSelectAllCheckbox.displayName = 'DataTable.SelectAllCheckbox';\n"],"mappings":";;;;;;;;;;;;AAoCA,MAAa,8BAIX,UACG;CACH,MAAM,EAAE,OAAO,OAAO,UAAU,GAAG,SAAS;CAE5C,MAAM,cACJ,UAAU,KAAA,IACN,gBAAgB,OAAO,sBAAsB,IAC7C,UAAU;;;;;CAMhB,MAAM,eAAe,YAAY,MAAM,aAAa;EAClD,IAAI,aACF,OAAO,MAAM,yBAAyB,IAClC,YACA,MAAM,0BAA0B,IAC9B,kBACA;EAGR,OAAO,MAAM,qBAAqB,IAC9B,YACA,MAAM,sBAAsB,IAC1B,kBACA;CACR,CAAC;;;;;CAMD,MAAM,YAAY,YAChB,MAAM,aAEJ,gBAAgB,OAAO,gBAAgB,KAAK,MAAM,MAAM,UAAU,IAAI,CAC1E;CAEA,OACE,oBAAC,SAAS,MAAV;EACE,kBAAe;EACf,cACE,cACI,yCACA;EAEN,SAAS,iBAAiB;EAC1B,eAAe,iBAAiB;EAEhC,UAAU;EACV,kBAAkB,YAChB,cACI,MAAM,0BAA0B,OAAO,IACvC,MAAM,sBAAsB,OAAO;EAEzC,GAAI;EAEH,UAAA,aAAa,KAAA,IAAY,oBAAC,SAAS,WAAV,CAAqB,CAAA,IAAI;CACtC,CAAA;AAEnB;AAEA,2BAA2B,cAAc"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { ActionBar } from "@lucasbernardosn/react-ui/overlays/action-bar";
|
|
6
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
7
|
+
//#region src/components/data-table/selection/data-table-selection-bar.d.ts
|
|
8
|
+
export type DataTableSelectionBarProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<ActionBar.PopupProps, {
|
|
9
|
+
/** A tabela. Exige `rowSelectionFeature`. */
|
|
10
|
+
table: TableWith<TFeatures, TData, 'rowSelectionFeature'>;
|
|
11
|
+
/**
|
|
12
|
+
* As ações da seleção. Recebe os ids das linhas marcadas, inclusive os de outras páginas e os
|
|
13
|
+
* de linhas que não estão carregadas: o app resolve o id para o registro.
|
|
14
|
+
*/
|
|
15
|
+
children?: (selectedIds: string[]) => React.ReactNode;
|
|
16
|
+
/** A posição da barra no rodapé da tela. */
|
|
17
|
+
placement?: ActionBar.RootProps['placement'];
|
|
18
|
+
/**
|
|
19
|
+
* O texto lido pelo leitor de tela no resumo, que limpa a seleção.
|
|
20
|
+
* @default 'Limpar seleção'
|
|
21
|
+
*/
|
|
22
|
+
clearLabel?: string;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* A barra de ações da seleção, fixa no rodapé da tela: aparece com ao menos uma linha marcada e
|
|
26
|
+
* some ao limpar. Monta o `ActionBar` do `ui` e liga à tabela o que é igual em toda lista: a
|
|
27
|
+
* abertura pela contagem, o texto do resumo e a limpeza da seleção.
|
|
28
|
+
*
|
|
29
|
+
* O resumo ("3 selecionadas") é o botão que limpa a seleção, e o Esc também a limpa. As ações são
|
|
30
|
+
* do app: entram como `children`, que recebe os ids marcados. A barra não confirma nada nem sabe
|
|
31
|
+
* o que as ações fazem.
|
|
32
|
+
*
|
|
33
|
+
* Os ids vêm do estado da seleção e valem para toda a tabela, e não só para a página à vista.
|
|
34
|
+
* Quando um filtro muda as linhas, a seleção continua com ids que sumiram da tela: quem filtra
|
|
35
|
+
* decide se a limpa (`table.resetRowSelection()`).
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <DataTable.SelectionBar table={table}>
|
|
40
|
+
* {(selectedIds) => (
|
|
41
|
+
* <Button onClick={() => removeAll(selectedIds)}>Excluir</Button>
|
|
42
|
+
* )}
|
|
43
|
+
* </DataTable.SelectionBar>
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare const DataTableSelectionBar: {
|
|
47
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableSelectionBarProps<TFeatures, TData>): React.JSX.Element;
|
|
48
|
+
displayName: string;
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
//# sourceMappingURL=data-table-selection-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-selection-bar.d.ts","names":[],"sources":["../../../../src/components/data-table/selection/data-table-selection-bar.tsx"],"mappings":";;;;;;;YAQY,2BACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,UAAU,WAAW;;;;;EAK5B,YAAY,0BAA0B,MAAM;;EAE5C,YAAY,UAAU;;;;;EAKtB;;;;;;;;;;;;;;;;;;;;;;;;qBA0BS;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,2BAA2B,WAAW,SAAM,MAAA,IAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { DataTableSelectedCount } from "../pagination/data-table-selected-count.js";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useSelector } from "@tanstack/react-store";
|
|
4
|
+
import { ActionBar } from "@lucasbernardosn/react-ui/overlays/action-bar";
|
|
5
|
+
//#region src/components/data-table/selection/data-table-selection-bar.tsx
|
|
6
|
+
/**
|
|
7
|
+
* A barra de ações da seleção, fixa no rodapé da tela: aparece com ao menos uma linha marcada e
|
|
8
|
+
* some ao limpar. Monta o `ActionBar` do `ui` e liga à tabela o que é igual em toda lista: a
|
|
9
|
+
* abertura pela contagem, o texto do resumo e a limpeza da seleção.
|
|
10
|
+
*
|
|
11
|
+
* O resumo ("3 selecionadas") é o botão que limpa a seleção, e o Esc também a limpa. As ações são
|
|
12
|
+
* do app: entram como `children`, que recebe os ids marcados. A barra não confirma nada nem sabe
|
|
13
|
+
* o que as ações fazem.
|
|
14
|
+
*
|
|
15
|
+
* Os ids vêm do estado da seleção e valem para toda a tabela, e não só para a página à vista.
|
|
16
|
+
* Quando um filtro muda as linhas, a seleção continua com ids que sumiram da tela: quem filtra
|
|
17
|
+
* decide se a limpa (`table.resetRowSelection()`).
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* <DataTable.SelectionBar table={table}>
|
|
22
|
+
* {(selectedIds) => (
|
|
23
|
+
* <Button onClick={() => removeAll(selectedIds)}>Excluir</Button>
|
|
24
|
+
* )}
|
|
25
|
+
* </DataTable.SelectionBar>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
const DataTableSelectionBar = (props) => {
|
|
29
|
+
const { table, children, placement, clearLabel = "Limpar seleção", ...rest } = props;
|
|
30
|
+
/** Os ids marcados: o estado só guarda as linhas marcadas. Re-renderiza quando muda. */
|
|
31
|
+
const selectedIds = useSelector(table.atoms.rowSelection, (rowSelection) => Object.keys(rowSelection));
|
|
32
|
+
return /* @__PURE__ */ jsx(ActionBar.Root, {
|
|
33
|
+
placement,
|
|
34
|
+
open: selectedIds.length > 0,
|
|
35
|
+
onOpenChange: (open) => {
|
|
36
|
+
if (!open) table.resetRowSelection(true);
|
|
37
|
+
},
|
|
38
|
+
children: /* @__PURE__ */ jsx(ActionBar.Portal, { children: /* @__PURE__ */ jsxs(ActionBar.Popup, {
|
|
39
|
+
"data-component": "DataTable.SelectionBar",
|
|
40
|
+
...rest,
|
|
41
|
+
children: [/* @__PURE__ */ jsxs(ActionBar.SelectionTrigger, {
|
|
42
|
+
onClick: () => table.resetRowSelection(true),
|
|
43
|
+
children: [/* @__PURE__ */ jsx(DataTableSelectedCount, {
|
|
44
|
+
table,
|
|
45
|
+
className: "text-gray-12"
|
|
46
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
47
|
+
className: "sr-only",
|
|
48
|
+
children: clearLabel
|
|
49
|
+
})]
|
|
50
|
+
}), children?.(selectedIds)]
|
|
51
|
+
}) })
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
DataTableSelectionBar.displayName = "DataTable.SelectionBar";
|
|
55
|
+
//#endregion
|
|
56
|
+
export { DataTableSelectionBar };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=data-table-selection-bar.js.map
|