@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,67 @@
|
|
|
1
|
+
import { hasColumnFeature } from "../../utils/has-feature.js";
|
|
2
|
+
import { ColumnMenuHideItem } from "./column-menu-hide-item.js";
|
|
3
|
+
import { ColumnMenuPinItems } from "./column-menu-pin-items.js";
|
|
4
|
+
import { ColumnMenuSortItems } from "./column-menu-sort-items.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Menu } from "@lucasbernardosn/react-ui/overlays/menu";
|
|
7
|
+
import { mergeStateClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
8
|
+
import { Fragment as Fragment$1 } from "react";
|
|
9
|
+
//#region src/components/column-menu/column-menu-popup.tsx
|
|
10
|
+
/**
|
|
11
|
+
* A caixa do menu da coluna, já com o `Menu.Portal` e o `Menu.Positioner`. As props passam para o
|
|
12
|
+
* `Menu.Popup`. Abre encostada no header, e a largura mínima cabe o item mais longo: sem ela, o
|
|
13
|
+
* menu cresceria quando o "Remover ordenação" aparece.
|
|
14
|
+
*
|
|
15
|
+
* Sem `children`, mostra os grupos padrão separados por linhas: ordenação
|
|
16
|
+
* (`ColumnMenu.SortItems`), fixação (`ColumnMenu.PinItems`) e visibilidade
|
|
17
|
+
* (`ColumnMenu.HideItem`). Cada grupo só aparece com a feature registrada na tabela e permitida na
|
|
18
|
+
* coluna. Com `children`, eles substituem os grupos, para escolher, reordenar ou somar itens
|
|
19
|
+
* próprios com o `Menu.Item`. Os grupos recebem a coluna, e não o header: servem também fora
|
|
20
|
+
* dele, como no `ColumnsPanel.Item`.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <ColumnMenu.Popup header={header}>
|
|
25
|
+
* <ColumnMenu.SortItems column={header.column} />
|
|
26
|
+
* <Menu.Separator />
|
|
27
|
+
* <Menu.Item onClick={openFilter}>Filtrar</Menu.Item>
|
|
28
|
+
* </ColumnMenu.Popup>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
const ColumnMenuPopup = (props) => {
|
|
32
|
+
const { header, labels, positionerProps, className, children, ...rest } = props;
|
|
33
|
+
/**
|
|
34
|
+
* Os grupos padrão que a coluna aceita. A conta é feita aqui, e não pelo `null` de cada grupo,
|
|
35
|
+
* para a linha separar só os grupos que aparecem.
|
|
36
|
+
*/
|
|
37
|
+
const groups = [
|
|
38
|
+
hasColumnFeature(header.column, "rowSortingFeature") && header.column.getCanSort() && /* @__PURE__ */ jsx(ColumnMenuSortItems, {
|
|
39
|
+
column: header.column,
|
|
40
|
+
labels
|
|
41
|
+
}, "sort"),
|
|
42
|
+
hasColumnFeature(header.column, "columnPinningFeature") && header.column.getCanPin() && /* @__PURE__ */ jsx(ColumnMenuPinItems, {
|
|
43
|
+
column: header.column,
|
|
44
|
+
labels
|
|
45
|
+
}, "pin"),
|
|
46
|
+
hasColumnFeature(header.column, "columnVisibilityFeature") && header.column.getCanHide() && /* @__PURE__ */ jsx(ColumnMenuHideItem, {
|
|
47
|
+
column: header.column,
|
|
48
|
+
labels
|
|
49
|
+
}, "hide")
|
|
50
|
+
].filter((group) => group !== false);
|
|
51
|
+
return /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, {
|
|
52
|
+
sideOffset: 0,
|
|
53
|
+
disableAnchorTracking: true,
|
|
54
|
+
...positionerProps,
|
|
55
|
+
children: /* @__PURE__ */ jsx(Menu.Popup, {
|
|
56
|
+
"data-component": "ColumnMenu.Popup",
|
|
57
|
+
className: mergeStateClassNames(["min-w-48"], className),
|
|
58
|
+
...rest,
|
|
59
|
+
children: children ?? groups.map((group, index) => /* @__PURE__ */ jsxs(Fragment$1, { children: [index > 0 && /* @__PURE__ */ jsx(Menu.Separator, {}), group] }, group.key))
|
|
60
|
+
})
|
|
61
|
+
}) });
|
|
62
|
+
};
|
|
63
|
+
ColumnMenuPopup.displayName = "ColumnMenu.Popup";
|
|
64
|
+
//#endregion
|
|
65
|
+
export { ColumnMenuPopup };
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=column-menu-popup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-menu-popup.js","names":["Fragment"],"sources":["../../../src/components/column-menu/column-menu-popup.tsx"],"sourcesContent":["import { Menu } from '@lucasbernardosn/react-ui/overlays/menu';\nimport { mergeStateClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport type { Header, RowData, TableFeatures } from '@tanstack/react-table';\nimport { Fragment } from 'react';\nimport { hasColumnFeature } from '../../utils';\nimport { ColumnMenuHideItem } from './column-menu-hide-item';\nimport type { ColumnMenuLabels } from './column-menu-labels';\nimport { ColumnMenuPinItems } from './column-menu-pin-items';\nimport { ColumnMenuSortItems } from './column-menu-sort-items';\n\nexport type ColumnMenuPopupProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n Menu.PopupProps,\n {\n /** O header da coluna. */\n header: Header<TFeatures, TData>;\n /** O texto dos itens padrão; os que faltam ficam com o padrão. Sem efeito com `children`. */\n labels?: Partial<ColumnMenuLabels>;\n /** As props do `Menu.Positioner`, como `side` e `align`. */\n positionerProps?: Menu.PositionerProps;\n }\n>;\n\n/**\n * A caixa do menu da coluna, já com o `Menu.Portal` e o `Menu.Positioner`. As props passam para o\n * `Menu.Popup`. Abre encostada no header, e a largura mínima cabe o item mais longo: sem ela, o\n * menu cresceria quando o \"Remover ordenação\" aparece.\n *\n * Sem `children`, mostra os grupos padrão separados por linhas: ordenação\n * (`ColumnMenu.SortItems`), fixação (`ColumnMenu.PinItems`) e visibilidade\n * (`ColumnMenu.HideItem`). Cada grupo só aparece com a feature registrada na tabela e permitida na\n * coluna. Com `children`, eles substituem os grupos, para escolher, reordenar ou somar itens\n * próprios com o `Menu.Item`. Os grupos recebem a coluna, e não o header: servem também fora\n * dele, como no `ColumnsPanel.Item`.\n *\n * @example\n * ```tsx\n * <ColumnMenu.Popup header={header}>\n * <ColumnMenu.SortItems column={header.column} />\n * <Menu.Separator />\n * <Menu.Item onClick={openFilter}>Filtrar</Menu.Item>\n * </ColumnMenu.Popup>\n * ```\n */\nexport const ColumnMenuPopup = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: ColumnMenuPopupProps<TFeatures, TData>,\n) => {\n const { header, labels, positionerProps, className, children, ...rest } =\n props;\n\n /**\n * Os grupos padrão que a coluna aceita. A conta é feita aqui, e não pelo `null` de cada grupo,\n * para a linha separar só os grupos que aparecem.\n */\n const groups = [\n hasColumnFeature(header.column, 'rowSortingFeature') &&\n header.column.getCanSort() && (\n <ColumnMenuSortItems\n key=\"sort\"\n column={header.column}\n labels={labels}\n />\n ),\n hasColumnFeature(header.column, 'columnPinningFeature') &&\n header.column.getCanPin() && (\n <ColumnMenuPinItems\n key=\"pin\"\n column={header.column}\n labels={labels}\n />\n ),\n hasColumnFeature(header.column, 'columnVisibilityFeature') &&\n header.column.getCanHide() && (\n <ColumnMenuHideItem\n key=\"hide\"\n column={header.column}\n labels={labels}\n />\n ),\n ].filter((group) => group !== false);\n\n return (\n <Menu.Portal>\n <Menu.Positioner\n sideOffset={0}\n // Fixar ou mover a coluna leva o header para outro lugar enquanto o menu fecha: seguindo o\n // trigger, o menu deslizaria até lá na animação de saída. A rolagem continua acompanhada.\n disableAnchorTracking={true}\n {...positionerProps}\n >\n <Menu.Popup\n data-component=\"ColumnMenu.Popup\"\n className={mergeStateClassNames(['min-w-48'], className)}\n {...rest}\n >\n {children ??\n groups.map((group, index) => (\n <Fragment key={group.key}>\n {index > 0 && <Menu.Separator />}\n {group}\n </Fragment>\n ))}\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n );\n};\n\nColumnMenuPopup.displayName = 'ColumnMenu.Popup';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAa,mBAIX,UACG;CACH,MAAM,EAAE,QAAQ,QAAQ,iBAAiB,WAAW,UAAU,GAAG,SAC/D;;;;;CAMF,MAAM,SAAS;EACb,iBAAiB,OAAO,QAAQ,mBAAmB,KACjD,OAAO,OAAO,WAAW,KACvB,oBAAC,qBAAD;GAEE,QAAQ,OAAO;GACP;EACT,GAHK,MAGL;EAEL,iBAAiB,OAAO,QAAQ,sBAAsB,KACpD,OAAO,OAAO,UAAU,KACtB,oBAAC,oBAAD;GAEE,QAAQ,OAAO;GACP;EACT,GAHK,KAGL;EAEL,iBAAiB,OAAO,QAAQ,yBAAyB,KACvD,OAAO,OAAO,WAAW,KACvB,oBAAC,oBAAD;GAEE,QAAQ,OAAO;GACP;EACT,GAHK,MAGL;CAEP,CAAC,CAAC,QAAQ,UAAU,UAAU,KAAK;CAEnC,OACE,oBAAC,KAAK,QAAN,EAAA,UACE,oBAAC,KAAK,YAAN;EACE,YAAY;EAGZ,uBAAuB;EACvB,GAAI;EAEJ,UAAA,oBAAC,KAAK,OAAN;GACE,kBAAe;GACf,WAAW,qBAAqB,CAAC,UAAU,GAAG,SAAS;GACvD,GAAI;GAEH,UAAA,YACC,OAAO,KAAK,OAAO,UACjB,qBAACA,YAAD,EAAA,UAAA,CACG,QAAQ,KAAK,oBAAC,KAAK,WAAN,CAAiB,CAAA,GAC9B,KACO,EAAA,GAHK,MAAM,GAGX,CACX;EACO,CAAA;CACG,CAAA,EACN,CAAA;AAEjB;AAEA,gBAAgB,cAAc"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Menu } from "@lucasbernardosn/react-ui/overlays/menu";
|
|
2
|
+
//#region src/components/column-menu/column-menu-root.d.ts
|
|
3
|
+
export type ColumnMenuRootProps<Payload = unknown> = Menu.RootProps<Payload>;
|
|
4
|
+
/**
|
|
5
|
+
* O estado do menu da coluna: o `Menu.Root` do `ui`, para o menu inteiro sair do mesmo namespace.
|
|
6
|
+
* Não renderiza elemento.
|
|
7
|
+
*
|
|
8
|
+
* Vai dentro da `DataTable.HeaderCell`, no lugar do `DataTable.SortTrigger`: numa coluna com
|
|
9
|
+
* menu, o clique no header abre o menu, e a ordenação passa para os itens dele.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <DataTable.Header table={table}>
|
|
14
|
+
* {(header) => (
|
|
15
|
+
* <DataTable.HeaderCell header={header}>
|
|
16
|
+
* <ColumnMenu.Root>
|
|
17
|
+
* <ColumnMenu.Trigger header={header}>
|
|
18
|
+
* <DataTable.HeaderContent header={header} />
|
|
19
|
+
* <DataTable.SortIndicator header={header} />
|
|
20
|
+
* </ColumnMenu.Trigger>
|
|
21
|
+
* <ColumnMenu.Popup header={header} />
|
|
22
|
+
* </ColumnMenu.Root>
|
|
23
|
+
* <DataTable.ResizeHandle header={header} />
|
|
24
|
+
* </DataTable.HeaderCell>
|
|
25
|
+
* )}
|
|
26
|
+
* </DataTable.Header>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare const ColumnMenuRoot: {
|
|
30
|
+
<Payload extends unknown = unknown>(props: ColumnMenuRootProps<Payload>): import("react").JSX.Element;
|
|
31
|
+
displayName: string;
|
|
32
|
+
};
|
|
33
|
+
//#endregion
|
|
34
|
+
//# sourceMappingURL=column-menu-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-menu-root.d.ts","names":[],"sources":["../../../src/components/column-menu/column-menu-root.tsx"],"mappings":";;YAGY,oBAAoB,qBAAqB,KAAK,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2BvD;GAAkB,mCAAO,OAC7B,oBAAoB,2BAAQ,IAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Menu } from "@lucasbernardosn/react-ui/overlays/menu";
|
|
3
|
+
//#region src/components/column-menu/column-menu-root.tsx
|
|
4
|
+
/**
|
|
5
|
+
* O estado do menu da coluna: o `Menu.Root` do `ui`, para o menu inteiro sair do mesmo namespace.
|
|
6
|
+
* Não renderiza elemento.
|
|
7
|
+
*
|
|
8
|
+
* Vai dentro da `DataTable.HeaderCell`, no lugar do `DataTable.SortTrigger`: numa coluna com
|
|
9
|
+
* menu, o clique no header abre o menu, e a ordenação passa para os itens dele.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <DataTable.Header table={table}>
|
|
14
|
+
* {(header) => (
|
|
15
|
+
* <DataTable.HeaderCell header={header}>
|
|
16
|
+
* <ColumnMenu.Root>
|
|
17
|
+
* <ColumnMenu.Trigger header={header}>
|
|
18
|
+
* <DataTable.HeaderContent header={header} />
|
|
19
|
+
* <DataTable.SortIndicator header={header} />
|
|
20
|
+
* </ColumnMenu.Trigger>
|
|
21
|
+
* <ColumnMenu.Popup header={header} />
|
|
22
|
+
* </ColumnMenu.Root>
|
|
23
|
+
* <DataTable.ResizeHandle header={header} />
|
|
24
|
+
* </DataTable.HeaderCell>
|
|
25
|
+
* )}
|
|
26
|
+
* </DataTable.Header>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
const ColumnMenuRoot = (props) => {
|
|
30
|
+
return /* @__PURE__ */ jsx(Menu.Root, { ...props });
|
|
31
|
+
};
|
|
32
|
+
ColumnMenuRoot.displayName = "ColumnMenu.Root";
|
|
33
|
+
//#endregion
|
|
34
|
+
export { ColumnMenuRoot };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=column-menu-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-menu-root.js","names":[],"sources":["../../../src/components/column-menu/column-menu-root.tsx"],"sourcesContent":["import { Menu } from '@lucasbernardosn/react-ui/overlays/menu';\nimport type { AnyType } from '@lucasbernardosn/utils';\n\nexport type ColumnMenuRootProps<Payload = unknown> = Menu.RootProps<Payload>;\n\n/**\n * O estado do menu da coluna: o `Menu.Root` do `ui`, para o menu inteiro sair do mesmo namespace.\n * Não renderiza elemento.\n *\n * Vai dentro da `DataTable.HeaderCell`, no lugar do `DataTable.SortTrigger`: numa coluna com\n * menu, o clique no header abre o menu, e a ordenação passa para os itens dele.\n *\n * @example\n * ```tsx\n * <DataTable.Header table={table}>\n * {(header) => (\n * <DataTable.HeaderCell header={header}>\n * <ColumnMenu.Root>\n * <ColumnMenu.Trigger header={header}>\n * <DataTable.HeaderContent header={header} />\n * <DataTable.SortIndicator header={header} />\n * </ColumnMenu.Trigger>\n * <ColumnMenu.Popup header={header} />\n * </ColumnMenu.Root>\n * <DataTable.ResizeHandle header={header} />\n * </DataTable.HeaderCell>\n * )}\n * </DataTable.Header>\n * ```\n */\nexport const ColumnMenuRoot = <Payload extends AnyType = unknown>(\n props: ColumnMenuRootProps<Payload>,\n) => {\n return <Menu.Root<Payload> {...props} />;\n};\n\nColumnMenuRoot.displayName = 'ColumnMenu.Root';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAa,kBACX,UACG;CACH,OAAO,oBAAC,KAAK,MAAN,EAAoB,GAAI,MAAQ,CAAA;AACzC;AAEA,eAAe,cAAc"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ColumnWith } from "../../types/table-with.js";
|
|
2
|
+
import "../../types/index.js";
|
|
3
|
+
import { ColumnMenuLabels } from "./column-menu-labels.js";
|
|
4
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
5
|
+
import { Menu } from "@lucasbernardosn/react-ui/overlays/menu";
|
|
6
|
+
import React from "react";
|
|
7
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
8
|
+
//#region src/components/column-menu/column-menu-sort-items.d.ts
|
|
9
|
+
export type ColumnMenuSortItemsProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<Menu.GroupProps, {
|
|
10
|
+
/** A coluna. Exige `rowSortingFeature`. */
|
|
11
|
+
column: ColumnWith<TFeatures, TData, 'rowSortingFeature'>;
|
|
12
|
+
/** O texto dos itens; os que faltam ficam com o padrão. */
|
|
13
|
+
labels?: Partial<ColumnMenuLabels>;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Os itens da ordenação: crescente e decrescente, com um check na direção atual, e "Remover
|
|
17
|
+
* ordenação" com a coluna ordenada. Com `enableSortingRemoval: false` na tabela, que deixa a
|
|
18
|
+
* lista sempre ordenada, o "Remover ordenação" não aparece. O item troca a ordenação inteira por esta coluna; com Shift
|
|
19
|
+
* (ou o `isMultiSortEvent` da tabela), soma a coluna à ordenação múltipla, como o
|
|
20
|
+
* `DataTable.SortTrigger`.
|
|
21
|
+
*
|
|
22
|
+
* O check é só visual: a direção chega ao leitor de tela pelo `aria-sort` da
|
|
23
|
+
* `DataTable.HeaderCell`. Numa coluna que não ordena, não renderiza.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ColumnMenuSortItems: {
|
|
26
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: ColumnMenuSortItemsProps<TFeatures, TData>): React.JSX.Element | null;
|
|
27
|
+
displayName: string;
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
//# sourceMappingURL=column-menu-sort-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-menu-sort-items.d.ts","names":[],"sources":["../../../src/components/column-menu/column-menu-sort-items.tsx"],"mappings":";;;;;;;;YAcY,yBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,KAAK;;EAGH,QAAQ,WAAW,WAAW;;EAE9B,SAAS,QAAQ;;;;;;;;;;;;qBAcR;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,yBAAyB,WAAW,SAAM,MAAA,IAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ColumnMenuCheck } from "./column-menu-check.js";
|
|
2
|
+
import { COLUMN_MENU_DEFAULT_LABELS } from "./column-menu-labels.js";
|
|
3
|
+
import { Icon } from "@lucasbernardosn/react-ui/display/icon";
|
|
4
|
+
import { CaretDownIcon, CaretUpIcon, XIcon } from "@phosphor-icons/react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Menu } from "@lucasbernardosn/react-ui/overlays/menu";
|
|
7
|
+
import { useSelector } from "@tanstack/react-store";
|
|
8
|
+
//#region src/components/column-menu/column-menu-sort-items.tsx
|
|
9
|
+
/**
|
|
10
|
+
* Os itens da ordenação: crescente e decrescente, com um check na direção atual, e "Remover
|
|
11
|
+
* ordenação" com a coluna ordenada. Com `enableSortingRemoval: false` na tabela, que deixa a
|
|
12
|
+
* lista sempre ordenada, o "Remover ordenação" não aparece. O item troca a ordenação inteira por esta coluna; com Shift
|
|
13
|
+
* (ou o `isMultiSortEvent` da tabela), soma a coluna à ordenação múltipla, como o
|
|
14
|
+
* `DataTable.SortTrigger`.
|
|
15
|
+
*
|
|
16
|
+
* O check é só visual: a direção chega ao leitor de tela pelo `aria-sort` da
|
|
17
|
+
* `DataTable.HeaderCell`. Numa coluna que não ordena, não renderiza.
|
|
18
|
+
*/
|
|
19
|
+
const ColumnMenuSortItems = (props) => {
|
|
20
|
+
const { column, labels, ...rest } = props;
|
|
21
|
+
/** Re-renderiza quando a direção desta coluna muda. */
|
|
22
|
+
const sorted = useSelector(column.table.atoms.sorting, () => column.getIsSorted());
|
|
23
|
+
if (!column.getCanSort()) return null;
|
|
24
|
+
const canRemoveSorting = column.table.options.enableSortingRemoval !== false;
|
|
25
|
+
const getLabel = (key) => labels?.[key] ?? COLUMN_MENU_DEFAULT_LABELS[key];
|
|
26
|
+
/** O mesmo critério do clique no header para somar a coluna à ordenação múltipla. */
|
|
27
|
+
const toggleSorting = (isDesc, event) => {
|
|
28
|
+
const isMulti = column.getCanMultiSort() && (column.table.options.isMultiSortEvent?.(event) ?? false);
|
|
29
|
+
column.toggleSorting(isDesc, isMulti);
|
|
30
|
+
};
|
|
31
|
+
return /* @__PURE__ */ jsxs(Menu.Group, {
|
|
32
|
+
"data-component": "ColumnMenu.SortItems",
|
|
33
|
+
...rest,
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsxs(Menu.Item, {
|
|
36
|
+
onClick: (event) => toggleSorting(false, event),
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsx(Icon, { render: /* @__PURE__ */ jsx(CaretUpIcon, {}) }),
|
|
39
|
+
getLabel("sortAsc"),
|
|
40
|
+
sorted === "asc" && /* @__PURE__ */ jsx(ColumnMenuCheck, {})
|
|
41
|
+
]
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ jsxs(Menu.Item, {
|
|
44
|
+
onClick: (event) => toggleSorting(true, event),
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ jsx(Icon, { render: /* @__PURE__ */ jsx(CaretDownIcon, {}) }),
|
|
47
|
+
getLabel("sortDesc"),
|
|
48
|
+
sorted === "desc" && /* @__PURE__ */ jsx(ColumnMenuCheck, {})
|
|
49
|
+
]
|
|
50
|
+
}),
|
|
51
|
+
sorted && canRemoveSorting && /* @__PURE__ */ jsxs(Menu.Item, {
|
|
52
|
+
onClick: () => column.clearSorting(),
|
|
53
|
+
children: [/* @__PURE__ */ jsx(Icon, { render: /* @__PURE__ */ jsx(XIcon, {}) }), getLabel("clearSorting")]
|
|
54
|
+
})
|
|
55
|
+
]
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
ColumnMenuSortItems.displayName = "ColumnMenu.SortItems";
|
|
59
|
+
//#endregion
|
|
60
|
+
export { ColumnMenuSortItems };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=column-menu-sort-items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-menu-sort-items.js","names":[],"sources":["../../../src/components/column-menu/column-menu-sort-items.tsx"],"sourcesContent":["import { Icon } from '@lucasbernardosn/react-ui/display/icon';\nimport { Menu } from '@lucasbernardosn/react-ui/overlays/menu';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { CaretDownIcon, CaretUpIcon, XIcon } from '@phosphor-icons/react';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport type { ColumnWith } from '../../types';\nimport { ColumnMenuCheck } from './column-menu-check';\nimport {\n COLUMN_MENU_DEFAULT_LABELS,\n type ColumnMenuLabels,\n} from './column-menu-labels';\n\nexport type ColumnMenuSortItemsProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n Menu.GroupProps,\n {\n /** A coluna. Exige `rowSortingFeature`. */\n column: ColumnWith<TFeatures, TData, 'rowSortingFeature'>;\n /** O texto dos itens; os que faltam ficam com o padrão. */\n labels?: Partial<ColumnMenuLabels>;\n }\n>;\n\n/**\n * Os itens da ordenação: crescente e decrescente, com um check na direção atual, e \"Remover\n * ordenação\" com a coluna ordenada. Com `enableSortingRemoval: false` na tabela, que deixa a\n * lista sempre ordenada, o \"Remover ordenação\" não aparece. O item troca a ordenação inteira por esta coluna; com Shift\n * (ou o `isMultiSortEvent` da tabela), soma a coluna à ordenação múltipla, como o\n * `DataTable.SortTrigger`.\n *\n * O check é só visual: a direção chega ao leitor de tela pelo `aria-sort` da\n * `DataTable.HeaderCell`. Numa coluna que não ordena, não renderiza.\n */\nexport const ColumnMenuSortItems = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: ColumnMenuSortItemsProps<TFeatures, TData>,\n) => {\n const { column, labels, ...rest } = props;\n\n /** Re-renderiza quando a direção desta coluna muda. */\n const sorted = useSelector(column.table.atoms.sorting, () =>\n column.getIsSorted(),\n );\n\n if (!column.getCanSort()) {\n return null;\n }\n\n const canRemoveSorting = column.table.options.enableSortingRemoval !== false;\n\n const getLabel = (key: keyof ColumnMenuLabels) =>\n labels?.[key] ?? COLUMN_MENU_DEFAULT_LABELS[key];\n\n /** O mesmo critério do clique no header para somar a coluna à ordenação múltipla. */\n const toggleSorting = (isDesc: boolean, event: React.MouseEvent) => {\n const isMulti =\n column.getCanMultiSort() &&\n (column.table.options.isMultiSortEvent?.(event) ?? false);\n\n column.toggleSorting(isDesc, isMulti);\n };\n\n return (\n <Menu.Group\n data-component=\"ColumnMenu.SortItems\"\n {...rest}\n >\n <Menu.Item onClick={(event) => toggleSorting(false, event)}>\n <Icon render={<CaretUpIcon />} />\n {getLabel('sortAsc')}\n {sorted === 'asc' && <ColumnMenuCheck />}\n </Menu.Item>\n\n <Menu.Item onClick={(event) => toggleSorting(true, event)}>\n <Icon render={<CaretDownIcon />} />\n {getLabel('sortDesc')}\n {sorted === 'desc' && <ColumnMenuCheck />}\n </Menu.Item>\n\n {sorted && canRemoveSorting && (\n <Menu.Item onClick={() => column.clearSorting()}>\n <Icon render={<XIcon />} />\n {getLabel('clearSorting')}\n </Menu.Item>\n )}\n </Menu.Group>\n );\n};\n\nColumnMenuSortItems.displayName = 'ColumnMenu.SortItems';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqCA,MAAa,uBAIX,UACG;CACH,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS;;CAGpC,MAAM,SAAS,YAAY,OAAO,MAAM,MAAM,eAC5C,OAAO,YAAY,CACrB;CAEA,IAAI,CAAC,OAAO,WAAW,GACrB,OAAO;CAGT,MAAM,mBAAmB,OAAO,MAAM,QAAQ,yBAAyB;CAEvE,MAAM,YAAY,QAChB,SAAS,QAAQ,2BAA2B;;CAG9C,MAAM,iBAAiB,QAAiB,UAA4B;EAClE,MAAM,UACJ,OAAO,gBAAgB,MACtB,OAAO,MAAM,QAAQ,mBAAmB,KAAK,KAAK;EAErD,OAAO,cAAc,QAAQ,OAAO;CACtC;CAEA,OACE,qBAAC,KAAK,OAAN;EACE,kBAAe;EACf,GAAI;EAFN,UAAA;GAIE,qBAAC,KAAK,MAAN;IAAW,UAAU,UAAU,cAAc,OAAO,KAAK;IAAzD,UAAA;KACE,oBAAC,MAAD,EAAM,QAAQ,oBAAC,aAAD,CAAc,CAAA,EAAI,CAAA;KAC/B,SAAS,SAAS;KAClB,WAAW,SAAS,oBAAC,iBAAD,CAAkB,CAAA;IAC9B;;GAEX,qBAAC,KAAK,MAAN;IAAW,UAAU,UAAU,cAAc,MAAM,KAAK;IAAxD,UAAA;KACE,oBAAC,MAAD,EAAM,QAAQ,oBAAC,eAAD,CAAgB,CAAA,EAAI,CAAA;KACjC,SAAS,UAAU;KACnB,WAAW,UAAU,oBAAC,iBAAD,CAAkB,CAAA;IAC/B;;GAEV,UAAU,oBACT,qBAAC,KAAK,MAAN;IAAW,eAAe,OAAO,aAAa;IAA9C,UAAA,CACE,oBAAC,MAAD,EAAM,QAAQ,oBAAC,OAAD,CAAQ,CAAA,EAAI,CAAA,GACzB,SAAS,cAAc,CACf;;EAEH;;AAEhB;AAEA,oBAAoB,cAAc"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Header, RowData, TableFeatures } from "@tanstack/react-table";
|
|
2
|
+
import { Menu } from "@lucasbernardosn/react-ui/overlays/menu";
|
|
3
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
4
|
+
//#region src/components/column-menu/column-menu-trigger.d.ts
|
|
5
|
+
export type ColumnMenuTriggerProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<Menu.TriggerProps, {
|
|
6
|
+
/** O header da coluna. */
|
|
7
|
+
header: Header<TFeatures, TData>;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* O botão que abre o menu da coluna: o `DataTable.HeaderButton`, do tamanho da célula do header,
|
|
11
|
+
* com o `Menu.Trigger`. Os filhos são o que ele mostra, em geral o `DataTable.HeaderContent` e o
|
|
12
|
+
* `DataTable.SortIndicator`.
|
|
13
|
+
*
|
|
14
|
+
* Com `rowSortingFeature`, marca a direção em `data-sorted` e, numa coluna `align: 'end'`,
|
|
15
|
+
* inverte a ordem dos filhos, como o `DataTable.SortTrigger`. Enquanto o menu está aberto, o
|
|
16
|
+
* fundo fica no do hover.
|
|
17
|
+
*/
|
|
18
|
+
export declare const ColumnMenuTrigger: {
|
|
19
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: ColumnMenuTriggerProps<TFeatures, TData>): import("react").JSX.Element;
|
|
20
|
+
displayName: string;
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
//# sourceMappingURL=column-menu-trigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-menu-trigger.d.ts","names":[],"sources":["../../../src/components/column-menu/column-menu-trigger.tsx"],"mappings":";;;;YASY,uBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,KAAK;;EAGH,QAAQ,OAAO,WAAW;;;;;;;;;;;qBAajB;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,uBAAuB,WAAW,yBAAM,IAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { hasHeaderFeature } from "../../utils/has-feature.js";
|
|
2
|
+
import { DataTableHeaderButton } from "../data-table/header/data-table-header-button.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { mergeProps } from "@base-ui/react";
|
|
5
|
+
import { Menu } from "@lucasbernardosn/react-ui/overlays/menu";
|
|
6
|
+
import { useSelector } from "@tanstack/react-store";
|
|
7
|
+
import { mergeStateClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
8
|
+
//#region src/components/column-menu/column-menu-trigger.tsx
|
|
9
|
+
/**
|
|
10
|
+
* O botão que abre o menu da coluna: o `DataTable.HeaderButton`, do tamanho da célula do header,
|
|
11
|
+
* com o `Menu.Trigger`. Os filhos são o que ele mostra, em geral o `DataTable.HeaderContent` e o
|
|
12
|
+
* `DataTable.SortIndicator`.
|
|
13
|
+
*
|
|
14
|
+
* Com `rowSortingFeature`, marca a direção em `data-sorted` e, numa coluna `align: 'end'`,
|
|
15
|
+
* inverte a ordem dos filhos, como o `DataTable.SortTrigger`. Enquanto o menu está aberto, o
|
|
16
|
+
* fundo fica no do hover.
|
|
17
|
+
*/
|
|
18
|
+
const ColumnMenuTrigger = (props) => {
|
|
19
|
+
const { header, className, ...rest } = props;
|
|
20
|
+
const baseProps = {
|
|
21
|
+
"data-component": "ColumnMenu.Trigger",
|
|
22
|
+
"data-sorted": useSelector(header.column.table.store, () => hasHeaderFeature(header, "rowSortingFeature") ? header.column.getIsSorted() : false) || void 0,
|
|
23
|
+
className: mergeStateClassNames([
|
|
24
|
+
"in-data-[align=end]:flex-row-reverse",
|
|
25
|
+
"data-sorted:text-gray-12",
|
|
26
|
+
"data-popup-open:bg-gray-3"
|
|
27
|
+
], className)
|
|
28
|
+
};
|
|
29
|
+
return /* @__PURE__ */ jsx(Menu.Trigger, {
|
|
30
|
+
render: /* @__PURE__ */ jsx(DataTableHeaderButton, {}),
|
|
31
|
+
...mergeProps(baseProps, rest)
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
ColumnMenuTrigger.displayName = "ColumnMenu.Trigger";
|
|
35
|
+
//#endregion
|
|
36
|
+
export { ColumnMenuTrigger };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=column-menu-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-menu-trigger.js","names":[],"sources":["../../../src/components/column-menu/column-menu-trigger.tsx"],"sourcesContent":["import { mergeProps } from '@base-ui/react';\nimport { Menu } from '@lucasbernardosn/react-ui/overlays/menu';\nimport { mergeStateClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { Header, RowData, TableFeatures } from '@tanstack/react-table';\nimport { hasHeaderFeature } from '../../utils';\nimport { DataTableHeaderButton } from '../data-table/header/data-table-header-button';\n\nexport type ColumnMenuTriggerProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n Menu.TriggerProps,\n {\n /** O header da coluna. */\n header: Header<TFeatures, TData>;\n }\n>;\n\n/**\n * O botão que abre o menu da coluna: o `DataTable.HeaderButton`, do tamanho da célula do header,\n * com o `Menu.Trigger`. Os filhos são o que ele mostra, em geral o `DataTable.HeaderContent` e o\n * `DataTable.SortIndicator`.\n *\n * Com `rowSortingFeature`, marca a direção em `data-sorted` e, numa coluna `align: 'end'`,\n * inverte a ordem dos filhos, como o `DataTable.SortTrigger`. Enquanto o menu está aberto, o\n * fundo fica no do hover.\n */\nexport const ColumnMenuTrigger = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: ColumnMenuTriggerProps<TFeatures, TData>,\n) => {\n const { header, className, ...rest } = props;\n\n /**\n * Re-renderiza quando a direção desta coluna muda. A ordenação é opcional, então assina o\n * store.\n */\n const sorted = useSelector(header.column.table.store, () =>\n hasHeaderFeature(header, 'rowSortingFeature')\n ? header.column.getIsSorted()\n : false,\n );\n\n const baseProps = {\n 'data-component': 'ColumnMenu.Trigger',\n 'data-sorted': sorted || undefined,\n className: mergeStateClassNames(\n [\n // Os mesmos do `DataTable.SortTrigger`, onde estão explicados.\n 'in-data-[align=end]:flex-row-reverse',\n 'data-sorted:text-gray-12',\n\n 'data-popup-open:bg-gray-3',\n ],\n className,\n ),\n };\n\n return (\n <Menu.Trigger\n render={<DataTableHeaderButton />}\n {...mergeProps(baseProps, rest)}\n />\n );\n};\n\nColumnMenuTrigger.displayName = 'ColumnMenu.Trigger';\n"],"mappings":";;;;;;;;;;;;;;;;;AA6BA,MAAa,qBAIX,UACG;CACH,MAAM,EAAE,QAAQ,WAAW,GAAG,SAAS;CAYvC,MAAM,YAAY;EAChB,kBAAkB;EAClB,eARa,YAAY,OAAO,OAAO,MAAM,aAC7C,iBAAiB,QAAQ,mBAAmB,IACxC,OAAO,OAAO,YAAY,IAC1B,KAKgB,KAAK,KAAA;EACzB,WAAW,qBACT;GAEE;GACA;GAEA;EACF,GACA,SACF;CACF;CAEA,OACE,oBAAC,KAAK,SAAN;EACE,QAAQ,oBAAC,uBAAD,CAAwB,CAAA;EAChC,GAAI,WAAW,WAAW,IAAI;CAC/B,CAAA;AAEL;AAEA,kBAAkB,cAAc"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ColumnMenuLabels } from "./column-menu-labels.js";
|
|
2
|
+
import { ColumnMenuHideItem, ColumnMenuHideItemProps } from "./column-menu-hide-item.js";
|
|
3
|
+
import { ColumnMenuPinItems, ColumnMenuPinItemsProps } from "./column-menu-pin-items.js";
|
|
4
|
+
import { ColumnMenuPopup, ColumnMenuPopupProps } from "./column-menu-popup.js";
|
|
5
|
+
import { ColumnMenuRoot, ColumnMenuRootProps } from "./column-menu-root.js";
|
|
6
|
+
import { ColumnMenuSortItems, ColumnMenuSortItemsProps } from "./column-menu-sort-items.js";
|
|
7
|
+
import { ColumnMenuTrigger, ColumnMenuTriggerProps } from "./column-menu-trigger.js";
|
|
8
|
+
declare namespace index_parts_d_exports {
|
|
9
|
+
export { ColumnMenuHideItem as HideItem, ColumnMenuHideItemProps as HideItemProps, ColumnMenuLabels as Labels, ColumnMenuPinItems as PinItems, ColumnMenuPinItemsProps as PinItemsProps, ColumnMenuPopup as Popup, ColumnMenuPopupProps as PopupProps, ColumnMenuRoot as Root, ColumnMenuRootProps as RootProps, ColumnMenuSortItems as SortItems, ColumnMenuSortItemsProps as SortItemsProps, ColumnMenuTrigger as Trigger, ColumnMenuTriggerProps as TriggerProps };
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { ColumnMenuHideItem as HideItem, type ColumnMenuHideItemProps as HideItemProps, type ColumnMenuLabels as Labels, ColumnMenuPinItems as PinItems, type ColumnMenuPinItemsProps as PinItemsProps, ColumnMenuPopup as Popup, type ColumnMenuPopupProps as PopupProps, ColumnMenuRoot as Root, type ColumnMenuRootProps as RootProps, ColumnMenuSortItems as SortItems, type ColumnMenuSortItemsProps as SortItemsProps, ColumnMenuTrigger as Trigger, type ColumnMenuTriggerProps as TriggerProps, index_parts_d_exports };
|
|
13
|
+
//# sourceMappingURL=index.parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.parts.d.ts","names":[],"sources":["../../../src/components/column-menu/index.parts.ts"],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { ColumnMenuHideItem } from "./column-menu-hide-item.js";
|
|
3
|
+
import { ColumnMenuPinItems } from "./column-menu-pin-items.js";
|
|
4
|
+
import { ColumnMenuSortItems } from "./column-menu-sort-items.js";
|
|
5
|
+
import { ColumnMenuPopup } from "./column-menu-popup.js";
|
|
6
|
+
import { ColumnMenuRoot } from "./column-menu-root.js";
|
|
7
|
+
import { ColumnMenuTrigger } from "./column-menu-trigger.js";
|
|
8
|
+
//#region src/components/column-menu/index.parts.ts
|
|
9
|
+
var index_parts_exports = /* @__PURE__ */ __exportAll({
|
|
10
|
+
HideItem: () => ColumnMenuHideItem,
|
|
11
|
+
PinItems: () => ColumnMenuPinItems,
|
|
12
|
+
Popup: () => ColumnMenuPopup,
|
|
13
|
+
Root: () => ColumnMenuRoot,
|
|
14
|
+
SortItems: () => ColumnMenuSortItems,
|
|
15
|
+
Trigger: () => ColumnMenuTrigger
|
|
16
|
+
});
|
|
17
|
+
//#endregion
|
|
18
|
+
export { ColumnMenuHideItem as HideItem, ColumnMenuPinItems as PinItems, ColumnMenuPopup as Popup, ColumnMenuRoot as Root, ColumnMenuSortItems as SortItems, ColumnMenuTrigger as Trigger, index_parts_exports };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=index.parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.parts.js","names":[],"sources":["../../../src/components/column-menu/index.parts.ts"],"sourcesContent":["export { ColumnMenuHideItem as HideItem } from './column-menu-hide-item';\nexport { ColumnMenuPinItems as PinItems } from './column-menu-pin-items';\nexport { ColumnMenuPopup as Popup } from './column-menu-popup';\nexport { ColumnMenuRoot as Root } from './column-menu-root';\nexport { ColumnMenuSortItems as SortItems } from './column-menu-sort-items';\nexport { ColumnMenuTrigger as Trigger } from './column-menu-trigger';\n\n/* types */\n\nexport type { ColumnMenuHideItemProps as HideItemProps } from './column-menu-hide-item';\nexport type { ColumnMenuLabels as Labels } from './column-menu-labels';\nexport type { ColumnMenuPinItemsProps as PinItemsProps } from './column-menu-pin-items';\nexport type { ColumnMenuPopupProps as PopupProps } from './column-menu-popup';\nexport type { ColumnMenuRootProps as RootProps } from './column-menu-root';\nexport type { ColumnMenuSortItemsProps as SortItemsProps } from './column-menu-sort-items';\nexport type { ColumnMenuTriggerProps as TriggerProps } from './column-menu-trigger';\n"],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ColumnWith } from "../../types/table-with.js";
|
|
2
|
+
import "../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { useRender } from "@base-ui/react";
|
|
5
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
6
|
+
//#region src/components/columns-panel/columns-panel-item.d.ts
|
|
7
|
+
export type ColumnsPanelItemProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'li'>, {
|
|
8
|
+
/** A coluna. Exige `columnVisibilityFeature`. */
|
|
9
|
+
column: ColumnWith<TFeatures, TData, 'columnVisibilityFeature'>;
|
|
10
|
+
/** A posição da coluna no grupo dela (fixadas no início, centro ou fixadas no fim). */
|
|
11
|
+
index: number;
|
|
12
|
+
/**
|
|
13
|
+
* O nome da coluna.
|
|
14
|
+
* @default getDefaultColumnLabel(column): o `header` quando é texto, e o id quando não é
|
|
15
|
+
*/
|
|
16
|
+
label?: string;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Uma coluna no `ColumnsPanel.Root`: o checkbox de visibilidade, o nome e, à direita, a alça de
|
|
20
|
+
* arrastar. Só a alça pega o arrasto; o resto fica livre para o clique no checkbox. Uma coluna com
|
|
21
|
+
* `enableHiding: false` fica com o checkbox desabilitado.
|
|
22
|
+
*
|
|
23
|
+
* Com `columnPinningFeature`, um alfinete antes da alça abre o menu da fixação, com os itens do
|
|
24
|
+
* `ColumnMenu.PinItems`: fixa e solta a coluna sem o header, como nos cards ou numa coluna sem o
|
|
25
|
+
* menu da coluna. Preenchido, a coluna está fixada. A fixada não tem alça e não se arrasta: o
|
|
26
|
+
* `columnOrder` só ordena as colunas do centro, e as fixadas ficam nas pontas. Numa coluna com
|
|
27
|
+
* `enablePinning: false`, o alfinete não aparece.
|
|
28
|
+
*/
|
|
29
|
+
export declare const ColumnsPanelItem: {
|
|
30
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: ColumnsPanelItemProps<TFeatures, TData>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
31
|
+
displayName: string;
|
|
32
|
+
};
|
|
33
|
+
//#endregion
|
|
34
|
+
//# sourceMappingURL=columns-panel-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns-panel-item.d.ts","names":[],"sources":["../../../src/components/columns-panel/columns-panel-item.tsx"],"mappings":";;;;;;YAcY,sBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,QAAQ,WAAW,WAAW;;EAE9B;;;;;EAKA;;;;;;;;;;;;;qBAeS;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,sBAAsB,WAAW,yBAAM,+CAAA"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { getDefaultColumnLabel } from "../../utils/get-default-column-label.js";
|
|
2
|
+
import { hasColumnFeature } from "../../utils/has-feature.js";
|
|
3
|
+
import { ColumnMenuPinItems } from "../column-menu/column-menu-pin-items.js";
|
|
4
|
+
import { ListIcon, PushPinIcon } from "@phosphor-icons/react";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
7
|
+
import { Menu } from "@lucasbernardosn/react-ui/overlays/menu";
|
|
8
|
+
import { useSelector } from "@tanstack/react-store";
|
|
9
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
10
|
+
import { useSortable } from "@dnd-kit/react/sortable";
|
|
11
|
+
import { IconButton } from "@lucasbernardosn/react-ui/buttons/icon-button";
|
|
12
|
+
import { Checkbox } from "@lucasbernardosn/react-ui/fields/checkbox";
|
|
13
|
+
//#region src/components/columns-panel/columns-panel-item.tsx
|
|
14
|
+
/**
|
|
15
|
+
* Uma coluna no `ColumnsPanel.Root`: o checkbox de visibilidade, o nome e, à direita, a alça de
|
|
16
|
+
* arrastar. Só a alça pega o arrasto; o resto fica livre para o clique no checkbox. Uma coluna com
|
|
17
|
+
* `enableHiding: false` fica com o checkbox desabilitado.
|
|
18
|
+
*
|
|
19
|
+
* Com `columnPinningFeature`, um alfinete antes da alça abre o menu da fixação, com os itens do
|
|
20
|
+
* `ColumnMenu.PinItems`: fixa e solta a coluna sem o header, como nos cards ou numa coluna sem o
|
|
21
|
+
* menu da coluna. Preenchido, a coluna está fixada. A fixada não tem alça e não se arrasta: o
|
|
22
|
+
* `columnOrder` só ordena as colunas do centro, e as fixadas ficam nas pontas. Numa coluna com
|
|
23
|
+
* `enablePinning: false`, o alfinete não aparece.
|
|
24
|
+
*/
|
|
25
|
+
const ColumnsPanelItem = (props) => {
|
|
26
|
+
const { column, index, label, render, className, ref, ...rest } = props;
|
|
27
|
+
/** Re-renderiza quando esta coluna aparece ou some. */
|
|
28
|
+
const isVisible = useSelector(column.table.atoms.columnVisibility, () => column.getIsVisible());
|
|
29
|
+
/**
|
|
30
|
+
* Re-renderiza quando esta coluna é fixada ou solta. O pinning é opcional, então assina o
|
|
31
|
+
* store.
|
|
32
|
+
*/
|
|
33
|
+
const pinned = useSelector(column.table.store, () => hasColumnFeature(column, "columnPinningFeature") ? column.getIsPinned() : false);
|
|
34
|
+
const columnLabel = label ?? getDefaultColumnLabel(column);
|
|
35
|
+
/** O grupo separa as regiões: o arrasto não leva uma coluna do centro para as fixadas. */
|
|
36
|
+
const sortable = useSortable({
|
|
37
|
+
id: column.id,
|
|
38
|
+
index,
|
|
39
|
+
group: pinned || "center",
|
|
40
|
+
disabled: pinned !== false
|
|
41
|
+
});
|
|
42
|
+
const baseProps = {
|
|
43
|
+
"data-component": "ColumnsPanel.Item",
|
|
44
|
+
"data-dragging": sortable.isDragging ? "" : void 0,
|
|
45
|
+
"data-pinned": pinned || void 0,
|
|
46
|
+
className: mergeTwClassNames([
|
|
47
|
+
"flex",
|
|
48
|
+
"h-8",
|
|
49
|
+
"items-center",
|
|
50
|
+
"gap-2",
|
|
51
|
+
"rounded-md",
|
|
52
|
+
"corner-squircle",
|
|
53
|
+
"ps-2",
|
|
54
|
+
"pe-1",
|
|
55
|
+
"text-sm",
|
|
56
|
+
"data-dragging:bg-gray-3",
|
|
57
|
+
"data-dragging:shadow-md"
|
|
58
|
+
], className),
|
|
59
|
+
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
60
|
+
/* @__PURE__ */ jsxs("label", {
|
|
61
|
+
className: "flex min-w-0 flex-1 items-center gap-2 select-none",
|
|
62
|
+
children: [/* @__PURE__ */ jsx(Checkbox.Root, {
|
|
63
|
+
checked: isVisible,
|
|
64
|
+
disabled: !column.getCanHide(),
|
|
65
|
+
onCheckedChange: (checked) => column.toggleVisibility(checked),
|
|
66
|
+
children: /* @__PURE__ */ jsx(Checkbox.Indicator, {})
|
|
67
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
68
|
+
className: isVisible ? "truncate" : "truncate text-gray-11",
|
|
69
|
+
children: columnLabel
|
|
70
|
+
})]
|
|
71
|
+
}),
|
|
72
|
+
hasColumnFeature(column, "columnPinningFeature") && column.getCanPin() && /* @__PURE__ */ jsxs(Menu.Root, { children: [/* @__PURE__ */ jsx(Menu.Trigger, { render: /* @__PURE__ */ jsx(IconButton, {
|
|
73
|
+
variant: "ghost",
|
|
74
|
+
size: "2xs",
|
|
75
|
+
icon: /* @__PURE__ */ jsx(PushPinIcon, { weight: pinned ? "fill" : "regular" }),
|
|
76
|
+
"aria-label": `Fixação da coluna ${columnLabel}`,
|
|
77
|
+
className: pinned ? "text-gray-12" : "text-gray-11"
|
|
78
|
+
}) }), /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, {
|
|
79
|
+
align: "end",
|
|
80
|
+
children: /* @__PURE__ */ jsx(Menu.Popup, {
|
|
81
|
+
className: "min-w-48",
|
|
82
|
+
children: /* @__PURE__ */ jsx(ColumnMenuPinItems, { column })
|
|
83
|
+
})
|
|
84
|
+
}) })] }),
|
|
85
|
+
pinned === false ? /* @__PURE__ */ jsx(IconButton, {
|
|
86
|
+
ref: sortable.handleRef,
|
|
87
|
+
variant: "ghost",
|
|
88
|
+
size: "2xs",
|
|
89
|
+
icon: /* @__PURE__ */ jsx(ListIcon, {}),
|
|
90
|
+
"aria-label": `Mover a coluna ${columnLabel}`,
|
|
91
|
+
className: "cursor-grab touch-none text-gray-11 active:cursor-grabbing"
|
|
92
|
+
}) : /* @__PURE__ */ jsx("span", {
|
|
93
|
+
"aria-hidden": "true",
|
|
94
|
+
className: "inline-flex size-6 shrink-0"
|
|
95
|
+
})
|
|
96
|
+
] })
|
|
97
|
+
};
|
|
98
|
+
return useRender({
|
|
99
|
+
render,
|
|
100
|
+
ref: [sortable.ref, ref ?? null],
|
|
101
|
+
defaultTagName: "li",
|
|
102
|
+
props: mergeProps(baseProps, rest)
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
ColumnsPanelItem.displayName = "ColumnsPanel.Item";
|
|
106
|
+
//#endregion
|
|
107
|
+
export { ColumnsPanelItem };
|
|
108
|
+
|
|
109
|
+
//# sourceMappingURL=columns-panel-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns-panel-item.js","names":[],"sources":["../../../src/components/columns-panel/columns-panel-item.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { useSortable } from '@dnd-kit/react/sortable';\nimport { IconButton } from '@lucasbernardosn/react-ui/buttons/icon-button';\nimport { Checkbox } from '@lucasbernardosn/react-ui/fields/checkbox';\nimport { Menu } from '@lucasbernardosn/react-ui/overlays/menu';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { ListIcon, PushPinIcon } from '@phosphor-icons/react';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type { ColumnWith } from '../../types';\nimport { getDefaultColumnLabel, hasColumnFeature } from '../../utils';\nimport { ColumnMenuPinItems } from '../column-menu/column-menu-pin-items';\n\nexport type ColumnsPanelItemProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'li'>,\n {\n /** A coluna. Exige `columnVisibilityFeature`. */\n column: ColumnWith<TFeatures, TData, 'columnVisibilityFeature'>;\n /** A posição da coluna no grupo dela (fixadas no início, centro ou fixadas no fim). */\n index: number;\n /**\n * O nome da coluna.\n * @default getDefaultColumnLabel(column): o `header` quando é texto, e o id quando não é\n */\n label?: string;\n }\n>;\n\n/**\n * Uma coluna no `ColumnsPanel.Root`: o checkbox de visibilidade, o nome e, à direita, a alça de\n * arrastar. Só a alça pega o arrasto; o resto fica livre para o clique no checkbox. Uma coluna com\n * `enableHiding: false` fica com o checkbox desabilitado.\n *\n * Com `columnPinningFeature`, um alfinete antes da alça abre o menu da fixação, com os itens do\n * `ColumnMenu.PinItems`: fixa e solta a coluna sem o header, como nos cards ou numa coluna sem o\n * menu da coluna. Preenchido, a coluna está fixada. A fixada não tem alça e não se arrasta: o\n * `columnOrder` só ordena as colunas do centro, e as fixadas ficam nas pontas. Numa coluna com\n * `enablePinning: false`, o alfinete não aparece.\n */\nexport const ColumnsPanelItem = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: ColumnsPanelItemProps<TFeatures, TData>,\n) => {\n const { column, index, label, render, className, ref, ...rest } = props;\n\n /** Re-renderiza quando esta coluna aparece ou some. */\n const isVisible = useSelector(column.table.atoms.columnVisibility, () =>\n column.getIsVisible(),\n );\n\n /**\n * Re-renderiza quando esta coluna é fixada ou solta. O pinning é opcional, então assina o\n * store.\n */\n const pinned = useSelector(column.table.store, () =>\n hasColumnFeature(column, 'columnPinningFeature')\n ? column.getIsPinned()\n : false,\n );\n\n const columnLabel = label ?? getDefaultColumnLabel(column);\n\n /** O grupo separa as regiões: o arrasto não leva uma coluna do centro para as fixadas. */\n const sortable = useSortable({\n id: column.id,\n index,\n group: pinned || 'center',\n disabled: pinned !== false,\n });\n\n const baseProps = {\n 'data-component': 'ColumnsPanel.Item',\n 'data-dragging': sortable.isDragging ? '' : undefined,\n 'data-pinned': pinned || undefined,\n className: mergeTwClassNames(\n [\n 'flex',\n 'h-8',\n 'items-center',\n 'gap-2',\n\n 'rounded-md',\n 'corner-squircle',\n 'ps-2',\n 'pe-1',\n\n 'text-sm',\n\n // Em arrasto, destacada sobre as outras.\n 'data-dragging:bg-gray-3',\n 'data-dragging:shadow-md',\n ],\n className,\n ),\n children: (\n <>\n <label className=\"flex min-w-0 flex-1 items-center gap-2 select-none\">\n <Checkbox.Root\n checked={isVisible}\n disabled={!column.getCanHide()}\n onCheckedChange={(checked) => column.toggleVisibility(checked)}\n >\n <Checkbox.Indicator />\n </Checkbox.Root>\n\n <span className={isVisible ? 'truncate' : 'truncate text-gray-11'}>\n {columnLabel}\n </span>\n </label>\n\n {hasColumnFeature(column, 'columnPinningFeature') &&\n column.getCanPin() && (\n <Menu.Root>\n <Menu.Trigger\n render={\n <IconButton\n variant=\"ghost\"\n size=\"2xs\"\n icon={<PushPinIcon weight={pinned ? 'fill' : 'regular'} />}\n aria-label={`Fixação da coluna ${columnLabel}`}\n className={pinned ? 'text-gray-12' : 'text-gray-11'}\n />\n }\n />\n\n <Menu.Portal>\n <Menu.Positioner align=\"end\">\n <Menu.Popup className=\"min-w-48\">\n <ColumnMenuPinItems column={column} />\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n )}\n\n {pinned === false ? (\n <IconButton\n ref={sortable.handleRef}\n variant=\"ghost\"\n size=\"2xs\"\n icon={<ListIcon />}\n aria-label={`Mover a coluna ${columnLabel}`}\n // `touch-none`: no toque, o gesto arrasta em vez de rolar.\n className=\"cursor-grab touch-none text-gray-11 active:cursor-grabbing\"\n />\n ) : (\n // A fixada não se arrasta: o espaço da alça fica vazio, para o alfinete ficar alinhado\n // com o das outras.\n <span\n aria-hidden=\"true\"\n className=\"inline-flex size-6 shrink-0\"\n />\n )}\n </>\n ),\n };\n\n return useRender({\n render,\n ref: [sortable.ref, ref ?? null],\n defaultTagName: 'li',\n props: mergeProps(baseProps, rest),\n });\n};\n\nColumnsPanelItem.displayName = 'ColumnsPanel.Item';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAa,oBAIX,UACG;CACH,MAAM,EAAE,QAAQ,OAAO,OAAO,QAAQ,WAAW,KAAK,GAAG,SAAS;;CAGlE,MAAM,YAAY,YAAY,OAAO,MAAM,MAAM,wBAC/C,OAAO,aAAa,CACtB;;;;;CAMA,MAAM,SAAS,YAAY,OAAO,MAAM,aACtC,iBAAiB,QAAQ,sBAAsB,IAC3C,OAAO,YAAY,IACnB,KACN;CAEA,MAAM,cAAc,SAAS,sBAAsB,MAAM;;CAGzD,MAAM,WAAW,YAAY;EAC3B,IAAI,OAAO;EACX;EACA,OAAO,UAAU;EACjB,UAAU,WAAW;CACvB,CAAC;CAED,MAAM,YAAY;EAChB,kBAAkB;EAClB,iBAAiB,SAAS,aAAa,KAAK,KAAA;EAC5C,eAAe,UAAU,KAAA;EACzB,WAAW,kBACT;GACE;GACA;GACA;GACA;GAEA;GACA;GACA;GACA;GAEA;GAGA;GACA;EACF,GACA,SACF;EACA,UACE,qBAAA,UAAA,EAAA,UAAA;GACE,qBAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CACE,oBAAC,SAAS,MAAV;KACE,SAAS;KACT,UAAU,CAAC,OAAO,WAAW;KAC7B,kBAAkB,YAAY,OAAO,iBAAiB,OAAO;KAE7D,UAAA,oBAAC,SAAS,WAAV,CAAqB,CAAA;IACR,CAAA,GAEf,oBAAC,QAAD;KAAM,WAAW,YAAY,aAAa;KACvC,UAAA;IACG,CAAA,CACD;;GAEN,iBAAiB,QAAQ,sBAAsB,KAC9C,OAAO,UAAU,KACf,qBAAC,KAAK,MAAN,EAAA,UAAA,CACE,oBAAC,KAAK,SAAN,EACE,QACE,oBAAC,YAAD;IACE,SAAQ;IACR,MAAK;IACL,MAAM,oBAAC,aAAD,EAAa,QAAQ,SAAS,SAAS,UAAY,CAAA;IACzD,cAAY,qBAAqB;IACjC,WAAW,SAAS,iBAAiB;GACtC,CAAA,EAEJ,CAAA,GAED,oBAAC,KAAK,QAAN,EAAA,UACE,oBAAC,KAAK,YAAN;IAAiB,OAAM;IACrB,UAAA,oBAAC,KAAK,OAAN;KAAY,WAAU;KACpB,UAAA,oBAAC,oBAAD,EAA4B,OAAS,CAAA;IAC3B,CAAA;GACG,CAAA,EACN,CAAA,CACJ,EAAA,CAAA;GAGd,WAAW,QACV,oBAAC,YAAD;IACE,KAAK,SAAS;IACd,SAAQ;IACR,MAAK;IACL,MAAM,oBAAC,UAAD,CAAW,CAAA;IACjB,cAAY,kBAAkB;IAE9B,WAAU;GACX,CAAA,IAID,oBAAC,QAAD;IACE,eAAY;IACZ,WAAU;GACX,CAAA;EAEH,EAAA,CAAA;CAEN;CAEA,OAAO,UAAU;EACf;EACA,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI;EAC/B,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,iBAAiB,cAAc"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { TableWith } from "../../types/table-with.js";
|
|
2
|
+
import "../../types/index.js";
|
|
3
|
+
import { Column, RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { useRender } from "@base-ui/react";
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
7
|
+
//#region src/components/columns-panel/columns-panel-root.d.ts
|
|
8
|
+
export type ColumnsPanelRootProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
|
|
9
|
+
/** A tabela. Exige `columnOrderingFeature` e `columnVisibilityFeature`. */
|
|
10
|
+
table: TableWith<TFeatures, TData, 'columnOrderingFeature' | 'columnVisibilityFeature'>;
|
|
11
|
+
/**
|
|
12
|
+
* Uma função que recebe cada coluna e a posição dela no grupo e devolve o item. Repasse a
|
|
13
|
+
* posição ao `ColumnsPanel.Item`, que a usa no arrasto. Com nós comuns, quem usa faz o laço.
|
|
14
|
+
* @default (column, index) => <ColumnsPanel.Item column={column} index={index} />
|
|
15
|
+
*/
|
|
16
|
+
children?: React.ReactNode | ((column: Column<TFeatures, TData>, index: number) => React.ReactNode);
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* A lista das colunas da tabela: marca quais aparecem e arrasta para mudar a ordem. Para um
|
|
20
|
+
* popover ou uma gaveta; a posição, o gatilho e o "restaurar" (`table.resetColumnOrder()`,
|
|
21
|
+
* `table.resetColumnVisibility()`) são do app.
|
|
22
|
+
*
|
|
23
|
+
* Lista as colunas de dados. As de exibição (sem `accessorFn`, como a de seleção e a de ações)
|
|
24
|
+
* ficam fora e no lugar: reordenar só troca as outras entre si. Com `columnPinningFeature`, a
|
|
25
|
+
* tela vira até três listas (fixadas no início, centro e fixadas no fim), e só a do centro se
|
|
26
|
+
* arrasta.
|
|
27
|
+
*
|
|
28
|
+
* O arrasto é pela alça, com o ponteiro ou o teclado (Espaço pega, setas movem, Espaço solta, Esc
|
|
29
|
+
* cancela), e fica preso à lista do centro: não passa por cima das fixadas. O `Root` assina a
|
|
30
|
+
* ordem e o pinning, e cada `ColumnsPanel.Item`, a visibilidade da coluna dele: funciona com o
|
|
31
|
+
* dono da tabela em `() => null`.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* <ColumnsPanel.Root table={table}>
|
|
36
|
+
* {(column, index) => (
|
|
37
|
+
* <ColumnsPanel.Item
|
|
38
|
+
* column={column}
|
|
39
|
+
* index={index}
|
|
40
|
+
* label={labels[column.id]}
|
|
41
|
+
* />
|
|
42
|
+
* )}
|
|
43
|
+
* </ColumnsPanel.Root>
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare const ColumnsPanelRoot: {
|
|
47
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: ColumnsPanelRootProps<TFeatures, TData>): React.JSX.Element;
|
|
48
|
+
displayName: string;
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
//# sourceMappingURL=columns-panel-root.d.ts.map
|