@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":"get-data-table-loading-without-rows.js","names":[],"sources":["../../../../src/components/data-table/loading/get-data-table-loading-without-rows.ts"],"sourcesContent":["import type { RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport { hasTableFeature } from '../../../utils';\n\n/**\n * Se a tabela carrega sem nenhuma linha, como na primeira carga: o corpo mostra as\n * linhas-fantasma, e a barra da paginação, sem o total, que ainda não chegou. Sem\n * `loadingFeature`, `false`.\n *\n * @example\n * ```ts\n * // Primeira carga da API: `isLoading: true` e `data: []`.\n * getDataTableLoadingWithoutRows(table); // → true\n * ```\n */\nexport const getDataTableLoadingWithoutRows = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table<TFeatures, TData>,\n) =>\n hasTableFeature(table, 'loadingFeature') &&\n table.atoms.isLoading.get() &&\n table.getRowModel().rows.length === 0;\n"],"mappings":";;;;;;;;;;;;;AAcA,MAAa,kCAIX,UAEA,gBAAgB,OAAO,gBAAgB,KACvC,MAAM,MAAM,UAAU,IAAI,KAC1B,MAAM,YAAY,CAAC,CAAC,KAAK,WAAW"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RowData, Table, TableFeatures } from "@tanstack/react-table";
|
|
2
|
+
import React from "react";
|
|
3
|
+
//#region src/components/data-table/loading/use-data-table-loading-inert.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Bloqueia o corpo (`inert`) enquanto a tabela carrega, com `loadingFeature`: um clique, o Enter
|
|
6
|
+
* ou o Delete agiriam sobre o dado antigo. O cabeçalho e a paginação ficam livres.
|
|
7
|
+
*
|
|
8
|
+
* O `inert` tira o foco de uma linha. Se o foco estava no corpo quando a carga começou, ele volta
|
|
9
|
+
* quando ela termina: para a linha ativa, se ela continua na tela, ou para a primeira.
|
|
10
|
+
*
|
|
11
|
+
* Assina o store fora do React, como as variáveis das colunas: o atributo muda sem re-renderizar
|
|
12
|
+
* o corpo, que recriaria todas as linhas.
|
|
13
|
+
*/
|
|
14
|
+
export declare const useDataTableLoadingInert: <TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, ref: React.RefObject<HTMLElement | null>) => void;
|
|
15
|
+
//#endregion
|
|
16
|
+
//# sourceMappingURL=use-data-table-loading-inert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-loading-inert.d.ts","names":[],"sources":["../../../../src/components/data-table/loading/use-data-table-loading-inert.ts"],"mappings":";;;;;;;;;;;;;qBAmBa,2BACX,kBAAkB,eAClB,cAAc,SAEd,OAAO,MAAM,WAAW,QACxB,KAAK,MAAM,UAAU"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { hasTableFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { focusDataTableRow, getDataTableRowElements } from "../body/data-table-row-focus.js";
|
|
3
|
+
import { useLayoutEffect, useRef } from "react";
|
|
4
|
+
//#region src/components/data-table/loading/use-data-table-loading-inert.ts
|
|
5
|
+
/**
|
|
6
|
+
* Bloqueia o corpo (`inert`) enquanto a tabela carrega, com `loadingFeature`: um clique, o Enter
|
|
7
|
+
* ou o Delete agiriam sobre o dado antigo. O cabeçalho e a paginação ficam livres.
|
|
8
|
+
*
|
|
9
|
+
* O `inert` tira o foco de uma linha. Se o foco estava no corpo quando a carga começou, ele volta
|
|
10
|
+
* quando ela termina: para a linha ativa, se ela continua na tela, ou para a primeira.
|
|
11
|
+
*
|
|
12
|
+
* Assina o store fora do React, como as variáveis das colunas: o atributo muda sem re-renderizar
|
|
13
|
+
* o corpo, que recriaria todas as linhas.
|
|
14
|
+
*/
|
|
15
|
+
const useDataTableLoadingInert = (table, ref) => {
|
|
16
|
+
/** A tabela do último render, lida por ref para não refazer a assinatura a cada render. */
|
|
17
|
+
const tableRef = useRef(table);
|
|
18
|
+
useLayoutEffect(() => {
|
|
19
|
+
tableRef.current = table;
|
|
20
|
+
});
|
|
21
|
+
useLayoutEffect(() => {
|
|
22
|
+
/** Se o foco estava no corpo quando a carga começou. */
|
|
23
|
+
let wasFocusInside = false;
|
|
24
|
+
const syncInert = () => {
|
|
25
|
+
const element = ref.current;
|
|
26
|
+
const currentTable = tableRef.current;
|
|
27
|
+
if (!element) return;
|
|
28
|
+
const isLoading = hasTableFeature(currentTable, "loadingFeature") && currentTable.atoms.isLoading.get();
|
|
29
|
+
if (isLoading === element.hasAttribute("inert")) return;
|
|
30
|
+
if (isLoading) {
|
|
31
|
+
wasFocusInside = element.contains(document.activeElement);
|
|
32
|
+
element.setAttribute("inert", "");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
element.removeAttribute("inert");
|
|
36
|
+
if (!wasFocusInside) return;
|
|
37
|
+
wasFocusInside = false;
|
|
38
|
+
/** No próximo quadro, com as linhas novas já no DOM. */
|
|
39
|
+
requestAnimationFrame(() => {
|
|
40
|
+
const { activeElement } = document;
|
|
41
|
+
if (activeElement && activeElement !== document.body) return;
|
|
42
|
+
const targetRow = element.querySelector("[role=\"row\"][data-active]") ?? getDataTableRowElements(element)[0];
|
|
43
|
+
if (targetRow) focusDataTableRow(targetRow);
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
syncInert();
|
|
47
|
+
const subscription = table.store.subscribe(syncInert);
|
|
48
|
+
return () => subscription.unsubscribe();
|
|
49
|
+
}, [table.store, ref]);
|
|
50
|
+
};
|
|
51
|
+
//#endregion
|
|
52
|
+
export { useDataTableLoadingInert };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=use-data-table-loading-inert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-loading-inert.js","names":[],"sources":["../../../../src/components/data-table/loading/use-data-table-loading-inert.ts"],"sourcesContent":["import type { RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { useLayoutEffect, useRef } from 'react';\nimport { hasTableFeature } from '../../../utils';\nimport {\n focusDataTableRow,\n getDataTableRowElements,\n} from '../body/data-table-row-focus';\n\n/**\n * Bloqueia o corpo (`inert`) enquanto a tabela carrega, com `loadingFeature`: um clique, o Enter\n * ou o Delete agiriam sobre o dado antigo. O cabeçalho e a paginação ficam livres.\n *\n * O `inert` tira o foco de uma linha. Se o foco estava no corpo quando a carga começou, ele volta\n * quando ela termina: para a linha ativa, se ela continua na tela, ou para a primeira.\n *\n * Assina o store fora do React, como as variáveis das colunas: o atributo muda sem re-renderizar\n * o corpo, que recriaria todas as linhas.\n */\nexport const useDataTableLoadingInert = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table<TFeatures, TData>,\n ref: React.RefObject<HTMLElement | null>,\n) => {\n /** A tabela do último render, lida por ref para não refazer a assinatura a cada render. */\n const tableRef = useRef(table);\n\n useLayoutEffect(() => {\n tableRef.current = table;\n });\n\n useLayoutEffect(() => {\n /** Se o foco estava no corpo quando a carga começou. */\n let wasFocusInside = false;\n\n const syncInert = () => {\n const element = ref.current;\n const currentTable = tableRef.current;\n\n if (!element) {\n return;\n }\n\n const isLoading =\n hasTableFeature(currentTable, 'loadingFeature') &&\n currentTable.atoms.isLoading.get();\n\n if (isLoading === element.hasAttribute('inert')) {\n return;\n }\n\n if (isLoading) {\n wasFocusInside = element.contains(document.activeElement);\n element.setAttribute('inert', '');\n\n return;\n }\n\n element.removeAttribute('inert');\n\n if (!wasFocusInside) {\n return;\n }\n\n wasFocusInside = false;\n\n /** No próximo quadro, com as linhas novas já no DOM. */\n requestAnimationFrame(() => {\n const { activeElement } = document;\n\n if (activeElement && activeElement !== document.body) {\n return;\n }\n\n const targetRow =\n element.querySelector<HTMLElement>('[role=\"row\"][data-active]') ??\n getDataTableRowElements(element)[0];\n\n if (targetRow) {\n focusDataTableRow(targetRow);\n }\n });\n };\n\n syncInert();\n\n const subscription = table.store.subscribe(syncInert);\n\n return () => subscription.unsubscribe();\n }, [table.store, ref]);\n};\n"],"mappings":";;;;;;;;;;;;;;AAmBA,MAAa,4BAIX,OACA,QACG;;CAEH,MAAM,WAAW,OAAO,KAAK;CAE7B,sBAAsB;EACpB,SAAS,UAAU;CACrB,CAAC;CAED,sBAAsB;;EAEpB,IAAI,iBAAiB;EAErB,MAAM,kBAAkB;GACtB,MAAM,UAAU,IAAI;GACpB,MAAM,eAAe,SAAS;GAE9B,IAAI,CAAC,SACH;GAGF,MAAM,YACJ,gBAAgB,cAAc,gBAAgB,KAC9C,aAAa,MAAM,UAAU,IAAI;GAEnC,IAAI,cAAc,QAAQ,aAAa,OAAO,GAC5C;GAGF,IAAI,WAAW;IACb,iBAAiB,QAAQ,SAAS,SAAS,aAAa;IACxD,QAAQ,aAAa,SAAS,EAAE;IAEhC;GACF;GAEA,QAAQ,gBAAgB,OAAO;GAE/B,IAAI,CAAC,gBACH;GAGF,iBAAiB;;GAGjB,4BAA4B;IAC1B,MAAM,EAAE,kBAAkB;IAE1B,IAAI,iBAAiB,kBAAkB,SAAS,MAC9C;IAGF,MAAM,YACJ,QAAQ,cAA2B,6BAA2B,KAC9D,wBAAwB,OAAO,CAAC,CAAC;IAEnC,IAAI,WACF,kBAAkB,SAAS;GAE/B,CAAC;EACH;EAEA,UAAU;EAEV,MAAM,eAAe,MAAM,MAAM,UAAU,SAAS;EAEpD,aAAa,aAAa,YAAY;CACxC,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC;AACvB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RowData, Table, TableFeatures } from "@tanstack/react-table";
|
|
2
|
+
//#region src/components/data-table/loading/use-data-table-loading.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* O carregamento da tabela, de `loadingFeature`: `isLoading` na hora, para o `aria-busy`, e
|
|
5
|
+
* `isLoadingVisible` depois de 200ms, para o que aparece na tela. Sem a feature, os dois ficam
|
|
6
|
+
* `false`.
|
|
7
|
+
*/
|
|
8
|
+
export declare const useDataTableLoading: <TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>) => {
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
isLoadingVisible: boolean;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
//# sourceMappingURL=use-data-table-loading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-loading.d.ts","names":[],"sources":["../../../../src/components/data-table/loading/use-data-table-loading.ts"],"mappings":";;;;;;;qBAgBa,sBACX,kBAAkB,eAClB,cAAc,SAEd,OAAO,MAAM,WAAW"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { hasTableFeature } from "../../../utils/has-feature.js";
|
|
2
|
+
import { useSelector } from "@tanstack/react-store";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
//#region src/components/data-table/loading/use-data-table-loading.ts
|
|
5
|
+
/**
|
|
6
|
+
* Quanto o carregamento espera antes de aparecer. Uma resposta mais rápida que isto não mostra
|
|
7
|
+
* nada: o skeleton ou a barra piscariam e sumiriam, o que incomoda mais do que ajuda.
|
|
8
|
+
*/
|
|
9
|
+
const LOADING_VISIBLE_DELAY = 200;
|
|
10
|
+
/**
|
|
11
|
+
* O carregamento da tabela, de `loadingFeature`: `isLoading` na hora, para o `aria-busy`, e
|
|
12
|
+
* `isLoadingVisible` depois de 200ms, para o que aparece na tela. Sem a feature, os dois ficam
|
|
13
|
+
* `false`.
|
|
14
|
+
*/
|
|
15
|
+
const useDataTableLoading = (table) => {
|
|
16
|
+
/** Re-renderiza quando o carregamento liga ou desliga. A feature é opcional: assina o store. */
|
|
17
|
+
const isLoading = useSelector(table.store, () => hasTableFeature(table, "loadingFeature") && table.atoms.isLoading.get());
|
|
18
|
+
/** Se a carga atual já passou do atraso. Volta a `false` no fim dela, para a próxima esperar. */
|
|
19
|
+
const [isDelayElapsed, setIsDelayElapsed] = useState(false);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!isLoading) return;
|
|
22
|
+
const timeout = setTimeout(() => setIsDelayElapsed(true), LOADING_VISIBLE_DELAY);
|
|
23
|
+
return () => {
|
|
24
|
+
clearTimeout(timeout);
|
|
25
|
+
setIsDelayElapsed(false);
|
|
26
|
+
};
|
|
27
|
+
}, [isLoading]);
|
|
28
|
+
/**
|
|
29
|
+
* Derivado, e não guardado: desliga no mesmo render em que a carga termina, e o conteúdo novo
|
|
30
|
+
* não espera o efeito.
|
|
31
|
+
*/
|
|
32
|
+
return {
|
|
33
|
+
isLoading,
|
|
34
|
+
isLoadingVisible: isLoading && isDelayElapsed
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
//#endregion
|
|
38
|
+
export { useDataTableLoading };
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=use-data-table-loading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-data-table-loading.js","names":[],"sources":["../../../../src/components/data-table/loading/use-data-table-loading.ts"],"sourcesContent":["import { useSelector } from '@tanstack/react-store';\nimport type { RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport { useEffect, useState } from 'react';\nimport { hasTableFeature } from '../../../utils';\n\n/**\n * Quanto o carregamento espera antes de aparecer. Uma resposta mais rápida que isto não mostra\n * nada: o skeleton ou a barra piscariam e sumiriam, o que incomoda mais do que ajuda.\n */\nconst LOADING_VISIBLE_DELAY = 200;\n\n/**\n * O carregamento da tabela, de `loadingFeature`: `isLoading` na hora, para o `aria-busy`, e\n * `isLoadingVisible` depois de 200ms, para o que aparece na tela. Sem a feature, os dois ficam\n * `false`.\n */\nexport const useDataTableLoading = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table<TFeatures, TData>,\n) => {\n /** Re-renderiza quando o carregamento liga ou desliga. A feature é opcional: assina o store. */\n const isLoading = useSelector(\n table.store,\n () =>\n hasTableFeature(table, 'loadingFeature') && table.atoms.isLoading.get(),\n );\n\n /** Se a carga atual já passou do atraso. Volta a `false` no fim dela, para a próxima esperar. */\n const [isDelayElapsed, setIsDelayElapsed] = useState(false);\n\n useEffect(() => {\n if (!isLoading) {\n return;\n }\n\n const timeout = setTimeout(\n () => setIsDelayElapsed(true),\n LOADING_VISIBLE_DELAY,\n );\n\n return () => {\n clearTimeout(timeout);\n setIsDelayElapsed(false);\n };\n }, [isLoading]);\n\n /**\n * Derivado, e não guardado: desliga no mesmo render em que a carga termina, e o conteúdo novo\n * não espera o efeito.\n */\n return { isLoading, isLoadingVisible: isLoading && isDelayElapsed };\n};\n"],"mappings":";;;;;;;;AASA,MAAM,wBAAwB;;;;;;AAO9B,MAAa,uBAIX,UACG;;CAEH,MAAM,YAAY,YAChB,MAAM,aAEJ,gBAAgB,OAAO,gBAAgB,KAAK,MAAM,MAAM,UAAU,IAAI,CAC1E;;CAGA,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK;CAE1D,gBAAgB;EACd,IAAI,CAAC,WACH;EAGF,MAAM,UAAU,iBACR,kBAAkB,IAAI,GAC5B,qBACF;EAEA,aAAa;GACX,aAAa,OAAO;GACpB,kBAAkB,KAAK;EACzB;CACF,GAAG,CAAC,SAAS,CAAC;;;;;CAMd,OAAO;EAAE;EAAW,kBAAkB,aAAa;CAAe;AACpE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { IconButtonProps } from "@lucasbernardosn/react-ui/buttons/icon-button";
|
|
5
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
6
|
+
//#region src/components/data-table/pagination/data-table-page-button.d.ts
|
|
7
|
+
/** Para onde o botão leva. */
|
|
8
|
+
export type DataTablePageButtonPage = 'first' | 'previous' | 'next' | 'last';
|
|
9
|
+
export type DataTablePageButtonProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<Omit<IconButtonProps, 'icon' | 'aria-label'>, {
|
|
10
|
+
/** A tabela. Exige `rowPaginationFeature`. */
|
|
11
|
+
table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;
|
|
12
|
+
/** Para onde o botão leva: a primeira página, a anterior, a próxima ou a última. */
|
|
13
|
+
page: DataTablePageButtonPage;
|
|
14
|
+
/**
|
|
15
|
+
* O ícone.
|
|
16
|
+
* @default um caret por página: duplo nas pontas, simples na anterior e na próxima
|
|
17
|
+
*/
|
|
18
|
+
icon?: IconButtonProps['icon'];
|
|
19
|
+
/**
|
|
20
|
+
* O que o botão faz.
|
|
21
|
+
* @default 'Primeira página', 'Página anterior', 'Próxima página' ou 'Última página'
|
|
22
|
+
*/
|
|
23
|
+
'aria-label'?: string;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* O botão que leva a outra página: a primeira, a anterior, a próxima ou a última. Fica
|
|
27
|
+
* desabilitado quando não há para onde ir. Sem o total de páginas (`pageCount: -1` na paginação
|
|
28
|
+
* pela API), a próxima continua habilitada, e a última, não.
|
|
29
|
+
*
|
|
30
|
+
* As props do `IconButton` passam adiante, como `variant` e `size`.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* <DataTable.PageButton
|
|
35
|
+
* table={table}
|
|
36
|
+
* page="next"
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare const DataTablePageButton: {
|
|
41
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTablePageButtonProps<TFeatures, TData>): import("react").JSX.Element;
|
|
42
|
+
displayName: string;
|
|
43
|
+
};
|
|
44
|
+
//#endregion
|
|
45
|
+
//# sourceMappingURL=data-table-page-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-page-button.d.ts","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-page-button.tsx"],"mappings":";;;;;;;YAgBY;YAEA,yBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,KAAK;;EAGH,OAAO,UAAU,WAAW;;EAE5B,MAAM;;;;;EAKN,OAAO;;;;;EAKP;;;;;;;;;;;;;;;;;qBAiCS;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,yBAAyB,WAAW,yBAAM,IAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { CaretDoubleLeftIcon, CaretDoubleRightIcon, CaretLeftIcon, CaretRightIcon } from "@phosphor-icons/react";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useSelector } from "@tanstack/react-store";
|
|
4
|
+
import { IconButton } from "@lucasbernardosn/react-ui/buttons/icon-button";
|
|
5
|
+
//#region src/components/data-table/pagination/data-table-page-button.tsx
|
|
6
|
+
const PAGE_LABELS = {
|
|
7
|
+
first: "Primeira página",
|
|
8
|
+
previous: "Página anterior",
|
|
9
|
+
next: "Próxima página",
|
|
10
|
+
last: "Última página"
|
|
11
|
+
};
|
|
12
|
+
const PAGE_ICONS = {
|
|
13
|
+
first: /* @__PURE__ */ jsx(CaretDoubleLeftIcon, {}),
|
|
14
|
+
previous: /* @__PURE__ */ jsx(CaretLeftIcon, {}),
|
|
15
|
+
next: /* @__PURE__ */ jsx(CaretRightIcon, {}),
|
|
16
|
+
last: /* @__PURE__ */ jsx(CaretDoubleRightIcon, {})
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* O botão que leva a outra página: a primeira, a anterior, a próxima ou a última. Fica
|
|
20
|
+
* desabilitado quando não há para onde ir. Sem o total de páginas (`pageCount: -1` na paginação
|
|
21
|
+
* pela API), a próxima continua habilitada, e a última, não.
|
|
22
|
+
*
|
|
23
|
+
* As props do `IconButton` passam adiante, como `variant` e `size`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* <DataTable.PageButton
|
|
28
|
+
* table={table}
|
|
29
|
+
* page="next"
|
|
30
|
+
* />
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
const DataTablePageButton = (props) => {
|
|
34
|
+
const { table, page, icon, onClick, ...rest } = props;
|
|
35
|
+
/**
|
|
36
|
+
* Re-renderiza quando o botão passa a ter ou deixa de ter para onde ir. O store, e não só o
|
|
37
|
+
* atom da paginação: o total de páginas também muda com as linhas.
|
|
38
|
+
*/
|
|
39
|
+
const isDisabled = useSelector(table.store, () => {
|
|
40
|
+
if (page === "first" || page === "previous") return !table.getCanPreviousPage();
|
|
41
|
+
return page === "next" ? !table.getCanNextPage() : !table.getCanLastPage();
|
|
42
|
+
});
|
|
43
|
+
const goToPage = () => {
|
|
44
|
+
if (page === "first") table.firstPage();
|
|
45
|
+
else if (page === "previous") table.previousPage();
|
|
46
|
+
else if (page === "next") table.nextPage();
|
|
47
|
+
else table.lastPage();
|
|
48
|
+
};
|
|
49
|
+
return /* @__PURE__ */ jsx(IconButton, {
|
|
50
|
+
"data-component": "DataTable.PageButton",
|
|
51
|
+
"data-page": page,
|
|
52
|
+
"aria-label": PAGE_LABELS[page],
|
|
53
|
+
icon: icon ?? PAGE_ICONS[page],
|
|
54
|
+
variant: "outline",
|
|
55
|
+
disabled: isDisabled,
|
|
56
|
+
onClick: (event) => {
|
|
57
|
+
onClick?.(event);
|
|
58
|
+
if (!event.defaultPrevented) goToPage();
|
|
59
|
+
},
|
|
60
|
+
...rest
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
DataTablePageButton.displayName = "DataTable.PageButton";
|
|
64
|
+
//#endregion
|
|
65
|
+
export { DataTablePageButton };
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=data-table-page-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-page-button.js","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-page-button.tsx"],"sourcesContent":["import {\n IconButton,\n type IconButtonProps,\n} from '@lucasbernardosn/react-ui/buttons/icon-button';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport {\n CaretDoubleLeftIcon,\n CaretDoubleRightIcon,\n CaretLeftIcon,\n CaretRightIcon,\n} from '@phosphor-icons/react';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type { TableWith } from '../../../types';\n\n/** Para onde o botão leva. */\nexport type DataTablePageButtonPage = 'first' | 'previous' | 'next' | 'last';\n\nexport type DataTablePageButtonProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n Omit<IconButtonProps, 'icon' | 'aria-label'>,\n {\n /** A tabela. Exige `rowPaginationFeature`. */\n table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;\n /** Para onde o botão leva: a primeira página, a anterior, a próxima ou a última. */\n page: DataTablePageButtonPage;\n /**\n * O ícone.\n * @default um caret por página: duplo nas pontas, simples na anterior e na próxima\n */\n icon?: IconButtonProps['icon'];\n /**\n * O que o botão faz.\n * @default 'Primeira página', 'Página anterior', 'Próxima página' ou 'Última página'\n */\n 'aria-label'?: string;\n }\n>;\n\nconst PAGE_LABELS: Record<DataTablePageButtonPage, string> = {\n first: 'Primeira página',\n previous: 'Página anterior',\n next: 'Próxima página',\n last: 'Última página',\n};\n\nconst PAGE_ICONS: Record<DataTablePageButtonPage, IconButtonProps['icon']> = {\n first: <CaretDoubleLeftIcon />,\n previous: <CaretLeftIcon />,\n next: <CaretRightIcon />,\n last: <CaretDoubleRightIcon />,\n};\n\n/**\n * O botão que leva a outra página: a primeira, a anterior, a próxima ou a última. Fica\n * desabilitado quando não há para onde ir. Sem o total de páginas (`pageCount: -1` na paginação\n * pela API), a próxima continua habilitada, e a última, não.\n *\n * As props do `IconButton` passam adiante, como `variant` e `size`.\n *\n * @example\n * ```tsx\n * <DataTable.PageButton\n * table={table}\n * page=\"next\"\n * />\n * ```\n */\nexport const DataTablePageButton = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTablePageButtonProps<TFeatures, TData>,\n) => {\n const { table, page, icon, onClick, ...rest } = props;\n\n /**\n * Re-renderiza quando o botão passa a ter ou deixa de ter para onde ir. O store, e não só o\n * atom da paginação: o total de páginas também muda com as linhas.\n */\n const isDisabled = useSelector(table.store, () => {\n if (page === 'first' || page === 'previous') {\n return !table.getCanPreviousPage();\n }\n\n return page === 'next' ? !table.getCanNextPage() : !table.getCanLastPage();\n });\n\n const goToPage = () => {\n if (page === 'first') {\n table.firstPage();\n } else if (page === 'previous') {\n table.previousPage();\n } else if (page === 'next') {\n table.nextPage();\n } else {\n table.lastPage();\n }\n };\n\n return (\n <IconButton\n data-component=\"DataTable.PageButton\"\n data-page={page}\n aria-label={PAGE_LABELS[page]}\n icon={icon ?? PAGE_ICONS[page]}\n variant=\"outline\"\n disabled={isDisabled}\n // O `onClick` do app roda antes, e um `preventDefault()` nele cancela a troca de página.\n onClick={(event) => {\n onClick?.(event);\n\n if (!event.defaultPrevented) {\n goToPage();\n }\n }}\n {...rest}\n />\n );\n};\n\nDataTablePageButton.displayName = 'DataTable.PageButton';\n"],"mappings":";;;;;AAyCA,MAAM,cAAuD;CAC3D,OAAO;CACP,UAAU;CACV,MAAM;CACN,MAAM;AACR;AAEA,MAAM,aAAuE;CAC3E,OAAO,oBAAC,qBAAD,CAAsB,CAAA;CAC7B,UAAU,oBAAC,eAAD,CAAgB,CAAA;CAC1B,MAAM,oBAAC,gBAAD,CAAiB,CAAA;CACvB,MAAM,oBAAC,sBAAD,CAAuB,CAAA;AAC/B;;;;;;;;;;;;;;;;AAiBA,MAAa,uBAIX,UACG;CACH,MAAM,EAAE,OAAO,MAAM,MAAM,SAAS,GAAG,SAAS;;;;;CAMhD,MAAM,aAAa,YAAY,MAAM,aAAa;EAChD,IAAI,SAAS,WAAW,SAAS,YAC/B,OAAO,CAAC,MAAM,mBAAmB;EAGnC,OAAO,SAAS,SAAS,CAAC,MAAM,eAAe,IAAI,CAAC,MAAM,eAAe;CAC3E,CAAC;CAED,MAAM,iBAAiB;EACrB,IAAI,SAAS,SACX,MAAM,UAAU;OACX,IAAI,SAAS,YAClB,MAAM,aAAa;OACd,IAAI,SAAS,QAClB,MAAM,SAAS;OAEf,MAAM,SAAS;CAEnB;CAEA,OACE,oBAAC,YAAD;EACE,kBAAe;EACf,aAAW;EACX,cAAY,YAAY;EACxB,MAAM,QAAQ,WAAW;EACzB,SAAQ;EACR,UAAU;EAEV,UAAU,UAAU;GAClB,UAAU,KAAK;GAEf,IAAI,CAAC,MAAM,kBACT,SAAS;EAEb;EACA,GAAI;CACL,CAAA;AAEL;AAEA,oBAAoB,cAAc"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { Select } from "@lucasbernardosn/react-ui/collections/select";
|
|
6
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
7
|
+
//#region src/components/data-table/pagination/data-table-page-size-select.d.ts
|
|
8
|
+
export type DataTablePageSizeSelectProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<React.ComponentProps<'div'>, {
|
|
9
|
+
/** A tabela. Exige `rowPaginationFeature`. */
|
|
10
|
+
table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;
|
|
11
|
+
/**
|
|
12
|
+
* Os tamanhos oferecidos. O tamanho atual entra na lista mesmo fora dela.
|
|
13
|
+
* @default [10, 25, 50, 100]
|
|
14
|
+
*/
|
|
15
|
+
options?: readonly number[];
|
|
16
|
+
/**
|
|
17
|
+
* O rótulo do select.
|
|
18
|
+
* @default 'Linhas por página'
|
|
19
|
+
*/
|
|
20
|
+
label?: React.ReactNode;
|
|
21
|
+
/**
|
|
22
|
+
* O tamanho do select.
|
|
23
|
+
* @default 'sm'
|
|
24
|
+
*/
|
|
25
|
+
size?: Select.RootProps<number>['size'];
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* O select de quantas linhas cada página mostra, com o rótulo ao lado. Trocar o tamanho chama o
|
|
29
|
+
* `table.setPageSize`, que mantém à vista a primeira linha da página atual.
|
|
30
|
+
*
|
|
31
|
+
* Renderiza o `Select` do `ui` por dentro; as props passam para o elemento em volta do rótulo e do
|
|
32
|
+
* trigger.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* <DataTable.PageSizeSelect
|
|
37
|
+
* table={table}
|
|
38
|
+
* options={[20, 50, 100]}
|
|
39
|
+
* />
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare const DataTablePageSizeSelect: {
|
|
43
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTablePageSizeSelectProps<TFeatures, TData>): React.JSX.Element;
|
|
44
|
+
displayName: string;
|
|
45
|
+
};
|
|
46
|
+
//#endregion
|
|
47
|
+
//# sourceMappingURL=data-table-page-size-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-page-size-select.d.ts","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-page-size-select.tsx"],"mappings":";;;;;;;YAQY,6BACV,kBAAkB,eAClB,cAAc,WACZ,cACF,MAAM;;EAGJ,OAAO,UAAU,WAAW;;;;;EAK5B;;;;;EAKA,QAAQ,MAAM;;;;;EAKd,OAAO,OAAO;;;;;;;;;;;;;;;;;qBAqBL;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,6BAA6B,WAAW,SAAM,MAAA,IAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useSelector } from "@tanstack/react-store";
|
|
3
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
4
|
+
import { Select } from "@lucasbernardosn/react-ui/collections/select";
|
|
5
|
+
//#region src/components/data-table/pagination/data-table-page-size-select.tsx
|
|
6
|
+
const DEFAULT_PAGE_SIZE_OPTIONS = [
|
|
7
|
+
10,
|
|
8
|
+
25,
|
|
9
|
+
50,
|
|
10
|
+
100
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* O select de quantas linhas cada página mostra, com o rótulo ao lado. Trocar o tamanho chama o
|
|
14
|
+
* `table.setPageSize`, que mantém à vista a primeira linha da página atual.
|
|
15
|
+
*
|
|
16
|
+
* Renderiza o `Select` do `ui` por dentro; as props passam para o elemento em volta do rótulo e do
|
|
17
|
+
* trigger.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* <DataTable.PageSizeSelect
|
|
22
|
+
* table={table}
|
|
23
|
+
* options={[20, 50, 100]}
|
|
24
|
+
* />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
const DataTablePageSizeSelect = (props) => {
|
|
28
|
+
const { table, options = DEFAULT_PAGE_SIZE_OPTIONS, label = "Linhas por página", size = "sm", className, ...rest } = props;
|
|
29
|
+
/** Re-renderiza quando o tamanho da página muda. */
|
|
30
|
+
const pageSize = useSelector(table.atoms.pagination, (pagination) => pagination.pageSize);
|
|
31
|
+
/** O tamanho atual entra na lista: sem ele, o trigger ficaria vazio. */
|
|
32
|
+
const items = (options.includes(pageSize) ? options : [...options, pageSize]).toSorted((a, b) => a - b).map((option) => ({
|
|
33
|
+
label: option.toLocaleString("pt-BR"),
|
|
34
|
+
value: option
|
|
35
|
+
}));
|
|
36
|
+
return /* @__PURE__ */ jsxs(Select.Root, {
|
|
37
|
+
size,
|
|
38
|
+
value: pageSize,
|
|
39
|
+
items,
|
|
40
|
+
onValueChange: (value) => {
|
|
41
|
+
if (value !== null) table.setPageSize(value);
|
|
42
|
+
},
|
|
43
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
44
|
+
"data-component": "DataTable.PageSizeSelect",
|
|
45
|
+
className: mergeTwClassNames([
|
|
46
|
+
"flex",
|
|
47
|
+
"items-center",
|
|
48
|
+
"gap-2"
|
|
49
|
+
], className),
|
|
50
|
+
...rest,
|
|
51
|
+
children: [/* @__PURE__ */ jsx(Select.Label, {
|
|
52
|
+
className: "whitespace-nowrap font-normal text-gray-11",
|
|
53
|
+
children: label
|
|
54
|
+
}), /* @__PURE__ */ jsxs(Select.Trigger, { children: [/* @__PURE__ */ jsx(Select.Value, {}), /* @__PURE__ */ jsx(Select.Icon, {})] })]
|
|
55
|
+
}), /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsx(Select.Positioner, {
|
|
56
|
+
alignItemWithTrigger: false,
|
|
57
|
+
children: /* @__PURE__ */ jsx(Select.Popup, { children: /* @__PURE__ */ jsx(Select.List, { children: items.map((item) => /* @__PURE__ */ jsxs(Select.Item, {
|
|
58
|
+
value: item.value,
|
|
59
|
+
children: [/* @__PURE__ */ jsx(Select.ItemIndicator, {}), /* @__PURE__ */ jsx(Select.ItemText, { children: item.label })]
|
|
60
|
+
}, item.value)) }) })
|
|
61
|
+
}) })]
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
DataTablePageSizeSelect.displayName = "DataTable.PageSizeSelect";
|
|
65
|
+
//#endregion
|
|
66
|
+
export { DataTablePageSizeSelect };
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=data-table-page-size-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-page-size-select.js","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-page-size-select.tsx"],"sourcesContent":["import { Select } from '@lucasbernardosn/react-ui/collections/select';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport type { TableWith } from '../../../types';\n\nexport type DataTablePageSizeSelectProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n React.ComponentProps<'div'>,\n {\n /** A tabela. Exige `rowPaginationFeature`. */\n table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;\n /**\n * Os tamanhos oferecidos. O tamanho atual entra na lista mesmo fora dela.\n * @default [10, 25, 50, 100]\n */\n options?: readonly number[];\n /**\n * O rótulo do select.\n * @default 'Linhas por página'\n */\n label?: React.ReactNode;\n /**\n * O tamanho do select.\n * @default 'sm'\n */\n size?: Select.RootProps<number>['size'];\n }\n>;\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\n/**\n * O select de quantas linhas cada página mostra, com o rótulo ao lado. Trocar o tamanho chama o\n * `table.setPageSize`, que mantém à vista a primeira linha da página atual.\n *\n * Renderiza o `Select` do `ui` por dentro; as props passam para o elemento em volta do rótulo e do\n * trigger.\n *\n * @example\n * ```tsx\n * <DataTable.PageSizeSelect\n * table={table}\n * options={[20, 50, 100]}\n * />\n * ```\n */\nexport const DataTablePageSizeSelect = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTablePageSizeSelectProps<TFeatures, TData>,\n) => {\n const {\n table,\n options = DEFAULT_PAGE_SIZE_OPTIONS,\n label = 'Linhas por página',\n size = 'sm',\n className,\n ...rest\n } = props;\n\n /** Re-renderiza quando o tamanho da página muda. */\n const pageSize = useSelector(\n table.atoms.pagination,\n (pagination) => pagination.pageSize,\n );\n\n /** O tamanho atual entra na lista: sem ele, o trigger ficaria vazio. */\n const items = (options.includes(pageSize) ? options : [...options, pageSize])\n .toSorted((a, b) => a - b)\n .map((option) => ({\n label: option.toLocaleString('pt-BR'),\n value: option,\n }));\n\n return (\n <Select.Root<number>\n size={size}\n value={pageSize}\n items={items}\n onValueChange={(value) => {\n if (value !== null) {\n table.setPageSize(value);\n }\n }}\n >\n <div\n data-component=\"DataTable.PageSizeSelect\"\n className={mergeTwClassNames(\n ['flex', 'items-center', 'gap-2'],\n className,\n )}\n {...rest}\n >\n <Select.Label className=\"whitespace-nowrap font-normal text-gray-11\">\n {label}\n </Select.Label>\n\n <Select.Trigger>\n <Select.Value />\n <Select.Icon />\n </Select.Trigger>\n </div>\n\n <Select.Portal>\n <Select.Positioner alignItemWithTrigger={false}>\n <Select.Popup>\n <Select.List>\n {items.map((item) => (\n <Select.Item\n key={item.value}\n value={item.value}\n >\n <Select.ItemIndicator />\n <Select.ItemText>{item.label}</Select.ItemText>\n </Select.Item>\n ))}\n </Select.List>\n </Select.Popup>\n </Select.Positioner>\n </Select.Portal>\n </Select.Root>\n );\n};\n\nDataTablePageSizeSelect.displayName = 'DataTable.PageSizeSelect';\n"],"mappings":";;;;;AAkCA,MAAM,4BAA4B;CAAC;CAAI;CAAI;CAAI;AAAG;;;;;;;;;;;;;;;;AAiBlD,MAAa,2BAIX,UACG;CACH,MAAM,EACJ,OACA,UAAU,2BACV,QAAQ,qBACR,OAAO,MACP,WACA,GAAG,SACD;;CAGJ,MAAM,WAAW,YACf,MAAM,MAAM,aACX,eAAe,WAAW,QAC7B;;CAGA,MAAM,SAAS,QAAQ,SAAS,QAAQ,IAAI,UAAU,CAAC,GAAG,SAAS,QAAQ,EAAA,CACxE,UAAU,GAAG,MAAM,IAAI,CAAC,CAAC,CACzB,KAAK,YAAY;EAChB,OAAO,OAAO,eAAe,OAAO;EACpC,OAAO;CACT,EAAE;CAEJ,OACE,qBAAC,OAAO,MAAR;EACQ;EACN,OAAO;EACA;EACP,gBAAgB,UAAU;GACxB,IAAI,UAAU,MACZ,MAAM,YAAY,KAAK;EAE3B;EARF,UAAA,CAUE,qBAAC,OAAD;GACE,kBAAe;GACf,WAAW,kBACT;IAAC;IAAQ;IAAgB;GAAO,GAChC,SACF;GACA,GAAI;GANN,UAAA,CAQE,oBAAC,OAAO,OAAR;IAAc,WAAU;IACrB,UAAA;GACW,CAAA,GAEd,qBAAC,OAAO,SAAR,EAAA,UAAA,CACE,oBAAC,OAAO,OAAR,CAAe,CAAA,GACf,oBAAC,OAAO,MAAR,CAAc,CAAA,CACA,EAAA,CAAA,CACb;EAEL,CAAA,GAAA,oBAAC,OAAO,QAAR,EAAA,UACE,oBAAC,OAAO,YAAR;GAAmB,sBAAsB;GACvC,UAAA,oBAAC,OAAO,OAAR,EAAA,UACE,oBAAC,OAAO,MAAR,EAAA,UACG,MAAM,KAAK,SACV,qBAAC,OAAO,MAAR;IAEE,OAAO,KAAK;IAFd,UAAA,CAIE,oBAAC,OAAO,eAAR,CAAuB,CAAA,GACvB,oBAAC,OAAO,UAAR,EAAA,UAAkB,KAAK,MAAuB,CAAA,CACnC;GALN,GAAA,KAAK,KAKC,CACd,EACU,CAAA,EACD,CAAA;EACG,CAAA,EACN,CAAA,CACJ;;AAEjB;AAEA,wBAAwB,cAAc"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { useRender } from "@base-ui/react";
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
7
|
+
//#region src/components/data-table/pagination/data-table-page-status.d.ts
|
|
8
|
+
/** A página atual e o total, para o texto do `DataTable.PageStatus`. */
|
|
9
|
+
export type DataTablePageStatusValues = {
|
|
10
|
+
/** O índice da página atual, a partir de 0. */
|
|
11
|
+
pageIndex: number;
|
|
12
|
+
/**
|
|
13
|
+
* O total de páginas, ou `-1` sem ele: quando a API não informa (`pageCount: -1`) e, com
|
|
14
|
+
* `loadingFeature`, na carga sem linhas, antes de o total chegar.
|
|
15
|
+
*/
|
|
16
|
+
pageCount: number;
|
|
17
|
+
};
|
|
18
|
+
export type DataTablePageStatusProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'span'>, {
|
|
19
|
+
/** A tabela. Exige `rowPaginationFeature`. */
|
|
20
|
+
table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;
|
|
21
|
+
/**
|
|
22
|
+
* Uma função que recebe a página e o total e devolve o texto.
|
|
23
|
+
* @default ({ pageIndex, pageCount }) => 'Página 2 de 10', ou 'Página 2' sem o total
|
|
24
|
+
*/
|
|
25
|
+
children?: (values: DataTablePageStatusValues) => React.ReactNode;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Qual a página atual, e de quantas: "Página 2 de 10". Sem o total de páginas, só "Página 2",
|
|
29
|
+
* também na primeira carga, quando o total ainda não chegou.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <DataTable.PageStatus table={table}>
|
|
34
|
+
* {({ pageIndex, pageCount }) => `${pageIndex + 1}/${pageCount}`}
|
|
35
|
+
* </DataTable.PageStatus>
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare const DataTablePageStatus: {
|
|
39
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTablePageStatusProps<TFeatures, TData>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
40
|
+
displayName: string;
|
|
41
|
+
};
|
|
42
|
+
//#endregion
|
|
43
|
+
//# sourceMappingURL=data-table-page-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-page-status.d.ts","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-page-status.tsx"],"mappings":";;;;;;;;YAUY;;EAEV;;;;;EAKA;;YAGU,yBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,UAAU,WAAW;;;;;EAK5B,YAAY,QAAQ,8BAA8B,MAAM;;;;;;;;;;;;;qBAe/C;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,yBAAyB,WAAW,SAAM,MAAA,+BAAA,MAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { getDataTableLoadingWithoutRows } from "../loading/get-data-table-loading-without-rows.js";
|
|
2
|
+
import { mergeProps, useRender } from "@base-ui/react";
|
|
3
|
+
import { shallow, useSelector } from "@tanstack/react-store";
|
|
4
|
+
import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
|
|
5
|
+
//#region src/components/data-table/pagination/data-table-page-status.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Qual a página atual, e de quantas: "Página 2 de 10". Sem o total de páginas, só "Página 2",
|
|
8
|
+
* também na primeira carga, quando o total ainda não chegou.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <DataTable.PageStatus table={table}>
|
|
13
|
+
* {({ pageIndex, pageCount }) => `${pageIndex + 1}/${pageCount}`}
|
|
14
|
+
* </DataTable.PageStatus>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
const DataTablePageStatus = (props) => {
|
|
18
|
+
const { table, render, className, children, ...rest } = props;
|
|
19
|
+
/**
|
|
20
|
+
* Re-renderiza quando a página ou o total mudam. O store, e não só o atom da paginação: o total
|
|
21
|
+
* também muda com as linhas.
|
|
22
|
+
*/
|
|
23
|
+
const values = useSelector(table.store, () => ({
|
|
24
|
+
pageIndex: table.atoms.pagination.get().pageIndex,
|
|
25
|
+
pageCount: getDataTableLoadingWithoutRows(table) ? -1 : table.getPageCount()
|
|
26
|
+
}), { compare: shallow });
|
|
27
|
+
const page = (values.pageIndex + 1).toLocaleString("pt-BR");
|
|
28
|
+
const baseProps = {
|
|
29
|
+
"data-component": "DataTable.PageStatus",
|
|
30
|
+
className: mergeTwClassNames([
|
|
31
|
+
"text-gray-11",
|
|
32
|
+
"text-sm",
|
|
33
|
+
"tabular-nums",
|
|
34
|
+
"whitespace-nowrap"
|
|
35
|
+
], className),
|
|
36
|
+
children: children === void 0 ? values.pageCount === -1 ? `Página ${page}` : `Página ${page} de ${Math.max(values.pageCount, 1).toLocaleString("pt-BR")}` : children(values)
|
|
37
|
+
};
|
|
38
|
+
return useRender({
|
|
39
|
+
render,
|
|
40
|
+
defaultTagName: "span",
|
|
41
|
+
props: mergeProps(baseProps, rest)
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
DataTablePageStatus.displayName = "DataTable.PageStatus";
|
|
45
|
+
//#endregion
|
|
46
|
+
export { DataTablePageStatus };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=data-table-page-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-page-status.js","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-page-status.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { shallow, useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport type { TableWith } from '../../../types';\nimport { getDataTableLoadingWithoutRows } from '../loading/get-data-table-loading-without-rows';\n\n/** A página atual e o total, para o texto do `DataTable.PageStatus`. */\nexport type DataTablePageStatusValues = {\n /** O índice da página atual, a partir de 0. */\n pageIndex: number;\n /**\n * O total de páginas, ou `-1` sem ele: quando a API não informa (`pageCount: -1`) e, com\n * `loadingFeature`, na carga sem linhas, antes de o total chegar.\n */\n pageCount: number;\n};\n\nexport type DataTablePageStatusProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'span'>,\n {\n /** A tabela. Exige `rowPaginationFeature`. */\n table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;\n /**\n * Uma função que recebe a página e o total e devolve o texto.\n * @default ({ pageIndex, pageCount }) => 'Página 2 de 10', ou 'Página 2' sem o total\n */\n children?: (values: DataTablePageStatusValues) => React.ReactNode;\n }\n>;\n\n/**\n * Qual a página atual, e de quantas: \"Página 2 de 10\". Sem o total de páginas, só \"Página 2\",\n * também na primeira carga, quando o total ainda não chegou.\n *\n * @example\n * ```tsx\n * <DataTable.PageStatus table={table}>\n * {({ pageIndex, pageCount }) => `${pageIndex + 1}/${pageCount}`}\n * </DataTable.PageStatus>\n * ```\n */\nexport const DataTablePageStatus = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTablePageStatusProps<TFeatures, TData>,\n) => {\n const { table, render, className, children, ...rest } = props;\n\n /**\n * Re-renderiza quando a página ou o total mudam. O store, e não só o atom da paginação: o total\n * também muda com as linhas.\n */\n const values = useSelector(\n table.store,\n (): DataTablePageStatusValues => ({\n pageIndex: table.atoms.pagination.get().pageIndex,\n pageCount: getDataTableLoadingWithoutRows(table)\n ? -1\n : table.getPageCount(),\n }),\n { compare: shallow },\n );\n\n const page = (values.pageIndex + 1).toLocaleString('pt-BR');\n\n const baseProps = {\n 'data-component': 'DataTable.PageStatus',\n className: mergeTwClassNames(\n ['text-gray-11', 'text-sm', 'tabular-nums', 'whitespace-nowrap'],\n className,\n ),\n children:\n children === undefined\n ? values.pageCount === -1\n ? `Página ${page}`\n : // Sem linhas, o total é 0, e a página 1 continua sendo a atual.\n `Página ${page} de ${Math.max(values.pageCount, 1).toLocaleString('pt-BR')}`\n : children(values),\n };\n\n return useRender({\n render,\n defaultTagName: 'span',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTablePageStatus.displayName = 'DataTable.PageStatus';\n"],"mappings":";;;;;;;;;;;;;;;;AA+CA,MAAa,uBAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,UAAU,GAAG,SAAS;;;;;CAMxD,MAAM,SAAS,YACb,MAAM,cAC4B;EAChC,WAAW,MAAM,MAAM,WAAW,IAAI,CAAC,CAAC;EACxC,WAAW,+BAA+B,KAAK,IAC3C,KACA,MAAM,aAAa;CACzB,IACA,EAAE,SAAS,QAAQ,CACrB;CAEA,MAAM,QAAQ,OAAO,YAAY,EAAA,CAAG,eAAe,OAAO;CAE1D,MAAM,YAAY;EAChB,kBAAkB;EAClB,WAAW,kBACT;GAAC;GAAgB;GAAW;GAAgB;EAAmB,GAC/D,SACF;EACA,UACE,aAAa,KAAA,IACT,OAAO,cAAc,KACnB,UAAU,SAEV,UAAU,KAAK,MAAM,KAAK,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,eAAe,OAAO,MAC3E,SAAS,MAAM;CACvB;CAEA,OAAO,UAAU;EACf;EACA,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,oBAAoB,cAAc"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { TableWith } from "../../../types/table-with.js";
|
|
2
|
+
import "../../../types/index.js";
|
|
3
|
+
import { RowData, TableFeatures } from "@tanstack/react-table";
|
|
4
|
+
import { useRender } from "@base-ui/react";
|
|
5
|
+
import { MergeOverride } from "@lucasbernardosn/utils";
|
|
6
|
+
//#region src/components/data-table/pagination/data-table-pagination.d.ts
|
|
7
|
+
export type DataTablePaginationProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'nav'>, {
|
|
8
|
+
/** A tabela. Exige `rowPaginationFeature`. */
|
|
9
|
+
table: TableWith<TFeatures, TData, 'rowPaginationFeature'>;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* A barra da paginação, para baixo da tabela. Sem `children`, monta o padrão: à esquerda, a
|
|
13
|
+
* contagem de selecionadas (com `rowSelectionFeature`); à direita, o `DataTable.PageSizeSelect`,
|
|
14
|
+
* o `DataTable.RowRange`, o `DataTable.PageStatus` e os quatro `DataTable.PageButton`. Com
|
|
15
|
+
* `children`, o app compõe as partes, cada uma com a `table`. Em tela estreita, os grupos quebram
|
|
16
|
+
* linha.
|
|
17
|
+
*
|
|
18
|
+
* Funciona com a paginação local (`createPaginatedRowModel`) e com a da API
|
|
19
|
+
* (`manualPagination`, com o `rowCount` ou o `pageCount`).
|
|
20
|
+
*
|
|
21
|
+
* É um `nav` com o nome "Paginação", trocável pelo `aria-label`: um marco, que o leitor de tela
|
|
22
|
+
* lista e para onde salta.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <DataTable.Pagination table={table}>
|
|
27
|
+
* <DataTable.PageStatus table={table} />
|
|
28
|
+
* <DataTable.PageButton table={table} page="previous" />
|
|
29
|
+
* <DataTable.PageButton table={table} page="next" />
|
|
30
|
+
* </DataTable.Pagination>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare const DataTablePagination: {
|
|
34
|
+
<TFeatures extends TableFeatures, TData extends RowData>(props: DataTablePaginationProps<TFeatures, TData>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
35
|
+
displayName: string;
|
|
36
|
+
};
|
|
37
|
+
//#endregion
|
|
38
|
+
//# sourceMappingURL=data-table-pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-pagination.d.ts","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-pagination.tsx"],"mappings":";;;;;;YAYY,yBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,UAAU,WAAW;;;;;;;;;;;;;;;;;;;;;;;;qBA0BnB;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,yBAAyB,WAAW,yBAAM,+CAAA"}
|