@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 @@
|
|
|
1
|
+
{"version":3,"file":"columns-panel-root.d.ts","names":[],"sources":["../../../src/components/columns-panel/columns-panel-root.tsx"],"mappings":";;;;;;;YAgBY,sBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,UACL,WACA;;;;;;EAQF,WACI,MAAM,cACJ,QAAQ,OAAO,WAAW,QAAQ,kBAAkB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA+DvD;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,sBAAsB,WAAW,SAAM,MAAA,IAAA"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { hasColumnFeature, hasTableFeature } from "../../utils/has-feature.js";
|
|
2
|
+
import { ColumnsPanelItem } from "./columns-panel-item.js";
|
|
3
|
+
import { getColumnsPanelColumnOrder } from "./get-columns-panel-column-order.js";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
6
|
+
import { shallow, useSelector } from "@tanstack/react-store";
|
|
7
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
8
|
+
import { Fragment as Fragment$1, useMemo, useRef } from "react";
|
|
9
|
+
import { isSortable } from "@dnd-kit/react/sortable";
|
|
10
|
+
import { RestrictToVerticalAxis } from "@dnd-kit/abstract/modifiers";
|
|
11
|
+
import { RestrictToElement } from "@dnd-kit/dom/modifiers";
|
|
12
|
+
import { DragDropProvider } from "@dnd-kit/react";
|
|
13
|
+
//#region src/components/columns-panel/columns-panel-root.tsx
|
|
14
|
+
/** O nome de cada lista, na ordem das regiões: fixadas no início, centro e fixadas no fim. */
|
|
15
|
+
const GROUP_LABELS = [
|
|
16
|
+
"Colunas fixadas no início",
|
|
17
|
+
"Colunas",
|
|
18
|
+
"Colunas fixadas no fim"
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* A linha entre as listas, só visual (o alfinete já diz quais são fixadas), fica nas das fixadas,
|
|
22
|
+
* do lado do centro, com o respiro. A lista do centro termina no primeiro e no último item: o
|
|
23
|
+
* arrasto fica preso a ela, e com o respiro dentro dela, o item arrastado cobriria a linha.
|
|
24
|
+
*/
|
|
25
|
+
const GROUP_CLASS_NAMES = [
|
|
26
|
+
"mb-1 border-gray-6 border-b pb-1",
|
|
27
|
+
void 0,
|
|
28
|
+
"mt-1 border-gray-6 border-t pt-1"
|
|
29
|
+
];
|
|
30
|
+
/** As pontas sem fixadas: a mesma referência, para a tupla não mudar à toa. */
|
|
31
|
+
const NO_COLUMNS = [];
|
|
32
|
+
/** Se a coluna é de dados, e não de exibição (sem `accessorFn`, como a de seleção). */
|
|
33
|
+
const isDataColumn = (column) => column.accessorFn !== void 0;
|
|
34
|
+
/**
|
|
35
|
+
* A lista das colunas da tabela: marca quais aparecem e arrasta para mudar a ordem. Para um
|
|
36
|
+
* popover ou uma gaveta; a posição, o gatilho e o "restaurar" (`table.resetColumnOrder()`,
|
|
37
|
+
* `table.resetColumnVisibility()`) são do app.
|
|
38
|
+
*
|
|
39
|
+
* Lista as colunas de dados. As de exibição (sem `accessorFn`, como a de seleção e a de ações)
|
|
40
|
+
* ficam fora e no lugar: reordenar só troca as outras entre si. Com `columnPinningFeature`, a
|
|
41
|
+
* tela vira até três listas (fixadas no início, centro e fixadas no fim), e só a do centro se
|
|
42
|
+
* arrasta.
|
|
43
|
+
*
|
|
44
|
+
* O arrasto é pela alça, com o ponteiro ou o teclado (Espaço pega, setas movem, Espaço solta, Esc
|
|
45
|
+
* cancela), e fica preso à lista do centro: não passa por cima das fixadas. O `Root` assina a
|
|
46
|
+
* ordem e o pinning, e cada `ColumnsPanel.Item`, a visibilidade da coluna dele: funciona com o
|
|
47
|
+
* dono da tabela em `() => null`.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* <ColumnsPanel.Root table={table}>
|
|
52
|
+
* {(column, index) => (
|
|
53
|
+
* <ColumnsPanel.Item
|
|
54
|
+
* column={column}
|
|
55
|
+
* index={index}
|
|
56
|
+
* label={labels[column.id]}
|
|
57
|
+
* />
|
|
58
|
+
* )}
|
|
59
|
+
* </ColumnsPanel.Root>
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
const ColumnsPanelRoot = (props) => {
|
|
63
|
+
const { table, render, className, children, ref, ...rest } = props;
|
|
64
|
+
/** A lista do centro, a única que se arrasta: o arrasto fica preso a ela. */
|
|
65
|
+
const centerListRef = useRef(null);
|
|
66
|
+
const groups = useSelector(table.store, () => hasTableFeature(table, "columnPinningFeature") ? [
|
|
67
|
+
table.getStartLeafColumns(),
|
|
68
|
+
table.getCenterLeafColumns(),
|
|
69
|
+
table.getEndLeafColumns()
|
|
70
|
+
] : [
|
|
71
|
+
NO_COLUMNS,
|
|
72
|
+
table.getAllLeafColumns(),
|
|
73
|
+
NO_COLUMNS
|
|
74
|
+
], { compare: shallow }).map((columns) => columns.filter(isDataColumn));
|
|
75
|
+
/** Preso à lista do centro, e só na vertical: fora dela não há destino. */
|
|
76
|
+
const modifiers = useMemo(() => [RestrictToVerticalAxis, RestrictToElement.configure({ element: () => centerListRef.current })], []);
|
|
77
|
+
const handleDragEnd = (event) => {
|
|
78
|
+
if (event.canceled) {
|
|
79
|
+
/** O Esc que cancela o arrasto pelo teclado não segue adiante: fecharia o popover em volta. */
|
|
80
|
+
if (event.nativeEvent instanceof KeyboardEvent && event.nativeEvent.key === "Escape") event.nativeEvent.stopPropagation();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const { source } = event.operation;
|
|
84
|
+
/**
|
|
85
|
+
* A posição final vem do item arrastado, e não do destino: durante o arrasto, a lista já se
|
|
86
|
+
* reordena com o destino mais próximo, e soltar em cima de uma fixada, que não aceita nada,
|
|
87
|
+
* chega sem destino. Sem isso, a lista ficaria na ordem nova e a tabela, na antiga.
|
|
88
|
+
*/
|
|
89
|
+
if (!isSortable(source) || source.initialIndex === source.index) return;
|
|
90
|
+
table.setColumnOrder(getColumnsPanelColumnOrder(table.getAllLeafColumns().map((column) => column.id), (groups[1] ?? []).map((column) => column.id), source.initialIndex, source.index));
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Com render-prop ou sem `children`, o laço é daqui, uma lista por grupo com colunas; com nós
|
|
94
|
+
* comuns, de quem usa.
|
|
95
|
+
*/
|
|
96
|
+
const content = typeof children === "function" || children === void 0 ? groups.map((columns, groupIndex) => columns.length > 0 && /* @__PURE__ */ jsx("ul", {
|
|
97
|
+
ref: groupIndex === 1 ? centerListRef : void 0,
|
|
98
|
+
"aria-label": GROUP_LABELS[groupIndex],
|
|
99
|
+
className: mergeTwClassNames([
|
|
100
|
+
"flex",
|
|
101
|
+
"flex-col",
|
|
102
|
+
"gap-0.5",
|
|
103
|
+
GROUP_CLASS_NAMES[groupIndex]
|
|
104
|
+
]),
|
|
105
|
+
children: columns.map((column, index) => /* @__PURE__ */ jsx(Fragment$1, { children: children === void 0 ? hasColumnFeature(column, "columnVisibilityFeature") && /* @__PURE__ */ jsx(ColumnsPanelItem, {
|
|
106
|
+
column,
|
|
107
|
+
index
|
|
108
|
+
}) : children(column, index) }, column.id))
|
|
109
|
+
}, groupIndex)) : children;
|
|
110
|
+
const element = useRender({
|
|
111
|
+
render,
|
|
112
|
+
ref,
|
|
113
|
+
defaultTagName: "div",
|
|
114
|
+
props: mergeProps({
|
|
115
|
+
"data-component": "ColumnsPanel.Root",
|
|
116
|
+
className: mergeTwClassNames([
|
|
117
|
+
"flex",
|
|
118
|
+
"w-56",
|
|
119
|
+
"flex-col"
|
|
120
|
+
], className),
|
|
121
|
+
children: content
|
|
122
|
+
}, rest)
|
|
123
|
+
});
|
|
124
|
+
return /* @__PURE__ */ jsx(DragDropProvider, {
|
|
125
|
+
modifiers,
|
|
126
|
+
onDragEnd: handleDragEnd,
|
|
127
|
+
children: element
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
ColumnsPanelRoot.displayName = "ColumnsPanel.Root";
|
|
131
|
+
//#endregion
|
|
132
|
+
export { ColumnsPanelRoot };
|
|
133
|
+
|
|
134
|
+
//# sourceMappingURL=columns-panel-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns-panel-root.js","names":["Fragment"],"sources":["../../../src/components/columns-panel/columns-panel-root.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { RestrictToVerticalAxis } from '@dnd-kit/abstract/modifiers';\nimport { RestrictToElement } from '@dnd-kit/dom/modifiers';\nimport { DragDropProvider } from '@dnd-kit/react';\nimport { isSortable } from '@dnd-kit/react/sortable';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { shallow, useSelector } from '@tanstack/react-store';\nimport type { Column, RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { Fragment, useMemo, useRef } from 'react';\nimport type { TableWith } from '../../types';\nimport { hasColumnFeature, hasTableFeature } from '../../utils';\nimport { ColumnsPanelItem } from './columns-panel-item';\nimport { getColumnsPanelColumnOrder } from './get-columns-panel-column-order';\n\nexport type ColumnsPanelRootProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** A tabela. Exige `columnOrderingFeature` e `columnVisibilityFeature`. */\n table: TableWith<\n TFeatures,\n TData,\n 'columnOrderingFeature' | 'columnVisibilityFeature'\n >;\n /**\n * Uma função que recebe cada coluna e a posição dela no grupo e devolve o item. Repasse a\n * posição ao `ColumnsPanel.Item`, que a usa no arrasto. Com nós comuns, quem usa faz o laço.\n * @default (column, index) => <ColumnsPanel.Item column={column} index={index} />\n */\n children?:\n | React.ReactNode\n | ((column: Column<TFeatures, TData>, index: number) => React.ReactNode);\n }\n>;\n\n/** Evento de fim de arrasto, como o `DragDropProvider` o entrega. */\ntype DragEndEvent = Parameters<\n NonNullable<React.ComponentProps<typeof DragDropProvider>['onDragEnd']>\n>[0];\n\n/** O nome de cada lista, na ordem das regiões: fixadas no início, centro e fixadas no fim. */\nconst GROUP_LABELS = [\n 'Colunas fixadas no início',\n 'Colunas',\n 'Colunas fixadas no fim',\n];\n\n/**\n * A linha entre as listas, só visual (o alfinete já diz quais são fixadas), fica nas das fixadas,\n * do lado do centro, com o respiro. A lista do centro termina no primeiro e no último item: o\n * arrasto fica preso a ela, e com o respiro dentro dela, o item arrastado cobriria a linha.\n */\nconst GROUP_CLASS_NAMES = [\n 'mb-1 border-gray-6 border-b pb-1',\n undefined,\n 'mt-1 border-gray-6 border-t pt-1',\n];\n\n/** As pontas sem fixadas: a mesma referência, para a tupla não mudar à toa. */\nconst NO_COLUMNS: never[] = [];\n\n/** Se a coluna é de dados, e não de exibição (sem `accessorFn`, como a de seleção). */\nconst isDataColumn = <TFeatures extends TableFeatures, TData extends RowData>(\n column: Column<TFeatures, TData>,\n) => column.accessorFn !== undefined;\n\n/**\n * A lista das colunas da tabela: marca quais aparecem e arrasta para mudar a ordem. Para um\n * popover ou uma gaveta; a posição, o gatilho e o \"restaurar\" (`table.resetColumnOrder()`,\n * `table.resetColumnVisibility()`) são do app.\n *\n * Lista as colunas de dados. As de exibição (sem `accessorFn`, como a de seleção e a de ações)\n * ficam fora e no lugar: reordenar só troca as outras entre si. Com `columnPinningFeature`, a\n * tela vira até três listas (fixadas no início, centro e fixadas no fim), e só a do centro se\n * arrasta.\n *\n * O arrasto é pela alça, com o ponteiro ou o teclado (Espaço pega, setas movem, Espaço solta, Esc\n * cancela), e fica preso à lista do centro: não passa por cima das fixadas. O `Root` assina a\n * ordem e o pinning, e cada `ColumnsPanel.Item`, a visibilidade da coluna dele: funciona com o\n * dono da tabela em `() => null`.\n *\n * @example\n * ```tsx\n * <ColumnsPanel.Root table={table}>\n * {(column, index) => (\n * <ColumnsPanel.Item\n * column={column}\n * index={index}\n * label={labels[column.id]}\n * />\n * )}\n * </ColumnsPanel.Root>\n * ```\n */\nexport const ColumnsPanelRoot = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: ColumnsPanelRootProps<TFeatures, TData>,\n) => {\n const { table, render, className, children, ref, ...rest } = props;\n\n /** A lista do centro, a única que se arrasta: o arrasto fica preso a ela. */\n const centerListRef = useRef<HTMLUListElement>(null);\n\n /**\n * As colunas das três regiões, que o TanStack memoiza, numa tupla: o `shallow` compara item a\n * item, e só re-renderiza quando a ordem ou o pinning mudam. Já na ordem final: o\n * `columnOrder` vale dentro de cada região.\n */\n const regions = useSelector(\n table.store,\n () =>\n hasTableFeature(table, 'columnPinningFeature')\n ? [\n table.getStartLeafColumns(),\n table.getCenterLeafColumns(),\n table.getEndLeafColumns(),\n ]\n : [NO_COLUMNS, table.getAllLeafColumns(), NO_COLUMNS],\n { compare: shallow },\n );\n\n const groups = regions.map((columns) => columns.filter(isDataColumn));\n\n /** Preso à lista do centro, e só na vertical: fora dela não há destino. */\n const modifiers = useMemo(\n () => [\n RestrictToVerticalAxis,\n RestrictToElement.configure({ element: () => centerListRef.current }),\n ],\n [],\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n if (event.canceled) {\n /** O Esc que cancela o arrasto pelo teclado não segue adiante: fecharia o popover em volta. */\n if (\n event.nativeEvent instanceof KeyboardEvent &&\n event.nativeEvent.key === 'Escape'\n ) {\n event.nativeEvent.stopPropagation();\n }\n\n return;\n }\n\n const { source } = event.operation;\n\n /**\n * A posição final vem do item arrastado, e não do destino: durante o arrasto, a lista já se\n * reordena com o destino mais próximo, e soltar em cima de uma fixada, que não aceita nada,\n * chega sem destino. Sem isso, a lista ficaria na ordem nova e a tabela, na antiga.\n */\n if (!isSortable(source) || source.initialIndex === source.index) {\n return;\n }\n\n table.setColumnOrder(\n getColumnsPanelColumnOrder(\n table.getAllLeafColumns().map((column) => column.id),\n (groups[1] ?? []).map((column) => column.id),\n source.initialIndex,\n source.index,\n ),\n );\n };\n\n /**\n * Com render-prop ou sem `children`, o laço é daqui, uma lista por grupo com colunas; com nós\n * comuns, de quem usa.\n */\n const content =\n typeof children === 'function' || children === undefined\n ? groups.map(\n (columns, groupIndex) =>\n columns.length > 0 && (\n <ul\n key={groupIndex}\n ref={groupIndex === 1 ? centerListRef : undefined}\n aria-label={GROUP_LABELS[groupIndex]}\n className={mergeTwClassNames([\n 'flex',\n 'flex-col',\n 'gap-0.5',\n GROUP_CLASS_NAMES[groupIndex],\n ])}\n >\n {columns.map((column, index) => (\n <Fragment key={column.id}>\n {children === undefined\n ? hasColumnFeature(column, 'columnVisibilityFeature') && (\n <ColumnsPanelItem\n column={column}\n index={index}\n />\n )\n : children(column, index)}\n </Fragment>\n ))}\n </ul>\n ),\n )\n : children;\n\n const element = useRender({\n render,\n ref,\n defaultTagName: 'div',\n props: mergeProps(\n {\n 'data-component': 'ColumnsPanel.Root',\n className: mergeTwClassNames(['flex', 'w-56', 'flex-col'], className),\n children: content,\n },\n rest,\n ),\n });\n\n return (\n <DragDropProvider\n modifiers={modifiers}\n onDragEnd={handleDragEnd}\n >\n {element}\n </DragDropProvider>\n );\n};\n\nColumnsPanelRoot.displayName = 'ColumnsPanel.Root';\n"],"mappings":";;;;;;;;;;;;;;AA6CA,MAAM,eAAe;CACnB;CACA;CACA;AACF;;;;;;AAOA,MAAM,oBAAoB;CACxB;CACA,KAAA;CACA;AACF;;AAGA,MAAM,aAAsB,CAAC;;AAG7B,MAAM,gBACJ,WACG,OAAO,eAAe,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B3B,MAAa,oBAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,UAAU,KAAK,GAAG,SAAS;;CAG7D,MAAM,gBAAgB,OAAyB,IAAI;CAoBnD,MAAM,SAbU,YACd,MAAM,aAEJ,gBAAgB,OAAO,sBAAsB,IACzC;EACE,MAAM,oBAAoB;EAC1B,MAAM,qBAAqB;EAC3B,MAAM,kBAAkB;CAC1B,IACA;EAAC;EAAY,MAAM,kBAAkB;EAAG;CAAU,GACxD,EAAE,SAAS,QAAQ,CAGA,CAAC,CAAC,KAAK,YAAY,QAAQ,OAAO,YAAY,CAAC;;CAGpE,MAAM,YAAY,cACV,CACJ,wBACA,kBAAkB,UAAU,EAAE,eAAe,cAAc,QAAQ,CAAC,CACtE,GACA,CAAC,CACH;CAEA,MAAM,iBAAiB,UAAwB;EAC7C,IAAI,MAAM,UAAU;;GAElB,IACE,MAAM,uBAAuB,iBAC7B,MAAM,YAAY,QAAQ,UAE1B,MAAM,YAAY,gBAAgB;GAGpC;EACF;EAEA,MAAM,EAAE,WAAW,MAAM;;;;;;EAOzB,IAAI,CAAC,WAAW,MAAM,KAAK,OAAO,iBAAiB,OAAO,OACxD;EAGF,MAAM,eACJ,2BACE,MAAM,kBAAkB,CAAC,CAAC,KAAK,WAAW,OAAO,EAAE,IAClD,OAAO,MAAM,CAAC,EAAA,CAAG,KAAK,WAAW,OAAO,EAAE,GAC3C,OAAO,cACP,OAAO,KACT,CACF;CACF;;;;;CAMA,MAAM,UACJ,OAAO,aAAa,cAAc,aAAa,KAAA,IAC3C,OAAO,KACJ,SAAS,eACR,QAAQ,SAAS,KACf,oBAAC,MAAD;EAEE,KAAK,eAAe,IAAI,gBAAgB,KAAA;EACxC,cAAY,aAAa;EACzB,WAAW,kBAAkB;GAC3B;GACA;GACA;GACA,kBAAkB;EACpB,CAAC;EAEA,UAAA,QAAQ,KAAK,QAAQ,UACpB,oBAACA,YAAD,EAAA,UACG,aAAa,KAAA,IACV,iBAAiB,QAAQ,yBAAyB,KAChD,oBAAC,kBAAD;GACU;GACD;EACR,CAAA,IAEH,SAAS,QAAQ,KAAK,EAClB,GATK,OAAO,EASZ,CACX;CACC,GAtBG,UAsBH,CAEV,IACA;CAEN,MAAM,UAAU,UAAU;EACxB;EACA;EACA,gBAAgB;EAChB,OAAO,WACL;GACE,kBAAkB;GAClB,WAAW,kBAAkB;IAAC;IAAQ;IAAQ;GAAU,GAAG,SAAS;GACpE,UAAU;EACZ,GACA,IACF;CACF,CAAC;CAED,OACE,oBAAC,kBAAD;EACa;EACX,WAAW;EAEV,UAAA;CACe,CAAA;AAEtB;AAEA,iBAAiB,cAAc"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/components/columns-panel/get-columns-panel-column-order.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* A ordem completa das colunas depois de um arrasto na lista do centro. Move o item de
|
|
4
|
+
* `fromIndex` para `toIndex` entre os `centerIds`, e a nova ordem deles ocupa as posições que eles
|
|
5
|
+
* já tinham em `columnIds`: as colunas fora da lista (as de exibição e as fixadas) ficam onde
|
|
6
|
+
* estão.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* getColumnsPanelColumnOrder(['select', 'name', 'age', 'city'], ['name', 'age', 'city'], 0, 2);
|
|
11
|
+
* // → ['select', 'age', 'city', 'name']
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare const getColumnsPanelColumnOrder: (columnIds: readonly string[], centerIds: readonly string[], fromIndex: number, toIndex: number) => string[];
|
|
15
|
+
//#endregion
|
|
16
|
+
//# sourceMappingURL=get-columns-panel-column-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-columns-panel-column-order.d.ts","names":[],"sources":["../../../src/components/columns-panel/get-columns-panel-column-order.ts"],"mappings":";;;;;;;;;;;;;qBAca,6BACX,8BACA,8BACA,mBACA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { arrayMove } from "@dnd-kit/helpers";
|
|
2
|
+
//#region src/components/columns-panel/get-columns-panel-column-order.ts
|
|
3
|
+
/**
|
|
4
|
+
* A ordem completa das colunas depois de um arrasto na lista do centro. Move o item de
|
|
5
|
+
* `fromIndex` para `toIndex` entre os `centerIds`, e a nova ordem deles ocupa as posições que eles
|
|
6
|
+
* já tinham em `columnIds`: as colunas fora da lista (as de exibição e as fixadas) ficam onde
|
|
7
|
+
* estão.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* getColumnsPanelColumnOrder(['select', 'name', 'age', 'city'], ['name', 'age', 'city'], 0, 2);
|
|
12
|
+
* // → ['select', 'age', 'city', 'name']
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
const getColumnsPanelColumnOrder = (columnIds, centerIds, fromIndex, toIndex) => {
|
|
16
|
+
const nextCenterIds = arrayMove([...centerIds], fromIndex, toIndex);
|
|
17
|
+
const centerIdSet = new Set(centerIds);
|
|
18
|
+
let nextIndex = 0;
|
|
19
|
+
return columnIds.map((columnId) => centerIdSet.has(columnId) ? nextCenterIds[nextIndex++] ?? columnId : columnId);
|
|
20
|
+
};
|
|
21
|
+
//#endregion
|
|
22
|
+
export { getColumnsPanelColumnOrder };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=get-columns-panel-column-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-columns-panel-column-order.js","names":[],"sources":["../../../src/components/columns-panel/get-columns-panel-column-order.ts"],"sourcesContent":["import { arrayMove } from '@dnd-kit/helpers';\n\n/**\n * A ordem completa das colunas depois de um arrasto na lista do centro. Move o item de\n * `fromIndex` para `toIndex` entre os `centerIds`, e a nova ordem deles ocupa as posições que eles\n * já tinham em `columnIds`: as colunas fora da lista (as de exibição e as fixadas) ficam onde\n * estão.\n *\n * @example\n * ```ts\n * getColumnsPanelColumnOrder(['select', 'name', 'age', 'city'], ['name', 'age', 'city'], 0, 2);\n * // → ['select', 'age', 'city', 'name']\n * ```\n */\nexport const getColumnsPanelColumnOrder = (\n columnIds: readonly string[],\n centerIds: readonly string[],\n fromIndex: number,\n toIndex: number,\n) => {\n const nextCenterIds = arrayMove([...centerIds], fromIndex, toIndex);\n const centerIdSet = new Set(centerIds);\n\n let nextIndex = 0;\n\n return columnIds.map((columnId) =>\n centerIdSet.has(columnId)\n ? (nextCenterIds[nextIndex++] ?? columnId)\n : columnId,\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAa,8BACX,WACA,WACA,WACA,YACG;CACH,MAAM,gBAAgB,UAAU,CAAC,GAAG,SAAS,GAAG,WAAW,OAAO;CAClE,MAAM,cAAc,IAAI,IAAI,SAAS;CAErC,IAAI,YAAY;CAEhB,OAAO,UAAU,KAAK,aACpB,YAAY,IAAI,QAAQ,IACnB,cAAc,gBAAgB,WAC/B,QACN;AACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ColumnsPanelItem, ColumnsPanelItemProps } from "./columns-panel-item.js";
|
|
2
|
+
import { ColumnsPanelRoot, ColumnsPanelRootProps } from "./columns-panel-root.js";
|
|
3
|
+
declare namespace index_parts_d_exports {
|
|
4
|
+
export { ColumnsPanelItem as Item, ColumnsPanelItemProps as ItemProps, ColumnsPanelRoot as Root, ColumnsPanelRootProps as RootProps };
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { ColumnsPanelItem as Item, type ColumnsPanelItemProps as ItemProps, ColumnsPanelRoot as Root, type ColumnsPanelRootProps as RootProps, index_parts_d_exports };
|
|
8
|
+
//# sourceMappingURL=index.parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.parts.d.ts","names":[],"sources":["../../../src/components/columns-panel/index.parts.ts"],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { ColumnsPanelItem } from "./columns-panel-item.js";
|
|
3
|
+
import { ColumnsPanelRoot } from "./columns-panel-root.js";
|
|
4
|
+
//#region src/components/columns-panel/index.parts.ts
|
|
5
|
+
var index_parts_exports = /* @__PURE__ */ __exportAll({
|
|
6
|
+
Item: () => ColumnsPanelItem,
|
|
7
|
+
Root: () => ColumnsPanelRoot
|
|
8
|
+
});
|
|
9
|
+
//#endregion
|
|
10
|
+
export { ColumnsPanelItem as Item, ColumnsPanelRoot as Root, index_parts_exports };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=index.parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.parts.js","names":[],"sources":["../../../src/components/columns-panel/index.parts.ts"],"sourcesContent":["export { ColumnsPanelItem as Item } from './columns-panel-item';\nexport { ColumnsPanelRoot as Root } from './columns-panel-root';\n\n/* types */\n\nexport type { ColumnsPanelItemProps as ItemProps } from './columns-panel-item';\nexport type { ColumnsPanelRootProps as RootProps } from './columns-panel-root';\n"],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Row, RowData, Table, TableFeatures } from "@tanstack/react-table";
|
|
2
|
+
import { useRender } from "@base-ui/react";
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
5
|
+
//#region src/components/data-table/body/data-table-body.d.ts
|
|
6
|
+
export type DataTableBodyProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
|
|
7
|
+
/** A tabela do `useTable`. */
|
|
8
|
+
table: Table<TFeatures, TData>;
|
|
9
|
+
/**
|
|
10
|
+
* Uma função que recebe cada linha do row model e devolve o elemento dela. Com nós comuns,
|
|
11
|
+
* quem usa faz o laço.
|
|
12
|
+
* @default (row) => <DataTable.Row row={row} />
|
|
13
|
+
*/
|
|
14
|
+
children?: React.ReactNode | ((row: Row<TFeatures, TData>) => React.ReactNode);
|
|
15
|
+
/**
|
|
16
|
+
* Quantas linhas-fantasma o corpo desenha na carga sem linhas, com `loadingFeature`.
|
|
17
|
+
* @default 10
|
|
18
|
+
*/
|
|
19
|
+
loadingRowCount?: number;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* O corpo da tabela (`role="rowgroup"`).
|
|
23
|
+
*
|
|
24
|
+
* Com render-prop ou sem `children`, faz o laço sozinho: assina as linhas do row model e
|
|
25
|
+
* re-renderiza quando os dados, a ordenação ou a página mudam, sem o dono da tabela precisar
|
|
26
|
+
* re-renderizar. Com nós comuns, o laço é de quem usa, e o dono precisa re-renderizar quando as
|
|
27
|
+
* linhas mudam.
|
|
28
|
+
*
|
|
29
|
+
* Marca as linhas com `content-visibility: auto`: o que está fora da tela não entra no estilo,
|
|
30
|
+
* no layout nem na pintura, e o corpo aguenta centenas de linhas sem virtualização. Para
|
|
31
|
+
* desligar, passe `className="*:[content-visibility:visible]"`.
|
|
32
|
+
*
|
|
33
|
+
* Com `activeRowFeature`, quando a linha com foco sai (apagada, de outra página, filtrada), o foco
|
|
34
|
+
* volta para a linha ativa, se ela ficou, ou para a que tomou o lugar da que saiu.
|
|
35
|
+
*
|
|
36
|
+
* Com `rowPaginationFeature`, trocar de página ou de tamanho volta a rolagem vertical ao topo.
|
|
37
|
+
*
|
|
38
|
+
* Com `loadingFeature`, fica bloqueado (`inert`) enquanto carrega. Sem linhas, desenha
|
|
39
|
+
* linhas-fantasma com skeleton (`loadingRowCount`); com linhas, cada célula troca o conteúdo por um
|
|
40
|
+
* skeleton (ver `DataTable.Root`).
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* <DataTable.Body table={table}>
|
|
45
|
+
* {(row) => (
|
|
46
|
+
* <DataTable.Row row={row}>
|
|
47
|
+
* {(cell) => <DataTable.Cell cell={cell} />}
|
|
48
|
+
* </DataTable.Row>
|
|
49
|
+
* )}
|
|
50
|
+
* </DataTable.Body>
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare const DataTableBody: {
|
|
54
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableBodyProps<TFeatures, TData>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
55
|
+
displayName: string;
|
|
56
|
+
};
|
|
57
|
+
//#endregion
|
|
58
|
+
//# sourceMappingURL=data-table-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-body.d.ts","names":[],"sources":["../../../../src/components/data-table/body/data-table-body.tsx"],"mappings":";;;;;YAgBY,mBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,MAAM,WAAW;;;;;;EAMxB,WACI,MAAM,cACJ,KAAK,IAAI,WAAW,WAAW,MAAM;;;;;EAK3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoCS;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,mBAAmB,WAAW,SAAM,MAAA,+BAAA,MAAA"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { hasTableFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { getDataTableLoadingWithoutRows } from "../loading/get-data-table-loading-without-rows.js";
|
|
3
|
+
import { useDataTableLoadingInert } from "../loading/use-data-table-loading-inert.js";
|
|
4
|
+
import { useDataTablePageScrollReset } from "../pagination/use-data-table-page-scroll-reset.js";
|
|
5
|
+
import { dataTableGridClassNames } from "../root/data-table-grid-class-names.js";
|
|
6
|
+
import { DataTableRow } from "./data-table-row.js";
|
|
7
|
+
import { useDataTableRowFocusRecovery } from "./use-data-table-row-focus-recovery.js";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
10
|
+
import { useSelector } from "@tanstack/react-store";
|
|
11
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
12
|
+
import { Fragment as Fragment$1 } from "react";
|
|
13
|
+
import { Skeleton } from "@lucasbernardosn/react-ui/feedback/skeleton";
|
|
14
|
+
//#region src/components/data-table/body/data-table-body.tsx
|
|
15
|
+
/**
|
|
16
|
+
* O corpo da tabela (`role="rowgroup"`).
|
|
17
|
+
*
|
|
18
|
+
* Com render-prop ou sem `children`, faz o laço sozinho: assina as linhas do row model e
|
|
19
|
+
* re-renderiza quando os dados, a ordenação ou a página mudam, sem o dono da tabela precisar
|
|
20
|
+
* re-renderizar. Com nós comuns, o laço é de quem usa, e o dono precisa re-renderizar quando as
|
|
21
|
+
* linhas mudam.
|
|
22
|
+
*
|
|
23
|
+
* Marca as linhas com `content-visibility: auto`: o que está fora da tela não entra no estilo,
|
|
24
|
+
* no layout nem na pintura, e o corpo aguenta centenas de linhas sem virtualização. Para
|
|
25
|
+
* desligar, passe `className="*:[content-visibility:visible]"`.
|
|
26
|
+
*
|
|
27
|
+
* Com `activeRowFeature`, quando a linha com foco sai (apagada, de outra página, filtrada), o foco
|
|
28
|
+
* volta para a linha ativa, se ela ficou, ou para a que tomou o lugar da que saiu.
|
|
29
|
+
*
|
|
30
|
+
* Com `rowPaginationFeature`, trocar de página ou de tamanho volta a rolagem vertical ao topo.
|
|
31
|
+
*
|
|
32
|
+
* Com `loadingFeature`, fica bloqueado (`inert`) enquanto carrega. Sem linhas, desenha
|
|
33
|
+
* linhas-fantasma com skeleton (`loadingRowCount`); com linhas, cada célula troca o conteúdo por um
|
|
34
|
+
* skeleton (ver `DataTable.Root`).
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <DataTable.Body table={table}>
|
|
39
|
+
* {(row) => (
|
|
40
|
+
* <DataTable.Row row={row}>
|
|
41
|
+
* {(cell) => <DataTable.Cell cell={cell} />}
|
|
42
|
+
* </DataTable.Row>
|
|
43
|
+
* )}
|
|
44
|
+
* </DataTable.Body>
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
const DataTableBody = (props) => {
|
|
48
|
+
const { table, loadingRowCount = 10, render, className, children, ref, ...rest } = props;
|
|
49
|
+
/**
|
|
50
|
+
* Memoizado pelo TanStack: o array só muda com as linhas. Tamanho, colunas e seleção mudam o
|
|
51
|
+
* store, mas não o row model, e não re-renderizam o corpo.
|
|
52
|
+
*/
|
|
53
|
+
const rows = useSelector(table.store, () => table.getRowModel().rows);
|
|
54
|
+
const focusRecovery = useDataTableRowFocusRecovery(table, rows);
|
|
55
|
+
useDataTablePageScrollReset(table, focusRecovery.ref);
|
|
56
|
+
useDataTableLoadingInert(table, focusRecovery.ref);
|
|
57
|
+
/**
|
|
58
|
+
* Quantas colunas cada linha-fantasma tem, ou 0 sem elas: só na carga sem linhas. Re-renderiza
|
|
59
|
+
* quando as linhas-fantasma entram ou saem, ou quando as colunas visíveis mudam durante a carga.
|
|
60
|
+
*/
|
|
61
|
+
const ghostColumnCount = useSelector(table.store, () => {
|
|
62
|
+
if (!getDataTableLoadingWithoutRows(table)) return 0;
|
|
63
|
+
return hasTableFeature(table, "columnVisibilityFeature") ? table.getVisibleLeafColumns().length : table.getAllLeafColumns().length;
|
|
64
|
+
});
|
|
65
|
+
/** Com render-prop ou sem `children`, o laço é daqui; com nós comuns, de quem usa. */
|
|
66
|
+
const content = typeof children === "function" || children === void 0 ? rows.map((row) => /* @__PURE__ */ jsx(Fragment$1, { children: children === void 0 ? /* @__PURE__ */ jsx(DataTableRow, { row }) : children(row) }, row.id)) : children;
|
|
67
|
+
/**
|
|
68
|
+
* Fora da árvore de acessibilidade, que já sabe da espera pelo `aria-busy` do `DataTable.Root`.
|
|
69
|
+
* A grade é a da `DataTable.Row`, e o espaçamento repete o da `DataTable.Cell`.
|
|
70
|
+
*/
|
|
71
|
+
const ghostRows = Array.from({ length: loadingRowCount }, (_, rowIndex) => /* @__PURE__ */ jsx("div", {
|
|
72
|
+
"aria-hidden": true,
|
|
73
|
+
"data-component": "DataTable.GhostRow",
|
|
74
|
+
className: mergeTwClassNames([dataTableGridClassNames, "last:border-b-0"]),
|
|
75
|
+
children: Array.from({ length: ghostColumnCount }, (_, columnIndex) => /* @__PURE__ */ jsx("div", {
|
|
76
|
+
className: "h-(--data-table-row-height) content-center px-(--data-table-cell-padding)",
|
|
77
|
+
children: /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-3/4" })
|
|
78
|
+
}, columnIndex))
|
|
79
|
+
}, rowIndex));
|
|
80
|
+
const baseProps = {
|
|
81
|
+
"data-component": "DataTable.Body",
|
|
82
|
+
role: "rowgroup",
|
|
83
|
+
onFocus: focusRecovery.onFocus,
|
|
84
|
+
onBlur: focusRecovery.onBlur,
|
|
85
|
+
className: mergeTwClassNames(["*:[content-visibility:auto]", "*:[contain-intrinsic-height:auto_calc(var(--data-table-row-height)+1px)]"], className),
|
|
86
|
+
children: ghostColumnCount > 0 ? ghostRows : content
|
|
87
|
+
};
|
|
88
|
+
return useRender({
|
|
89
|
+
render,
|
|
90
|
+
ref: [focusRecovery.ref, ref ?? null],
|
|
91
|
+
defaultTagName: "div",
|
|
92
|
+
props: mergeProps(baseProps, rest)
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
DataTableBody.displayName = "DataTable.Body";
|
|
96
|
+
//#endregion
|
|
97
|
+
export { DataTableBody };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=data-table-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-body.js","names":["Fragment"],"sources":["../../../../src/components/data-table/body/data-table-body.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { Skeleton } from '@lucasbernardosn/react-ui/feedback/skeleton';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { Row, RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { Fragment } from 'react';\nimport { hasTableFeature } from '../../../utils';\nimport { getDataTableLoadingWithoutRows } from '../loading/get-data-table-loading-without-rows';\nimport { useDataTableLoadingInert } from '../loading/use-data-table-loading-inert';\nimport { useDataTablePageScrollReset } from '../pagination/use-data-table-page-scroll-reset';\nimport { dataTableGridClassNames } from '../root/data-table-grid-class-names';\nimport { DataTableRow } from './data-table-row';\nimport { useDataTableRowFocusRecovery } from './use-data-table-row-focus-recovery';\n\nexport type DataTableBodyProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** A tabela do `useTable`. */\n table: Table<TFeatures, TData>;\n /**\n * Uma função que recebe cada linha do row model e devolve o elemento dela. Com nós comuns,\n * quem usa faz o laço.\n * @default (row) => <DataTable.Row row={row} />\n */\n children?:\n | React.ReactNode\n | ((row: Row<TFeatures, TData>) => React.ReactNode);\n /**\n * Quantas linhas-fantasma o corpo desenha na carga sem linhas, com `loadingFeature`.\n * @default 10\n */\n loadingRowCount?: number;\n }\n>;\n\n/**\n * O corpo da tabela (`role=\"rowgroup\"`).\n *\n * Com render-prop ou sem `children`, faz o laço sozinho: assina as linhas do row model e\n * re-renderiza quando os dados, a ordenação ou a página mudam, sem o dono da tabela precisar\n * re-renderizar. Com nós comuns, o laço é de quem usa, e o dono precisa re-renderizar quando as\n * linhas mudam.\n *\n * Marca as linhas com `content-visibility: auto`: o que está fora da tela não entra no estilo,\n * no layout nem na pintura, e o corpo aguenta centenas de linhas sem virtualização. Para\n * desligar, passe `className=\"*:[content-visibility:visible]\"`.\n *\n * Com `activeRowFeature`, quando a linha com foco sai (apagada, de outra página, filtrada), o foco\n * volta para a linha ativa, se ela ficou, ou para a que tomou o lugar da que saiu.\n *\n * Com `rowPaginationFeature`, trocar de página ou de tamanho volta a rolagem vertical ao topo.\n *\n * Com `loadingFeature`, fica bloqueado (`inert`) enquanto carrega. Sem linhas, desenha\n * linhas-fantasma com skeleton (`loadingRowCount`); com linhas, cada célula troca o conteúdo por um\n * skeleton (ver `DataTable.Root`).\n *\n * @example\n * ```tsx\n * <DataTable.Body table={table}>\n * {(row) => (\n * <DataTable.Row row={row}>\n * {(cell) => <DataTable.Cell cell={cell} />}\n * </DataTable.Row>\n * )}\n * </DataTable.Body>\n * ```\n */\nexport const DataTableBody = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableBodyProps<TFeatures, TData>,\n) => {\n const {\n table,\n loadingRowCount = 10,\n render,\n className,\n children,\n ref,\n ...rest\n } = props;\n\n /**\n * Memoizado pelo TanStack: o array só muda com as linhas. Tamanho, colunas e seleção mudam o\n * store, mas não o row model, e não re-renderizam o corpo.\n */\n const rows = useSelector(table.store, () => table.getRowModel().rows);\n\n const focusRecovery = useDataTableRowFocusRecovery(table, rows);\n\n useDataTablePageScrollReset(table, focusRecovery.ref);\n\n useDataTableLoadingInert(table, focusRecovery.ref);\n\n /**\n * Quantas colunas cada linha-fantasma tem, ou 0 sem elas: só na carga sem linhas. Re-renderiza\n * quando as linhas-fantasma entram ou saem, ou quando as colunas visíveis mudam durante a carga.\n */\n const ghostColumnCount = useSelector(table.store, () => {\n if (!getDataTableLoadingWithoutRows(table)) {\n return 0;\n }\n\n return hasTableFeature(table, 'columnVisibilityFeature')\n ? table.getVisibleLeafColumns().length\n : table.getAllLeafColumns().length;\n });\n\n /** Com render-prop ou sem `children`, o laço é daqui; com nós comuns, de quem usa. */\n const content =\n typeof children === 'function' || children === undefined\n ? rows.map((row) => (\n <Fragment key={row.id}>\n {children === undefined ? (\n <DataTableRow row={row} />\n ) : (\n children(row)\n )}\n </Fragment>\n ))\n : children;\n\n /**\n * Fora da árvore de acessibilidade, que já sabe da espera pelo `aria-busy` do `DataTable.Root`.\n * A grade é a da `DataTable.Row`, e o espaçamento repete o da `DataTable.Cell`.\n */\n const ghostRows = Array.from({ length: loadingRowCount }, (_, rowIndex) => (\n <div\n key={rowIndex}\n aria-hidden={true}\n data-component=\"DataTable.GhostRow\"\n className={mergeTwClassNames([\n dataTableGridClassNames,\n 'last:border-b-0',\n ])}\n >\n {Array.from({ length: ghostColumnCount }, (_, columnIndex) => (\n <div\n key={columnIndex}\n className=\"h-(--data-table-row-height) content-center px-(--data-table-cell-padding)\"\n >\n <Skeleton className=\"h-3 w-3/4\" />\n </div>\n ))}\n </div>\n ));\n\n const baseProps = {\n 'data-component': 'DataTable.Body',\n role: 'rowgroup',\n onFocus: focusRecovery.onFocus,\n onBlur: focusRecovery.onBlur,\n className: mergeTwClassNames(\n [\n // As linhas fora da tela pulam estilo, layout e pintura. Sem isto, cada tick do arrasto\n // de uma coluna, que reescreve a variável herdada do template no `Root`, recalcula todas\n // as linhas, e com centenas delas o arrasto trava.\n '*:[content-visibility:auto]',\n // A altura de uma linha que ainda não apareceu: a da densidade mais a borda de baixo da\n // `DataTable.Row`. Com `auto`, a linha que já apareceu guarda a altura medida. Uma\n // estimativa errada faz a barra de rolagem pular quando as linhas entram na tela.\n '*:[contain-intrinsic-height:auto_calc(var(--data-table-row-height)+1px)]',\n ],\n className,\n ),\n children: ghostColumnCount > 0 ? ghostRows : content,\n };\n\n return useRender({\n render,\n ref: [focusRecovery.ref, ref ?? null],\n defaultTagName: 'div',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableBody.displayName = 'DataTable.Body';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEA,MAAa,iBAIX,UACG;CACH,MAAM,EACJ,OACA,kBAAkB,IAClB,QACA,WACA,UACA,KACA,GAAG,SACD;;;;;CAMJ,MAAM,OAAO,YAAY,MAAM,aAAa,MAAM,YAAY,CAAC,CAAC,IAAI;CAEpE,MAAM,gBAAgB,6BAA6B,OAAO,IAAI;CAE9D,4BAA4B,OAAO,cAAc,GAAG;CAEpD,yBAAyB,OAAO,cAAc,GAAG;;;;;CAMjD,MAAM,mBAAmB,YAAY,MAAM,aAAa;EACtD,IAAI,CAAC,+BAA+B,KAAK,GACvC,OAAO;EAGT,OAAO,gBAAgB,OAAO,yBAAyB,IACnD,MAAM,sBAAsB,CAAC,CAAC,SAC9B,MAAM,kBAAkB,CAAC,CAAC;CAChC,CAAC;;CAGD,MAAM,UACJ,OAAO,aAAa,cAAc,aAAa,KAAA,IAC3C,KAAK,KAAK,QACR,oBAACA,YAAD,EAAA,UACG,aAAa,KAAA,IACZ,oBAAC,cAAD,EAAmB,IAAM,CAAA,IAEzB,SAAS,GAAG,EAEN,GANK,IAAI,EAMT,CACX,IACD;;;;;CAMN,MAAM,YAAY,MAAM,KAAK,EAAE,QAAQ,gBAAgB,IAAI,GAAG,aAC5D,oBAAC,OAAD;EAEE,eAAa;EACb,kBAAe;EACf,WAAW,kBAAkB,CAC3B,yBACA,iBACF,CAAC;EAEA,UAAA,MAAM,KAAK,EAAE,QAAQ,iBAAiB,IAAI,GAAG,gBAC5C,oBAAC,OAAD;GAEE,WAAU;GAEV,UAAA,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA;EAC9B,GAJE,WAIF,CACN;CACE,GAhBE,QAgBF,CACN;CAED,MAAM,YAAY;EAChB,kBAAkB;EAClB,MAAM;EACN,SAAS,cAAc;EACvB,QAAQ,cAAc;EACtB,WAAW,kBACT,CAIE,+BAIA,0EACF,GACA,SACF;EACA,UAAU,mBAAmB,IAAI,YAAY;CAC/C;CAEA,OAAO,UAAU;EACf;EACA,KAAK,CAAC,cAAc,KAAK,OAAO,IAAI;EACpC,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,cAAc,cAAc"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Cell, RowData, TableFeatures } from "@tanstack/react-table";
|
|
2
|
+
import { useRender } from "@base-ui/react";
|
|
3
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
4
|
+
//#region src/components/data-table/body/data-table-cell.d.ts
|
|
5
|
+
export type DataTableCellProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
|
|
6
|
+
/** A célula da linha. */
|
|
7
|
+
cell: Cell<TFeatures, TData>;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Uma célula do corpo (`role="cell"`). Sem `children`, mostra o `cell` da definição da coluna;
|
|
11
|
+
* com eles, mostra os `children`.
|
|
12
|
+
*
|
|
13
|
+
* Trunca o texto com reticências. Para arrumar o conteúdo em linha, como texto com ícone, passe
|
|
14
|
+
* `className="flex items-center gap-2"` e trunque o texto por conta própria.
|
|
15
|
+
*
|
|
16
|
+
* Com `columnAlignmentFeature`, alinha o conteúdo pelo `align` da coluna e o marca em
|
|
17
|
+
* `data-align`. Com `columnPinningFeature`, numa coluna fixada, gruda na borda do lado dela,
|
|
18
|
+
* marcada com `data-pinned`, e repete o fundo da `DataTable.Row` para cobrir o que rola por
|
|
19
|
+
* baixo.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DataTableCell: {
|
|
22
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableCellProps<TFeatures, TData>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
23
|
+
displayName: string;
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
//# sourceMappingURL=data-table-cell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-cell.d.ts","names":[],"sources":["../../../../src/components/data-table/body/data-table-cell.tsx"],"mappings":";;;;YAeY,mBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,MAAM,KAAK,WAAW;;;;;;;;;;;;;;qBAgBb;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,mBAAmB,WAAW,yBAAM,+CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { hasColumnFeature, hasTableFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { getDataTableColumnPinning, getDataTablePinnedStyle } from "../root/get-data-table-column-pinning.js";
|
|
3
|
+
import { FlexRender } from "@tanstack/react-table";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
6
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
7
|
+
//#region src/components/data-table/body/data-table-cell.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Uma célula do corpo (`role="cell"`). Sem `children`, mostra o `cell` da definição da coluna;
|
|
10
|
+
* com eles, mostra os `children`.
|
|
11
|
+
*
|
|
12
|
+
* Trunca o texto com reticências. Para arrumar o conteúdo em linha, como texto com ícone, passe
|
|
13
|
+
* `className="flex items-center gap-2"` e trunque o texto por conta própria.
|
|
14
|
+
*
|
|
15
|
+
* Com `columnAlignmentFeature`, alinha o conteúdo pelo `align` da coluna e o marca em
|
|
16
|
+
* `data-align`. Com `columnPinningFeature`, numa coluna fixada, gruda na borda do lado dela,
|
|
17
|
+
* marcada com `data-pinned`, e repete o fundo da `DataTable.Row` para cobrir o que rola por
|
|
18
|
+
* baixo.
|
|
19
|
+
*/
|
|
20
|
+
const DataTableCell = (props) => {
|
|
21
|
+
const { cell, render, className, children, ...rest } = props;
|
|
22
|
+
/**
|
|
23
|
+
* Sem assinatura: o alinhamento vem da definição da coluna, que não muda em runtime. Uma troca
|
|
24
|
+
* das colunas muda as células, e a `DataTable.Row` re-renderiza, com a célula junto.
|
|
25
|
+
*/
|
|
26
|
+
const align = hasColumnFeature(cell.column, "columnAlignmentFeature") ? cell.column.getAlign() : void 0;
|
|
27
|
+
/**
|
|
28
|
+
* Sem assinatura: o pinning muda as células da linha, e a `DataTable.Row` re-renderiza, com a
|
|
29
|
+
* célula junto. O deslocamento muda no resize, mas fica na variável que o `DataTable.Root`
|
|
30
|
+
* escreve.
|
|
31
|
+
*/
|
|
32
|
+
const pinning = getDataTableColumnPinning(cell.column);
|
|
33
|
+
const baseProps = {
|
|
34
|
+
"data-component": "DataTable.Cell",
|
|
35
|
+
"data-align": align,
|
|
36
|
+
"data-pinned": pinning.position || void 0,
|
|
37
|
+
role: hasTableFeature(cell.table, "activeRowFeature") ? "gridcell" : "cell",
|
|
38
|
+
style: getDataTablePinnedStyle(pinning),
|
|
39
|
+
className: mergeTwClassNames([
|
|
40
|
+
"block",
|
|
41
|
+
"content-center",
|
|
42
|
+
"min-w-0",
|
|
43
|
+
"truncate",
|
|
44
|
+
"data-[align=center]:text-center",
|
|
45
|
+
"data-[align=end]:text-end",
|
|
46
|
+
"h-(--data-table-row-height)",
|
|
47
|
+
"px-(--data-table-cell-padding)",
|
|
48
|
+
"data-pinned:sticky",
|
|
49
|
+
"data-pinned:z-1",
|
|
50
|
+
"data-pinned:bg-(--data-table-row-background)",
|
|
51
|
+
"data-[pinned=start]:has-[+:not([data-pinned=start])]:shadow-[6px_0_8px_-6px_rgb(0_0_0/0.12)]",
|
|
52
|
+
"dark:data-[pinned=start]:has-[+:not([data-pinned=start])]:shadow-[6px_0_8px_-6px_rgb(0_0_0/0.8)]",
|
|
53
|
+
"data-[pinned=end]:not-[[data-pinned=end]+*]:shadow-[-6px_0_8px_-6px_rgb(0_0_0/0.12)]",
|
|
54
|
+
"dark:data-[pinned=end]:not-[[data-pinned=end]+*]:shadow-[-6px_0_8px_-6px_rgb(0_0_0/0.8)]",
|
|
55
|
+
"text-sm",
|
|
56
|
+
"in-data-loading:text-[0px]",
|
|
57
|
+
"in-data-loading:*:hidden",
|
|
58
|
+
"in-data-loading:before:content-['']",
|
|
59
|
+
"in-data-loading:before:inline-block",
|
|
60
|
+
"in-data-loading:before:align-middle",
|
|
61
|
+
"in-data-loading:before:h-3",
|
|
62
|
+
"in-data-loading:before:w-3/4",
|
|
63
|
+
"in-data-loading:before:rounded-md",
|
|
64
|
+
"in-data-loading:before:corner-squircle",
|
|
65
|
+
"in-data-loading:before:bg-gray-6",
|
|
66
|
+
"in-data-loading:before:not-motion-reduced:animate-skeleton-pulse"
|
|
67
|
+
], className),
|
|
68
|
+
children: children === void 0 ? /* @__PURE__ */ jsx(FlexRender, { cell }) : children
|
|
69
|
+
};
|
|
70
|
+
return useRender({
|
|
71
|
+
render,
|
|
72
|
+
defaultTagName: "div",
|
|
73
|
+
props: mergeProps(baseProps, rest)
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
DataTableCell.displayName = "DataTable.Cell";
|
|
77
|
+
//#endregion
|
|
78
|
+
export { DataTableCell };
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=data-table-cell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-cell.js","names":[],"sources":["../../../../src/components/data-table/body/data-table-cell.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport {\n type Cell,\n FlexRender,\n type RowData,\n type TableFeatures,\n} from '@tanstack/react-table';\nimport { hasColumnFeature, hasTableFeature } from '../../../utils';\nimport {\n getDataTableColumnPinning,\n getDataTablePinnedStyle,\n} from '../root/get-data-table-column-pinning';\n\nexport type DataTableCellProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** A célula da linha. */\n cell: Cell<TFeatures, TData>;\n }\n>;\n\n/**\n * Uma célula do corpo (`role=\"cell\"`). Sem `children`, mostra o `cell` da definição da coluna;\n * com eles, mostra os `children`.\n *\n * Trunca o texto com reticências. Para arrumar o conteúdo em linha, como texto com ícone, passe\n * `className=\"flex items-center gap-2\"` e trunque o texto por conta própria.\n *\n * Com `columnAlignmentFeature`, alinha o conteúdo pelo `align` da coluna e o marca em\n * `data-align`. Com `columnPinningFeature`, numa coluna fixada, gruda na borda do lado dela,\n * marcada com `data-pinned`, e repete o fundo da `DataTable.Row` para cobrir o que rola por\n * baixo.\n */\nexport const DataTableCell = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableCellProps<TFeatures, TData>,\n) => {\n const { cell, render, className, children, ...rest } = props;\n\n /**\n * Sem assinatura: o alinhamento vem da definição da coluna, que não muda em runtime. Uma troca\n * das colunas muda as células, e a `DataTable.Row` re-renderiza, com a célula junto.\n */\n const align = hasColumnFeature(cell.column, 'columnAlignmentFeature')\n ? cell.column.getAlign()\n : undefined;\n\n /**\n * Sem assinatura: o pinning muda as células da linha, e a `DataTable.Row` re-renderiza, com a\n * célula junto. O deslocamento muda no resize, mas fica na variável que o `DataTable.Root`\n * escreve.\n */\n const pinning = getDataTableColumnPinning(cell.column);\n\n const baseProps = {\n 'data-component': 'DataTable.Cell',\n 'data-align': align,\n 'data-pinned': pinning.position || undefined,\n // Dentro do `grid` do `DataTable.Root`, que a navegação por teclado liga, a célula é `gridcell`.\n role: hasTableFeature(cell.table, 'activeRowFeature') ? 'gridcell' : 'cell',\n style: getDataTablePinnedStyle(pinning),\n className: mergeTwClassNames(\n [\n // Bloco, e não flex: só num bloco o texto ganha reticências. O `content-center` centraliza\n // na vertical.\n 'block',\n 'content-center',\n // Item de grid tem `min-width: auto`: sem isto, um conteúdo longo alarga o track, e a\n // coluna deixa de bater com o template.\n 'min-w-0',\n 'truncate',\n\n // Pelo `text-align`: a célula é bloco, e o conteúdo em linha, como o checkbox, segue.\n 'data-[align=center]:text-center',\n 'data-[align=end]:text-end',\n\n // Do `DataTable.Root`, pela densidade.\n 'h-(--data-table-row-height)',\n\n 'px-(--data-table-cell-padding)',\n\n // Fixada: gruda por cima das células do centro, e o fundo da linha a deixa opaca.\n 'data-pinned:sticky',\n 'data-pinned:z-1',\n 'data-pinned:bg-(--data-table-row-background)',\n // Sombra na borda da fixada, do lado em que o centro passa por baixo: na última do início e\n // na primeira do fim. Mais forte no escuro, onde a do claro sumiria no fundo.\n 'data-[pinned=start]:has-[+:not([data-pinned=start])]:shadow-[6px_0_8px_-6px_rgb(0_0_0/0.12)]',\n 'dark:data-[pinned=start]:has-[+:not([data-pinned=start])]:shadow-[6px_0_8px_-6px_rgb(0_0_0/0.8)]',\n 'data-[pinned=end]:not-[[data-pinned=end]+*]:shadow-[-6px_0_8px_-6px_rgb(0_0_0/0.12)]',\n 'dark:data-[pinned=end]:not-[[data-pinned=end]+*]:shadow-[-6px_0_8px_-6px_rgb(0_0_0/0.8)]',\n\n // A cor do texto vem da `DataTable.Row`, para a cor que o app puser na linha chegar aqui.\n 'text-sm',\n\n // Carregamento (`data-loading` no `DataTable.Root`): o conteúdo some\n // sem a célula mudar de tamanho, e um bloco com as classes do `Skeleton` do `ui` ocupa o\n // lugar, alinhado como o conteúdo. Por CSS, para as células não re-renderizarem a cada\n // carga. O texto vai a 0px, e não a transparente: senão empurraria o bloco no `center`.\n 'in-data-loading:text-[0px]',\n 'in-data-loading:*:hidden',\n \"in-data-loading:before:content-['']\",\n 'in-data-loading:before:inline-block',\n 'in-data-loading:before:align-middle',\n 'in-data-loading:before:h-3',\n 'in-data-loading:before:w-3/4',\n 'in-data-loading:before:rounded-md',\n 'in-data-loading:before:corner-squircle',\n 'in-data-loading:before:bg-gray-6',\n 'in-data-loading:before:not-motion-reduced:animate-skeleton-pulse',\n ],\n className,\n ),\n children: children === undefined ? <FlexRender cell={cell} /> : children,\n };\n\n return useRender({\n render,\n defaultTagName: 'div',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableCell.displayName = 'DataTable.Cell';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsCA,MAAa,iBAIX,UACG;CACH,MAAM,EAAE,MAAM,QAAQ,WAAW,UAAU,GAAG,SAAS;;;;;CAMvD,MAAM,QAAQ,iBAAiB,KAAK,QAAQ,wBAAwB,IAChE,KAAK,OAAO,SAAS,IACrB,KAAA;;;;;;CAOJ,MAAM,UAAU,0BAA0B,KAAK,MAAM;CAErD,MAAM,YAAY;EAChB,kBAAkB;EAClB,cAAc;EACd,eAAe,QAAQ,YAAY,KAAA;EAEnC,MAAM,gBAAgB,KAAK,OAAO,kBAAkB,IAAI,aAAa;EACrE,OAAO,wBAAwB,OAAO;EACtC,WAAW,kBACT;GAGE;GACA;GAGA;GACA;GAGA;GACA;GAGA;GAEA;GAGA;GACA;GACA;GAGA;GACA;GACA;GACA;GAGA;GAMA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,GACA,SACF;EACA,UAAU,aAAa,KAAA,IAAY,oBAAC,YAAD,EAAkB,KAAO,CAAA,IAAI;CAClE;CAEA,OAAO,UAAU;EACf;EACA,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,cAAc,cAAc"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { RowData, Table, TableFeatures } from "@tanstack/react-table";
|
|
2
|
+
import { useRender } from "@base-ui/react";
|
|
3
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
4
|
+
//#region src/components/data-table/body/data-table-empty.d.ts
|
|
5
|
+
export type DataTableEmptyProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
|
|
6
|
+
/** A tabela do `useTable`. */
|
|
7
|
+
table: Table<TFeatures, TData>;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* O estado vazio da tabela, para depois do `DataTable.Body`, dentro do `DataTable.Root`. Aparece
|
|
11
|
+
* quando o row model não tem linhas e a tabela não está carregando: com `loadingFeature`, a carga
|
|
12
|
+
* sem linhas mostra as linhas-fantasma do corpo, e não o vazio.
|
|
13
|
+
*
|
|
14
|
+
* Sem `children`, mostra o `EmptyState` do `ui`, sem moldura, com "Nenhum registro encontrado"
|
|
15
|
+
* e uma descrição que sugere ajustar os filtros. Com `children`, o conteúdo do app, como uma
|
|
16
|
+
* mensagem do filtro e um botão para limpá-lo. Fica centralizado na largura da tabela.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <DataTable.Root table={table}>
|
|
21
|
+
* <DataTable.Header table={table} />
|
|
22
|
+
* <DataTable.Body table={table} />
|
|
23
|
+
* <DataTable.Empty table={table}>
|
|
24
|
+
* <EmptyState.Root variant="plain">
|
|
25
|
+
* <EmptyState.Content>
|
|
26
|
+
* <EmptyState.Title>Nenhum cliente para este filtro</EmptyState.Title>
|
|
27
|
+
* </EmptyState.Content>
|
|
28
|
+
* </EmptyState.Root>
|
|
29
|
+
* </DataTable.Empty>
|
|
30
|
+
* </DataTable.Root>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare const DataTableEmpty: {
|
|
34
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTableEmptyProps<TFeatures, TData>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | null;
|
|
35
|
+
displayName: string;
|
|
36
|
+
};
|
|
37
|
+
//#endregion
|
|
38
|
+
//# sourceMappingURL=data-table-empty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-empty.d.ts","names":[],"sources":["../../../../src/components/data-table/body/data-table-empty.tsx"],"mappings":";;;;YASY,oBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;qBA4Bf;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,oBAAoB,WAAW,yBAAM,+CAAA"}
|