@proef/common-ui 0.0.0-stage → 2.2.1
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/dist/esm/assets/imagem-6ee08a37d9.png +0 -0
- package/dist/esm/assets/imagem-6fcae1b87b.png +0 -0
- package/dist/esm/index.js +324 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js +5 -0
- package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.css +43 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.js +31 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.js.map +1 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.css +36 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js +57 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.css +218 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js +50 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.css +56 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js +34 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.css +74 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js +29 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.css +99 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js +36 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.css +63 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js +21 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Field/Field.css +171 -0
- package/dist/esm/legacy/components/atoms/Field/Field.js +70 -0
- package/dist/esm/legacy/components/atoms/Field/Field.js.map +1 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.css +10 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.js +25 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Icone/Icone.js +24 -0
- package/dist/esm/legacy/components/atoms/Icone/Icone.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Input/Input.css +12 -0
- package/dist/esm/legacy/components/atoms/Input/Input.js +28 -0
- package/dist/esm/legacy/components/atoms/Input/Input.js.map +1 -0
- package/dist/esm/legacy/components/atoms/InputData/InputData.js +25 -0
- package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Label/Label.css +192 -0
- package/dist/esm/legacy/components/atoms/Label/Label.js +13 -0
- package/dist/esm/legacy/components/atoms/Label/Label.js.map +1 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.css +40 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js +21 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Select/Select.css +16 -0
- package/dist/esm/legacy/components/atoms/Select/Select.js +27 -0
- package/dist/esm/legacy/components/atoms/Select/Select.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Stack/Stack.js +20 -0
- package/dist/esm/legacy/components/atoms/Stack/Stack.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.css +36 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js +29 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js.map +1 -0
- package/dist/esm/legacy/components/charts/Charts.js +349 -0
- package/dist/esm/legacy/components/charts/Charts.js.map +1 -0
- package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js +100 -0
- package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js.map +1 -0
- package/dist/esm/legacy/components/layout/Error/Error.css +20 -0
- package/dist/esm/legacy/components/layout/Error/Error.js +12 -0
- package/dist/esm/legacy/components/layout/Error/Error.js.map +1 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.css +42 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.js +23 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.js.map +1 -0
- package/dist/esm/legacy/components/layout/Header/Header.css +66 -0
- package/dist/esm/legacy/components/layout/Header/Header.js +37 -0
- package/dist/esm/legacy/components/layout/Header/Header.js.map +1 -0
- package/dist/esm/legacy/components/layout/Layout/Layout.js +31 -0
- package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -0
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +38 -0
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.css +10 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.js +19 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.js.map +1 -0
- package/dist/esm/legacy/components/layout/TopBar/TopBar.js +34 -0
- package/dist/esm/legacy/components/layout/TopBar/TopBar.js.map +1 -0
- package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js +82 -0
- package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js.map +1 -0
- package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js +25 -0
- package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js.map +1 -0
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +246 -0
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.css +3 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js +33 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js.map +1 -0
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +1259 -0
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -0
- package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js +68 -0
- package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js.map +1 -0
- package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js +96 -0
- package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js.map +1 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.css +54 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.js +64 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.js.map +1 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.css +97 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js +113 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js.map +1 -0
- package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js +114 -0
- package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js.map +1 -0
- package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js +116 -0
- package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js.map +1 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.css +69 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js +62 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js.map +1 -0
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +23 -0
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -0
- package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js +162 -0
- package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Kanban/Kanban.js +88 -0
- package/dist/esm/legacy/components/organisms/Kanban/Kanban.js.map +1 -0
- package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js +87 -0
- package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js.map +1 -0
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +427 -0
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -0
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +218 -0
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -0
- package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js +147 -0
- package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.css +26 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.js +26 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.js.map +1 -0
- package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js +79 -0
- package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.css +87 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.js +181 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -0
- package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js +115 -0
- package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js.map +1 -0
- package/dist/esm/legacy/components/ui/Avisos.js +33 -0
- package/dist/esm/legacy/components/ui/Avisos.js.map +1 -0
- package/dist/esm/legacy/components/ui/BarraAcoes.js +19 -0
- package/dist/esm/legacy/components/ui/BarraAcoes.js.map +1 -0
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js +19 -0
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -0
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js +9 -0
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -0
- package/dist/esm/legacy/components/ui/Confirmacao.js +34 -0
- package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -0
- package/dist/esm/legacy/components/ui/Escolha.js +41 -0
- package/dist/esm/legacy/components/ui/Escolha.js.map +1 -0
- package/dist/esm/legacy/components/ui/FaixaAviso.js +19 -0
- package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -0
- package/dist/esm/legacy/components/ui/MenuAcoes.js +116 -0
- package/dist/esm/legacy/components/ui/MenuAcoes.js.map +1 -0
- package/dist/esm/legacy/components/ui/Passos.js +32 -0
- package/dist/esm/legacy/components/ui/Passos.js.map +1 -0
- package/dist/esm/legacy/components/ui/Separadores.js +17 -0
- package/dist/esm/legacy/components/ui/Separadores.js.map +1 -0
- package/dist/esm/legacy/components/ui/TextoAuto.js +33 -0
- package/dist/esm/legacy/components/ui/TextoAuto.js.map +1 -0
- package/dist/esm/legacy/components/ui/Ui.js +263 -0
- package/dist/esm/legacy/components/ui/Ui.js.map +1 -0
- package/dist/esm/legacy/components/ui/painelFlutuante.js +13 -0
- package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -0
- package/dist/esm/legacy/constants/Colors.js +33 -0
- package/dist/esm/legacy/constants/Colors.js.map +1 -0
- package/dist/esm/legacy/constants/FontWeight.js +35 -0
- package/dist/esm/legacy/constants/FontWeight.js.map +1 -0
- package/dist/esm/legacy/contexts/apiContext.js +25 -0
- package/dist/esm/legacy/contexts/apiContext.js.map +1 -0
- package/dist/esm/legacy/contexts/authContext.js +85 -0
- package/dist/esm/legacy/contexts/authContext.js.map +1 -0
- package/dist/esm/legacy/contexts/socketContext.js +34 -0
- package/dist/esm/legacy/contexts/socketContext.js.map +1 -0
- package/dist/esm/legacy/hooks/useApi.js +62 -0
- package/dist/esm/legacy/hooks/useApi.js.map +1 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.css +18 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.js +50 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.js.map +1 -0
- package/dist/esm/legacy/pages/Loading/Loading.css +46 -0
- package/dist/esm/legacy/pages/Loading/Loading.js +9 -0
- package/dist/esm/legacy/pages/Loading/Loading.js.map +1 -0
- package/dist/esm/legacy/pages/Login/LoginScreen.js +46 -0
- package/dist/esm/legacy/pages/Login/LoginScreen.js.map +1 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.css +21 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.js +24 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.js.map +1 -0
- package/dist/esm/legacy/styles/themes/ButtonThemes.js +28 -0
- package/dist/esm/legacy/styles/themes/ButtonThemes.js.map +1 -0
- package/dist/esm/legacy/styles/utils/utils.js +7 -0
- package/dist/esm/legacy/styles/utils/utils.js.map +1 -0
- package/dist/esm/legacy/utils/stringUtils.js +35 -0
- package/dist/esm/legacy/utils/stringUtils.js.map +1 -0
- package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js +157 -0
- package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js.map +1 -0
- package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js +52 -0
- package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js.map +1 -0
- package/dist/esm/v1/capabilities/theme/useIsDark.js +15 -0
- package/dist/esm/v1/capabilities/theme/useIsDark.js.map +1 -0
- package/dist/esm/v1/capabilities/theme/useTheme.js +66 -0
- package/dist/esm/v1/capabilities/theme/useTheme.js.map +1 -0
- package/dist/esm/v1/components/data/Pagination/Pagination.js +66 -0
- package/dist/esm/v1/components/data/Pagination/Pagination.js.map +1 -0
- package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js +307 -0
- package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js.map +1 -0
- package/dist/esm/v1/components/feedback/Toast/Toast.js +105 -0
- package/dist/esm/v1/components/feedback/Toast/Toast.js.map +1 -0
- package/dist/esm/v1/components/forms/FormField/FormField.js +59 -0
- package/dist/esm/v1/components/forms/FormField/FormField.js.map +1 -0
- package/dist/esm/v1/components/forms/FormGrid/FormGrid.js +20 -0
- package/dist/esm/v1/components/forms/FormGrid/FormGrid.js.map +1 -0
- package/dist/esm/v1/components/layout/AppShell/AppShell.js +89 -0
- package/dist/esm/v1/components/layout/AppShell/AppShell.js.map +1 -0
- package/dist/esm/v1/components/layout/Page/Page.js +16 -0
- package/dist/esm/v1/components/layout/Page/Page.js.map +1 -0
- package/dist/esm/v1/components/layout/PageHeader/PageHeader.js +26 -0
- package/dist/esm/v1/components/layout/PageHeader/PageHeader.js.map +1 -0
- package/dist/esm/v1/components/layout/SideNav/SideNav.js +287 -0
- package/dist/esm/v1/components/layout/SideNav/SideNav.js.map +1 -0
- package/dist/esm/v1/components/layout/navTrail.js +19 -0
- package/dist/esm/v1/components/layout/navTrail.js.map +1 -0
- package/dist/esm/v1/components/lists/ListFinder/ListFinder.js +271 -0
- package/dist/esm/v1/components/lists/ListFinder/ListFinder.js.map +1 -0
- package/dist/esm/v1/components/lists/ListFinder/labels.js +18 -0
- package/dist/esm/v1/components/lists/ListFinder/labels.js.map +1 -0
- package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js +95 -0
- package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js.map +1 -0
- package/dist/esm/v1/components/overlays/Dialog/Dialog.js +141 -0
- package/dist/esm/v1/components/overlays/Dialog/Dialog.js.map +1 -0
- package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js +98 -0
- package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js.map +1 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js +84 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js.map +1 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js +33 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js.map +1 -0
- package/dist/esm/v1/components/overlays/topLayer.js +28 -0
- package/dist/esm/v1/components/overlays/topLayer.js.map +1 -0
- package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js +50 -0
- package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js.map +1 -0
- package/dist/esm/v1/components/tables/Table/ColumnFilter.js +292 -0
- package/dist/esm/v1/components/tables/Table/ColumnFilter.js.map +1 -0
- package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js +129 -0
- package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js.map +1 -0
- package/dist/esm/v1/components/tables/Table/Table.js +1410 -0
- package/dist/esm/v1/components/tables/Table/Table.js.map +1 -0
- package/dist/esm/v1/components/tables/Table/labels.js +44 -0
- package/dist/esm/v1/components/tables/Table/labels.js.map +1 -0
- package/dist/esm/v1/foundations/icons/icons.js +227 -0
- package/dist/esm/v1/foundations/icons/icons.js.map +1 -0
- package/dist/esm/v1/primitives/buttons/Button/Button.js +41 -0
- package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js +65 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js.map +1 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js +10 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js.map +1 -0
- package/dist/esm/v1/primitives/display/Avatar/Avatar.js +120 -0
- package/dist/esm/v1/primitives/display/Avatar/Avatar.js.map +1 -0
- package/dist/esm/v1/primitives/display/Badge/Badge.js +23 -0
- package/dist/esm/v1/primitives/display/Badge/Badge.js.map +1 -0
- package/dist/esm/v1/primitives/display/Card/Card.js +22 -0
- package/dist/esm/v1/primitives/display/Card/Card.js.map +1 -0
- package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js +45 -0
- package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js.map +1 -0
- package/dist/esm/v1/primitives/display/Kpi/Kpi.js +103 -0
- package/dist/esm/v1/primitives/display/Kpi/Kpi.js.map +1 -0
- package/dist/esm/v1/primitives/display/Notice/Notice.js +71 -0
- package/dist/esm/v1/primitives/display/Notice/Notice.js.map +1 -0
- package/dist/esm/v1/primitives/display/Person/Person.js +14 -0
- package/dist/esm/v1/primitives/display/Person/Person.js.map +1 -0
- package/dist/esm/v1/primitives/display/RichText/RichText.js +12 -0
- package/dist/esm/v1/primitives/display/RichText/RichText.js.map +1 -0
- package/dist/esm/v1/primitives/display/RichText/utils.js +56 -0
- package/dist/esm/v1/primitives/display/RichText/utils.js.map +1 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js +137 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js.map +1 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js +26 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js.map +1 -0
- package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js +37 -0
- package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -0
- package/dist/esm/v1/primitives/forms/DateInput/DateInput.js +150 -0
- package/dist/esm/v1/primitives/forms/DateInput/DateInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js +37 -0
- package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/RichTextEditor/RichTextEditor.js +253 -0
- package/dist/esm/v1/primitives/forms/RichTextEditor/RichTextEditor.js.map +1 -0
- package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js +43 -0
- package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +207 -0
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/TextArea/TextArea.js +75 -0
- package/dist/esm/v1/primitives/forms/TextArea/TextArea.js.map +1 -0
- package/dist/esm/v1/primitives/forms/TextInput/TextInput.js +21 -0
- package/dist/esm/v1/primitives/forms/TextInput/TextInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/field.js +14 -0
- package/dist/esm/v1/primitives/forms/field.js.map +1 -0
- package/dist/esm/v1/primitives/lists/ListItem/ListItem.js +73 -0
- package/dist/esm/v1/primitives/lists/ListItem/ListItem.js.map +1 -0
- package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js +96 -0
- package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js.map +1 -0
- package/dist/style.components.css +3 -0
- package/dist/style.css +2 -0
- package/dist/style.layered.css +2 -0
- package/dist/tailwind.css +24 -0
- package/dist/theme-boot.js +1 -0
- package/dist/theme.css +265 -0
- package/dist/tokens.css +121 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/legacy/components/atoms/Acronym/Acronym.d.ts +11 -0
- package/dist/types/legacy/components/atoms/BreadCrumb/BreadCrumb.d.ts +9 -0
- package/dist/types/legacy/components/atoms/Button/variants/ActionButton.d.ts +14 -0
- package/dist/types/legacy/components/atoms/Button/variants/FilterButton.d.ts +12 -0
- package/dist/types/legacy/components/atoms/Button/variants/IconButton.d.ts +22 -0
- package/dist/types/legacy/components/atoms/Button/variants/MainButton.d.ts +17 -0
- package/dist/types/legacy/components/atoms/Button/variants/TabButton.d.ts +14 -0
- package/dist/types/legacy/components/atoms/Field/Field.d.ts +15 -0
- package/dist/types/legacy/components/atoms/IconText/IconText.d.ts +12 -0
- package/dist/types/legacy/components/atoms/Icone/Icone.d.ts +31 -0
- package/dist/types/legacy/components/atoms/Input/Input.d.ts +13 -0
- package/dist/types/legacy/components/atoms/InputData/InputData.d.ts +38 -0
- package/dist/types/legacy/components/atoms/Label/Label.d.ts +11 -0
- package/dist/types/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.d.ts +10 -0
- package/dist/types/legacy/components/atoms/SearchSelect/SearchSelect.d.ts +15 -0
- package/dist/types/legacy/components/atoms/Select/Select.d.ts +16 -0
- package/dist/types/legacy/components/atoms/Stack/Stack.d.ts +9 -0
- package/dist/types/legacy/components/atoms/Switch/CustomSwitch.d.ts +12 -0
- package/dist/types/legacy/components/charts/Charts.d.ts +149 -0
- package/dist/types/legacy/components/layout/AppLauncher/AppLauncher.d.ts +35 -0
- package/dist/types/legacy/components/layout/Error/Error.d.ts +8 -0
- package/dist/types/legacy/components/layout/Footer/Footer.d.ts +11 -0
- package/dist/types/legacy/components/layout/Header/Header.d.ts +16 -0
- package/dist/types/legacy/components/layout/Layout/Layout.d.ts +35 -0
- package/dist/types/legacy/components/layout/Sidebar/Sidebar.d.ts +56 -0
- package/dist/types/legacy/components/layout/Spinner/Spinner.d.ts +5 -0
- package/dist/types/legacy/components/layout/TopBar/TopBar.d.ts +10 -0
- package/dist/types/legacy/components/layout/TopNavLayout/TopNavLayout.d.ts +43 -0
- package/dist/types/legacy/components/molecules/BarraValor/BarraValor.d.ts +28 -0
- package/dist/types/legacy/components/molecules/ColumnPicker/ColumnPicker.d.ts +116 -0
- package/dist/types/legacy/components/molecules/ConfirmModal/ConfirmModal.d.ts +13 -0
- package/dist/types/legacy/components/molecules/DataTable/DataTable.d.ts +344 -0
- package/dist/types/legacy/components/molecules/FileDropzone/FileDropzone.d.ts +25 -0
- package/dist/types/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +33 -0
- package/dist/types/legacy/components/molecules/Modal/Modal.d.ts +22 -0
- package/dist/types/legacy/components/molecules/MultiTagPicker/MultiTagPicker.d.ts +25 -0
- package/dist/types/legacy/components/molecules/PhotoAvatar/PhotoAvatar.d.ts +34 -0
- package/dist/types/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.d.ts +48 -0
- package/dist/types/legacy/components/molecules/Sidebar/Sidebar.d.ts +12 -0
- package/dist/types/legacy/components/molecules/UserAvatar/UserAvatar.d.ts +19 -0
- package/dist/types/legacy/components/organisms/GanttChart/GanttChart.d.ts +62 -0
- package/dist/types/legacy/components/organisms/Kanban/Kanban.d.ts +44 -0
- package/dist/types/legacy/components/organisms/LazyLoader/LazyLoader.d.ts +16 -0
- package/dist/types/legacy/components/organisms/MapaPontos/MapaPontos.d.ts +206 -0
- package/dist/types/legacy/components/organisms/PainelFiltros/PainelFiltros.d.ts +69 -0
- package/dist/types/legacy/components/organisms/PesquisaRapida/PesquisaRapida.d.ts +53 -0
- package/dist/types/legacy/components/organisms/Profile/Profile.d.ts +12 -0
- package/dist/types/legacy/components/organisms/RoleGuard/RoleGuard.d.ts +37 -0
- package/dist/types/legacy/components/organisms/Selector/Selector.d.ts +20 -0
- package/dist/types/legacy/components/organisms/StatusMatrix/StatusMatrix.d.ts +54 -0
- package/dist/types/legacy/components/ui/Avisos.d.ts +33 -0
- package/dist/types/legacy/components/ui/BarraAcoes.d.ts +19 -0
- package/dist/types/legacy/components/ui/CabecalhoPagina.d.ts +23 -0
- package/dist/types/legacy/components/ui/CaixaPesquisa.d.ts +14 -0
- package/dist/types/legacy/components/ui/Confirmacao.d.ts +24 -0
- package/dist/types/legacy/components/ui/Escolha.d.ts +35 -0
- package/dist/types/legacy/components/ui/FaixaAviso.d.ts +19 -0
- package/dist/types/legacy/components/ui/MenuAcoes.d.ts +31 -0
- package/dist/types/legacy/components/ui/Passos.d.ts +31 -0
- package/dist/types/legacy/components/ui/Separadores.d.ts +19 -0
- package/dist/types/legacy/components/ui/TextoAuto.d.ts +23 -0
- package/dist/types/legacy/components/ui/Ui.d.ts +181 -0
- package/dist/types/legacy/components/ui/painelFlutuante.d.ts +16 -0
- package/dist/types/legacy/constants/Colors.d.ts +28 -0
- package/dist/types/legacy/constants/FontWeight.d.ts +9 -0
- package/dist/types/legacy/contexts/apiContext.d.ts +10 -0
- package/dist/types/legacy/contexts/authContext.d.ts +31 -0
- package/dist/types/legacy/contexts/socketContext.d.ts +16 -0
- package/dist/types/legacy/exports/assets.d.ts +0 -0
- package/dist/types/legacy/exports/atoms.d.ts +19 -0
- package/dist/types/legacy/exports/charts.d.ts +2 -0
- package/dist/types/legacy/exports/constants.d.ts +0 -0
- package/dist/types/legacy/exports/contexts.d.ts +3 -0
- package/dist/types/legacy/exports/hooks.d.ts +4 -0
- package/dist/types/legacy/exports/layout.d.ts +14 -0
- package/dist/types/legacy/exports/molecules.d.ts +21 -0
- package/dist/types/legacy/exports/organisms.d.ts +17 -0
- package/dist/types/legacy/exports/pages.d.ts +5 -0
- package/dist/types/legacy/exports/styles.d.ts +2 -0
- package/dist/types/legacy/exports/types.d.ts +7 -0
- package/dist/types/legacy/exports/ui.d.ts +24 -0
- package/dist/types/legacy/exports/utils.d.ts +1 -0
- package/dist/types/legacy/hooks/useApi.d.ts +19 -0
- package/dist/types/legacy/pages/Error/ErrorPage.d.ts +16 -0
- package/dist/types/legacy/pages/Loading/Loading.d.ts +8 -0
- package/dist/types/legacy/pages/Login/LoginScreen.d.ts +42 -0
- package/dist/types/legacy/pages/NotFound/NotFound.d.ts +8 -0
- package/dist/types/legacy/styles/themes/ButtonThemes.d.ts +6 -0
- package/dist/types/legacy/styles/utils/utils.d.ts +2 -0
- package/dist/types/legacy/types/Fetcher.d.ts +5 -0
- package/dist/types/legacy/types/LoggedUser.d.ts +10 -0
- package/dist/types/legacy/types/SelectableElement.d.ts +6 -0
- package/dist/types/legacy/types/SidebarMenu.d.ts +12 -0
- package/dist/types/legacy/types/themes/AcronymThemes.d.ts +4 -0
- package/dist/types/legacy/types/themes/ButtonThemes.d.ts +21 -0
- package/dist/types/legacy/types/themes/CustomSwitchThemes.d.ts +4 -0
- package/dist/types/legacy/types/themes/IconTextThemes.d.ts +6 -0
- package/dist/types/legacy/utils/keycloak.d.ts +0 -0
- package/dist/types/legacy/utils/stringUtils.d.ts +6 -0
- package/dist/types/v1/capabilities/documents/QRScanning/scanQRCodes.d.ts +25 -0
- package/dist/types/v1/capabilities/overlay/useFloatingPanel.d.ts +20 -0
- package/dist/types/v1/capabilities/theme/useIsDark.d.ts +10 -0
- package/dist/types/v1/capabilities/theme/useTheme.d.ts +29 -0
- package/dist/types/v1/components/data/Pagination/Pagination.d.ts +33 -0
- package/dist/types/v1/components/documents/DocumentDropzone/DocumentDropzone.d.ts +60 -0
- package/dist/types/v1/components/feedback/Toast/Toast.d.ts +51 -0
- package/dist/types/v1/components/forms/FormField/FormField.d.ts +44 -0
- package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +23 -0
- package/dist/types/v1/components/layout/AppShell/AppShell.d.ts +35 -0
- package/dist/types/v1/components/layout/Page/Page.d.ts +23 -0
- package/dist/types/v1/components/layout/PageHeader/PageHeader.d.ts +35 -0
- package/dist/types/v1/components/layout/SideNav/SideNav.d.ts +92 -0
- package/dist/types/v1/components/layout/navTrail.d.ts +15 -0
- package/dist/types/v1/components/lists/ListFinder/ListFinder.d.ts +86 -0
- package/dist/types/v1/components/lists/ListFinder/labels.d.ts +24 -0
- package/dist/types/v1/components/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
- package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +66 -0
- package/dist/types/v1/components/overlays/Tooltip/Tooltip.d.ts +34 -0
- package/dist/types/v1/components/overlays/Tooltip/TooltipLayer.d.ts +18 -0
- package/dist/types/v1/components/overlays/Tooltip/TooltipPanel.d.ts +23 -0
- package/dist/types/v1/components/overlays/topLayer.d.ts +23 -0
- package/dist/types/v1/components/tables/PaginatedTable/PaginatedTable.d.ts +41 -0
- package/dist/types/v1/components/tables/Table/ColumnFilter.d.ts +48 -0
- package/dist/types/v1/components/tables/Table/OverlayScrollbar.d.ts +34 -0
- package/dist/types/v1/components/tables/Table/Table.d.ts +250 -0
- package/dist/types/v1/components/tables/Table/labels.d.ts +54 -0
- package/dist/types/v1/foundations/icons/icons.d.ts +81 -0
- package/dist/types/v1/index.d.ts +86 -0
- package/dist/types/v1/primitives/buttons/Button/Button.d.ts +35 -0
- package/dist/types/v1/primitives/buttons/SegmentedControl/SegmentedControl.d.ts +28 -0
- package/dist/types/v1/primitives/buttons/SegmentedControl/segmentedStyles.d.ts +16 -0
- package/dist/types/v1/primitives/display/Avatar/Avatar.d.ts +30 -0
- package/dist/types/v1/primitives/display/Badge/Badge.d.ts +25 -0
- package/dist/types/v1/primitives/display/Card/Card.d.ts +22 -0
- package/dist/types/v1/primitives/display/FilterChips/FilterChips.d.ts +33 -0
- package/dist/types/v1/primitives/display/Kpi/Kpi.d.ts +68 -0
- package/dist/types/v1/primitives/display/Notice/Notice.d.ts +29 -0
- package/dist/types/v1/primitives/display/Person/Person.d.ts +15 -0
- package/dist/types/v1/primitives/display/RichText/RichText.d.ts +17 -0
- package/dist/types/v1/primitives/display/RichText/utils.d.ts +22 -0
- package/dist/types/v1/primitives/documents/PdfPreview/PdfPreview.d.ts +17 -0
- package/dist/types/v1/primitives/documents/PdfPreview/pdfjs.d.ts +11 -0
- package/dist/types/v1/primitives/forms/Checkbox/Checkbox.d.ts +25 -0
- package/dist/types/v1/primitives/forms/DateInput/DateInput.d.ts +43 -0
- package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +28 -0
- package/dist/types/v1/primitives/forms/RichTextEditor/RichTextEditor.d.ts +64 -0
- package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
- package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +70 -0
- package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +40 -0
- package/dist/types/v1/primitives/forms/TextInput/TextInput.d.ts +16 -0
- package/dist/types/v1/primitives/forms/field.d.ts +22 -0
- package/dist/types/v1/primitives/lists/ListItem/ListItem.d.ts +67 -0
- package/dist/types/v1/primitives/navigation/Tabs/Tabs.d.ts +58 -0
- package/package.json +125 -6
- package/README.md +0 -3
|
@@ -0,0 +1,1259 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useMemo, useRef, useLayoutEffect, Fragment } from "react";
|
|
3
|
+
import { FilterChips } from "../../../../v1/primitives/display/FilterChips/FilterChips.js";
|
|
4
|
+
import { Pagination } from "../../../../v1/components/data/Pagination/Pagination.js";
|
|
5
|
+
import { createPortal } from "react-dom";
|
|
6
|
+
const DEFAULT_LABELS = {
|
|
7
|
+
total: "Total",
|
|
8
|
+
scrollRegion: "Tabela (deslizar na horizontal)",
|
|
9
|
+
results: "{count} results",
|
|
10
|
+
resizeColumn: "Drag to resize · double-click to reset",
|
|
11
|
+
export: "Export",
|
|
12
|
+
loading: "Loading…",
|
|
13
|
+
empty: "No data",
|
|
14
|
+
error: "Failed to load",
|
|
15
|
+
search: "Search…",
|
|
16
|
+
clear: "Clear",
|
|
17
|
+
clearAll: "Clear all",
|
|
18
|
+
noOptions: "No options",
|
|
19
|
+
selected: "{count} sel.",
|
|
20
|
+
moreOptions: "Showing {shown} of {total} — refine your search",
|
|
21
|
+
loadingOptions: "Loading options from all pages…",
|
|
22
|
+
min: "From",
|
|
23
|
+
max: "To",
|
|
24
|
+
from: "From",
|
|
25
|
+
to: "To",
|
|
26
|
+
page: "Page {page}/{pages}",
|
|
27
|
+
prev: "Prev",
|
|
28
|
+
next: "Next",
|
|
29
|
+
sortAsc: "Sort ascending",
|
|
30
|
+
sortDesc: "Sort descending",
|
|
31
|
+
sortOldest: "Oldest first",
|
|
32
|
+
sortNewest: "Newest first",
|
|
33
|
+
sortSmallest: "Smallest first",
|
|
34
|
+
sortLargest: "Largest first",
|
|
35
|
+
groupBy: "Group by {label}",
|
|
36
|
+
ungroup: "Remove grouping by {label}",
|
|
37
|
+
clearGroups: "Clear grouping",
|
|
38
|
+
perPage: "Per page",
|
|
39
|
+
selectAll: "(Select all)",
|
|
40
|
+
selectAllResults: "(Select results)"
|
|
41
|
+
};
|
|
42
|
+
const Funnel = ({ size = 12, className }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", className, children: /* @__PURE__ */ jsx("path", { d: "M22 3H2l8 9.46V19l4 2v-8.54L22 3z" }) });
|
|
43
|
+
const Layers = ({ size = 11, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
|
|
44
|
+
/* @__PURE__ */ jsx("path", { d: "m12 2 9 5-9 5-9-5 9-5z" }),
|
|
45
|
+
/* @__PURE__ */ jsx("path", { d: "m3 17 9 5 9-5M3 12l9 5 9-5" })
|
|
46
|
+
] });
|
|
47
|
+
const Caret = ({ size = 11, className }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", className, children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" }) });
|
|
48
|
+
const Spinner = ({ size = 16, className }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", className: `animate-spin ${className ?? ""}`, "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }) });
|
|
49
|
+
const EMPTY = "—";
|
|
50
|
+
const MAX_OPCOES_FILTRO = 50;
|
|
51
|
+
const DEFAULT_STICKY_WIDTH = 160;
|
|
52
|
+
const COLLATOR = new Intl.Collator(void 0, { numeric: true });
|
|
53
|
+
function rawValue(row, col) {
|
|
54
|
+
if (col.value) {
|
|
55
|
+
const v2 = col.value(row);
|
|
56
|
+
return v2 == null ? null : v2;
|
|
57
|
+
}
|
|
58
|
+
const v = row[col.key];
|
|
59
|
+
if (v == null) return null;
|
|
60
|
+
if (typeof v === "number" || typeof v === "string") return v;
|
|
61
|
+
return String(v);
|
|
62
|
+
}
|
|
63
|
+
const normalizarRotulo = (v) => v == null || v === "" ? EMPTY : String(v);
|
|
64
|
+
function filterKey(row, col) {
|
|
65
|
+
return normalizarRotulo(rawValue(row, col));
|
|
66
|
+
}
|
|
67
|
+
function temValor(row, col) {
|
|
68
|
+
if (col.filterValues) return col.filterValues(row).some((v) => v != null && v !== "");
|
|
69
|
+
return rawValue(row, col) !== null;
|
|
70
|
+
}
|
|
71
|
+
function lerFiltrosGuardados(columns, f) {
|
|
72
|
+
return Object.fromEntries(
|
|
73
|
+
Object.entries(f).map(([k, v]) => {
|
|
74
|
+
const data = columns.find((c) => c.key === k)?.sortType === "date";
|
|
75
|
+
return [k, new Set(data ? v.map(rotuloDeData) : v)];
|
|
76
|
+
})
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
function chaveDosFiltros(f) {
|
|
80
|
+
return JSON.stringify(
|
|
81
|
+
Object.entries(f).map(([k, v]) => [k, [...v].sort()]).sort()
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
function timestampDeData(v) {
|
|
85
|
+
if (v == null || v === "") return NaN;
|
|
86
|
+
if (v instanceof Date) return v.getTime();
|
|
87
|
+
if (typeof v === "number") return Number.isFinite(v) ? v : NaN;
|
|
88
|
+
const s = String(v).trim();
|
|
89
|
+
const m = /^(\d{1,2})[/-](\d{1,2})[/-](\d{4})/.exec(s);
|
|
90
|
+
if (m) return Date.UTC(Number(m[3]), Number(m[2]) - 1, Number(m[1]));
|
|
91
|
+
const t = new Date(s).getTime();
|
|
92
|
+
return Number.isNaN(t) ? NaN : t;
|
|
93
|
+
}
|
|
94
|
+
const doisDigitos = (n) => String(n).padStart(2, "0");
|
|
95
|
+
const RX_CHAVE_DIA = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
96
|
+
function chaveDia(v) {
|
|
97
|
+
if (v == null || v === "") return null;
|
|
98
|
+
if (typeof v === "string") {
|
|
99
|
+
const s = v.trim();
|
|
100
|
+
const pt = /^(\d{1,2})[/-](\d{1,2})[/-](\d{4})/.exec(s);
|
|
101
|
+
if (pt) return `${pt[3]}-${doisDigitos(pt[2])}-${doisDigitos(pt[1])}`;
|
|
102
|
+
if (RX_CHAVE_DIA.test(s)) return s;
|
|
103
|
+
}
|
|
104
|
+
const t = timestampDeData(v);
|
|
105
|
+
if (!Number.isFinite(t)) return null;
|
|
106
|
+
const d = new Date(t);
|
|
107
|
+
return `${d.getFullYear()}-${doisDigitos(d.getMonth() + 1)}-${doisDigitos(d.getDate())}`;
|
|
108
|
+
}
|
|
109
|
+
function rotuloDeData(v) {
|
|
110
|
+
if (v == null || v === "") return EMPTY;
|
|
111
|
+
return chaveDia(v) ?? String(v);
|
|
112
|
+
}
|
|
113
|
+
function diaVisivel(v) {
|
|
114
|
+
const m = RX_CHAVE_DIA.exec(v);
|
|
115
|
+
return m ? `${m[3]}/${m[2]}/${m[1]}` : v;
|
|
116
|
+
}
|
|
117
|
+
function ordenarDias(a, b) {
|
|
118
|
+
if (a === EMPTY) return 1;
|
|
119
|
+
if (b === EMPTY) return -1;
|
|
120
|
+
const da = RX_CHAVE_DIA.test(a);
|
|
121
|
+
const db = RX_CHAVE_DIA.test(b);
|
|
122
|
+
if (da && db) return a < b ? 1 : a > b ? -1 : 0;
|
|
123
|
+
if (da) return -1;
|
|
124
|
+
if (db) return 1;
|
|
125
|
+
return COLLATOR.compare(a, b);
|
|
126
|
+
}
|
|
127
|
+
function compare(a, b, type) {
|
|
128
|
+
if (a == null && b == null) return 0;
|
|
129
|
+
if (a == null) return 1;
|
|
130
|
+
if (b == null) return -1;
|
|
131
|
+
if (type === "number") return Number(a) - Number(b);
|
|
132
|
+
if (type === "date") return timestampDeData(a) - timestampDeData(b);
|
|
133
|
+
return COLLATOR.compare(String(a), String(b));
|
|
134
|
+
}
|
|
135
|
+
function valorParaIntervalo(row, col) {
|
|
136
|
+
const v = rawValue(row, col);
|
|
137
|
+
return col.sortType === "date" ? timestampDeData(v) : Number(v);
|
|
138
|
+
}
|
|
139
|
+
function toCsv(columns, rows) {
|
|
140
|
+
const esc = (v) => {
|
|
141
|
+
const s = v == null ? "" : String(v);
|
|
142
|
+
return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s;
|
|
143
|
+
};
|
|
144
|
+
const head = columns.map((c) => esc(c.label)).join(",");
|
|
145
|
+
const body = rows.map((r) => columns.map((c) => esc(rawValue(r, c))).join(",")).join("\n");
|
|
146
|
+
return `${head}
|
|
147
|
+
${body}`;
|
|
148
|
+
}
|
|
149
|
+
const ordenarRotulos = (a, b) => a === EMPTY ? 1 : b === EMPTY ? -1 : COLLATOR.compare(a, b);
|
|
150
|
+
const SEM_CRUZAMENTO = [];
|
|
151
|
+
const escaparRegex = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
152
|
+
function pesquisaCuringa(q) {
|
|
153
|
+
let fonte = "";
|
|
154
|
+
let literal = "";
|
|
155
|
+
let temCuringa = false;
|
|
156
|
+
for (let i = 0; i < q.length; i++) {
|
|
157
|
+
const c = q[i];
|
|
158
|
+
const seguinte = q[i + 1];
|
|
159
|
+
if (c === "~" && (seguinte === "*" || seguinte === "?" || seguinte === "~")) {
|
|
160
|
+
fonte += escaparRegex(seguinte);
|
|
161
|
+
literal += seguinte;
|
|
162
|
+
i++;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (c === "*" || c === "?") {
|
|
166
|
+
fonte += c === "*" ? ".*" : ".";
|
|
167
|
+
literal += c;
|
|
168
|
+
temCuringa = true;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
fonte += escaparRegex(c);
|
|
172
|
+
literal += c;
|
|
173
|
+
}
|
|
174
|
+
if (!temCuringa) return (v) => v.includes(literal);
|
|
175
|
+
const rx = new RegExp(`^${fonte}$`);
|
|
176
|
+
return (v) => rx.test(v);
|
|
177
|
+
}
|
|
178
|
+
function DataTable({
|
|
179
|
+
columns,
|
|
180
|
+
data,
|
|
181
|
+
allData,
|
|
182
|
+
onDataNeeded,
|
|
183
|
+
isAllDataLoading,
|
|
184
|
+
alwaysClient,
|
|
185
|
+
totalCount,
|
|
186
|
+
onClientModeChange,
|
|
187
|
+
rowKey,
|
|
188
|
+
onRowClick,
|
|
189
|
+
onRowDoubleClick,
|
|
190
|
+
rowClassName,
|
|
191
|
+
onVisibleRowsChange,
|
|
192
|
+
isLoading,
|
|
193
|
+
isError,
|
|
194
|
+
maxHeight = "70vh",
|
|
195
|
+
pageSize,
|
|
196
|
+
pageSizeOptions,
|
|
197
|
+
selectable,
|
|
198
|
+
onSelectionChange,
|
|
199
|
+
isRowSelectable,
|
|
200
|
+
initialSelectedKeys,
|
|
201
|
+
clearSelectionTrigger,
|
|
202
|
+
storageKey,
|
|
203
|
+
defaultMaxColumnWidth = 360,
|
|
204
|
+
resizableColumns = true,
|
|
205
|
+
sortFromFilter = true,
|
|
206
|
+
filterMode = "excel",
|
|
207
|
+
defaultSortKey,
|
|
208
|
+
defaultSortDir,
|
|
209
|
+
viewRef,
|
|
210
|
+
exportFileName,
|
|
211
|
+
onExport,
|
|
212
|
+
extraToolbar,
|
|
213
|
+
emptySubLabel,
|
|
214
|
+
emptyIcon,
|
|
215
|
+
labels,
|
|
216
|
+
totalRow = false,
|
|
217
|
+
defaultGroupBy,
|
|
218
|
+
groupBy,
|
|
219
|
+
onGroupByChange,
|
|
220
|
+
onSortChange,
|
|
221
|
+
onColumnFiltersChange,
|
|
222
|
+
scrollAffordance = false
|
|
223
|
+
}) {
|
|
224
|
+
const L = { ...DEFAULT_LABELS, ...labels };
|
|
225
|
+
const [larguras, setLarguras] = useState(() => {
|
|
226
|
+
if (!storageKey) return {};
|
|
227
|
+
try {
|
|
228
|
+
return JSON.parse(localStorage.getItem(`dt_widths_${storageKey}`) ?? "{}");
|
|
229
|
+
} catch {
|
|
230
|
+
return {};
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
useEffect(() => {
|
|
234
|
+
if (!storageKey) return;
|
|
235
|
+
try {
|
|
236
|
+
localStorage.setItem(`dt_widths_${storageKey}`, JSON.stringify(larguras));
|
|
237
|
+
} catch {
|
|
238
|
+
}
|
|
239
|
+
}, [larguras, storageKey]);
|
|
240
|
+
const larguraMax = (c) => larguras[c.key] ?? c.maxWidth ?? (defaultMaxColumnWidth > 0 ? defaultMaxColumnWidth : void 0);
|
|
241
|
+
const iniciarResize = (e, key) => {
|
|
242
|
+
e.preventDefault();
|
|
243
|
+
e.stopPropagation();
|
|
244
|
+
const th = e.currentTarget.parentElement;
|
|
245
|
+
const x0 = e.clientX;
|
|
246
|
+
const w0 = th?.getBoundingClientRect().width ?? 120;
|
|
247
|
+
const mover = (ev) => setLarguras((l) => ({ ...l, [key]: Math.max(60, Math.round(w0 + ev.clientX - x0)) }));
|
|
248
|
+
const parar = () => {
|
|
249
|
+
window.removeEventListener("mousemove", mover);
|
|
250
|
+
window.removeEventListener("mouseup", parar);
|
|
251
|
+
document.body.style.cursor = "";
|
|
252
|
+
};
|
|
253
|
+
document.body.style.cursor = "col-resize";
|
|
254
|
+
window.addEventListener("mousemove", mover);
|
|
255
|
+
window.addEventListener("mouseup", parar);
|
|
256
|
+
};
|
|
257
|
+
const reporLargura = (key) => setLarguras((l) => {
|
|
258
|
+
const n = { ...l };
|
|
259
|
+
delete n[key];
|
|
260
|
+
return n;
|
|
261
|
+
});
|
|
262
|
+
const lerSessao = (sufixo) => {
|
|
263
|
+
if (!storageKey) return void 0;
|
|
264
|
+
try {
|
|
265
|
+
const raw = sessionStorage.getItem(`dt_${sufixo}_${storageKey}`);
|
|
266
|
+
return raw === null ? void 0 : JSON.parse(raw);
|
|
267
|
+
} catch {
|
|
268
|
+
return void 0;
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
const [sort, setSort] = useState(() => {
|
|
272
|
+
const guardada = lerSessao("sort");
|
|
273
|
+
if (guardada !== void 0) return guardada && columns.some((c) => c.key === guardada.key) ? guardada : null;
|
|
274
|
+
return defaultSortKey ? { key: defaultSortKey, dir: defaultSortDir === "desc" ? -1 : 1 } : null;
|
|
275
|
+
});
|
|
276
|
+
const [columnFilters, setColumnFilters] = useState(() => {
|
|
277
|
+
if (!storageKey) return {};
|
|
278
|
+
try {
|
|
279
|
+
const raw = sessionStorage.getItem(`dt_filters_${storageKey}`);
|
|
280
|
+
if (!raw) return {};
|
|
281
|
+
return lerFiltrosGuardados(columns, JSON.parse(raw));
|
|
282
|
+
} catch {
|
|
283
|
+
return {};
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
const [rangeFilters, setRangeFilters] = useState(() => {
|
|
287
|
+
if (!storageKey) return {};
|
|
288
|
+
try {
|
|
289
|
+
const raw = sessionStorage.getItem(`dt_ranges_${storageKey}`);
|
|
290
|
+
return raw ? JSON.parse(raw) : {};
|
|
291
|
+
} catch {
|
|
292
|
+
return {};
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
const [groupByInterno, setGroupByInterno] = useState(
|
|
296
|
+
() => (lerSessao("group") ?? defaultGroupBy ?? []).filter((k) => columns.some((c) => c.key === k))
|
|
297
|
+
);
|
|
298
|
+
const grupoControlado = groupBy !== void 0;
|
|
299
|
+
const chaveGrupoExterno = groupBy?.join("\0");
|
|
300
|
+
const chaveColunas = columns.map((c) => c.key).join("\0");
|
|
301
|
+
const groupByKeys = useMemo(
|
|
302
|
+
() => grupoControlado ? groupBy.filter((k) => columns.some((c) => c.key === k)) : groupByInterno,
|
|
303
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
304
|
+
[grupoControlado, chaveGrupoExterno, groupByInterno, chaveColunas]
|
|
305
|
+
);
|
|
306
|
+
const [collapsedGroups, setCollapsedGroups] = useState(/* @__PURE__ */ new Set());
|
|
307
|
+
const selecaoInicial = initialSelectedKeys ? Array.from(initialSelectedKeys, String) : null;
|
|
308
|
+
const [selectedKeys, setSelectedKeys] = useState(() => new Set(selecaoInicial ?? []));
|
|
309
|
+
const [openFilter, setOpenFilter] = useState(null);
|
|
310
|
+
const [filterSearch, setFilterSearch] = useState("");
|
|
311
|
+
const filterRefs = useRef(/* @__PURE__ */ new Map());
|
|
312
|
+
const popupRef = useRef(null);
|
|
313
|
+
const [popupPos, setPopupPos] = useState(null);
|
|
314
|
+
const isGrouped = groupByKeys.length > 0;
|
|
315
|
+
const funilAberto = openFilter ? columns.find((c) => c.key === openFilter || c.extraFilters?.some((f) => f.key === openFilter))?.key ?? openFilter : null;
|
|
316
|
+
useEffect(() => {
|
|
317
|
+
if (!storageKey) return;
|
|
318
|
+
const serializavel = Object.fromEntries(Object.entries(columnFilters).map(([k, v]) => [k, Array.from(v)]));
|
|
319
|
+
try {
|
|
320
|
+
sessionStorage.setItem(`dt_filters_${storageKey}`, JSON.stringify(serializavel));
|
|
321
|
+
sessionStorage.setItem(`dt_ranges_${storageKey}`, JSON.stringify(rangeFilters));
|
|
322
|
+
sessionStorage.setItem(`dt_sort_${storageKey}`, JSON.stringify(sort));
|
|
323
|
+
if (!grupoControlado) sessionStorage.setItem(`dt_group_${storageKey}`, JSON.stringify(groupByKeys));
|
|
324
|
+
} catch {
|
|
325
|
+
}
|
|
326
|
+
}, [columnFilters, rangeFilters, sort, groupByKeys, grupoControlado, storageKey]);
|
|
327
|
+
useLayoutEffect(() => {
|
|
328
|
+
if (!funilAberto) {
|
|
329
|
+
setPopupPos(null);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
const recalcular = () => {
|
|
333
|
+
const el = filterRefs.current.get(funilAberto);
|
|
334
|
+
if (!el) return;
|
|
335
|
+
const r = el.getBoundingClientRect();
|
|
336
|
+
const largura = Math.min(288, window.innerWidth * 0.8);
|
|
337
|
+
const left = Math.max(8, Math.min(r.left, window.innerWidth - largura - 8));
|
|
338
|
+
setPopupPos({ top: r.bottom + 6, left });
|
|
339
|
+
};
|
|
340
|
+
recalcular();
|
|
341
|
+
window.addEventListener("scroll", recalcular, true);
|
|
342
|
+
window.addEventListener("resize", recalcular);
|
|
343
|
+
return () => {
|
|
344
|
+
window.removeEventListener("scroll", recalcular, true);
|
|
345
|
+
window.removeEventListener("resize", recalcular);
|
|
346
|
+
};
|
|
347
|
+
}, [funilAberto]);
|
|
348
|
+
useEffect(() => {
|
|
349
|
+
const onDown = (e) => {
|
|
350
|
+
if (!funilAberto) return;
|
|
351
|
+
const alvo = e.target;
|
|
352
|
+
const botao = filterRefs.current.get(funilAberto);
|
|
353
|
+
if (botao?.contains(alvo) || popupRef.current?.contains(alvo)) return;
|
|
354
|
+
setOpenFilter(null);
|
|
355
|
+
setFilterSearch("");
|
|
356
|
+
};
|
|
357
|
+
document.addEventListener("mousedown", onDown);
|
|
358
|
+
return () => document.removeEventListener("mousedown", onDown);
|
|
359
|
+
}, [funilAberto]);
|
|
360
|
+
const resolverValor = (key) => {
|
|
361
|
+
const col = columns.find((c) => c.key === key);
|
|
362
|
+
if (col) return (row) => rawValue(row, col);
|
|
363
|
+
for (const c of columns) {
|
|
364
|
+
const ef = c.extraFilters?.find((f) => f.key === key);
|
|
365
|
+
if (ef) return ef.value;
|
|
366
|
+
}
|
|
367
|
+
return void 0;
|
|
368
|
+
};
|
|
369
|
+
const rotuloDe = (fn, row) => normalizarRotulo(fn(row));
|
|
370
|
+
const eColunaData = (key) => columns.find((c) => c.key === key)?.sortType === "date";
|
|
371
|
+
const resolverRotulos = (key) => {
|
|
372
|
+
const col = columns.find((c) => c.key === key);
|
|
373
|
+
const normalizar = col?.sortType === "date" ? rotuloDeData : (v) => normalizarRotulo(v);
|
|
374
|
+
if (col?.filterValues) {
|
|
375
|
+
const fv = col.filterValues;
|
|
376
|
+
return (row) => {
|
|
377
|
+
const vs = Array.from(new Set(fv(row).map(normalizar)));
|
|
378
|
+
return vs.length > 0 ? vs : [EMPTY];
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
if (col?.sortType === "date") {
|
|
382
|
+
const ler = col.value ?? ((row) => row[col.key]);
|
|
383
|
+
return (row) => [rotuloDeData(ler(row))];
|
|
384
|
+
}
|
|
385
|
+
const fn = resolverValor(key);
|
|
386
|
+
return fn ? (row) => [rotuloDe(fn, row)] : void 0;
|
|
387
|
+
};
|
|
388
|
+
const rotuloVisivel = (key, v) => eColunaData(key) ? diaVisivel(v) : v;
|
|
389
|
+
const passaFiltro = (key, sel) => {
|
|
390
|
+
const col = columns.find((c) => c.key === key);
|
|
391
|
+
if (col?.filterValues || col?.sortType === "date") {
|
|
392
|
+
const rotulos = resolverRotulos(key);
|
|
393
|
+
return (row) => rotulos(row).some((v) => sel.has(v));
|
|
394
|
+
}
|
|
395
|
+
const fn = resolverValor(key);
|
|
396
|
+
return fn ? (row) => sel.has(rotuloDe(fn, row)) : void 0;
|
|
397
|
+
};
|
|
398
|
+
const modoExcel = filterMode === "excel";
|
|
399
|
+
const activeFilters = useMemo(
|
|
400
|
+
() => Object.entries(columnFilters).filter(([, s]) => s && (modoExcel || s.size > 0)),
|
|
401
|
+
[columnFilters, modoExcel]
|
|
402
|
+
);
|
|
403
|
+
const activeRanges = useMemo(
|
|
404
|
+
() => Object.entries(rangeFilters).filter(([, r]) => r && (r.min != null || r.max != null)),
|
|
405
|
+
[rangeFilters]
|
|
406
|
+
);
|
|
407
|
+
const hasActiveFilters = activeFilters.length > 0 || activeRanges.length > 0;
|
|
408
|
+
const isClientMode = !!allData && (!!alwaysClient || hasActiveFilters || !!sort || isGrouped);
|
|
409
|
+
const effectiveData = isClientMode ? allData : data;
|
|
410
|
+
useEffect(() => {
|
|
411
|
+
if (!allData && (hasActiveFilters || sort || isGrouped)) onDataNeeded?.();
|
|
412
|
+
}, [allData, hasActiveFilters, sort, isGrouped]);
|
|
413
|
+
useEffect(() => {
|
|
414
|
+
onClientModeChange?.(isClientMode);
|
|
415
|
+
}, [isClientMode]);
|
|
416
|
+
useEffect(() => {
|
|
417
|
+
if (clearSelectionTrigger === void 0) return;
|
|
418
|
+
setSelectedKeys(/* @__PURE__ */ new Set());
|
|
419
|
+
}, [clearSelectionTrigger]);
|
|
420
|
+
const chaveSelecaoInicial = selecaoInicial ? JSON.stringify([...selecaoInicial].sort()) : null;
|
|
421
|
+
const selecaoInicialAnterior = useRef(chaveSelecaoInicial);
|
|
422
|
+
useEffect(() => {
|
|
423
|
+
if (chaveSelecaoInicial === selecaoInicialAnterior.current) return;
|
|
424
|
+
selecaoInicialAnterior.current = chaveSelecaoInicial;
|
|
425
|
+
if (chaveSelecaoInicial !== null) setSelectedKeys(new Set(JSON.parse(chaveSelecaoInicial)));
|
|
426
|
+
}, [chaveSelecaoInicial]);
|
|
427
|
+
const mudarFiltrosCol = (proximo) => {
|
|
428
|
+
const next = proximo(columnFilters);
|
|
429
|
+
if (chaveDosFiltros(next) === chaveDosFiltros(columnFilters)) return;
|
|
430
|
+
setColumnFilters(next);
|
|
431
|
+
if (!selectable) return;
|
|
432
|
+
setSelectedKeys(/* @__PURE__ */ new Set());
|
|
433
|
+
onSelectionChange?.(/* @__PURE__ */ new Set());
|
|
434
|
+
};
|
|
435
|
+
const avisarOrdenacao = useRef(onSortChange);
|
|
436
|
+
avisarOrdenacao.current = onSortChange;
|
|
437
|
+
const ordenacaoAvisada = useRef("null");
|
|
438
|
+
useEffect(() => {
|
|
439
|
+
const s = sort ? { key: sort.key, dir: sort.dir === 1 ? "asc" : "desc" } : null;
|
|
440
|
+
const chave = JSON.stringify(s);
|
|
441
|
+
if (chave === ordenacaoAvisada.current) return;
|
|
442
|
+
ordenacaoAvisada.current = chave;
|
|
443
|
+
avisarOrdenacao.current?.(s);
|
|
444
|
+
}, [sort]);
|
|
445
|
+
const avisarFiltros = useRef(onColumnFiltersChange);
|
|
446
|
+
avisarFiltros.current = onColumnFiltersChange;
|
|
447
|
+
const filtrosAvisados = useRef(chaveDosFiltros({}));
|
|
448
|
+
const chaveFiltrosAtivos = chaveDosFiltros(Object.fromEntries(activeFilters));
|
|
449
|
+
useEffect(() => {
|
|
450
|
+
if (chaveFiltrosAtivos === filtrosAvisados.current) return;
|
|
451
|
+
filtrosAvisados.current = chaveFiltrosAtivos;
|
|
452
|
+
avisarFiltros.current?.(Object.fromEntries(JSON.parse(chaveFiltrosAtivos)));
|
|
453
|
+
}, [chaveFiltrosAtivos]);
|
|
454
|
+
const cruzFiltros = modoExcel ? SEM_CRUZAMENTO : activeFilters;
|
|
455
|
+
const cruzRanges = modoExcel ? SEM_CRUZAMENTO : activeRanges;
|
|
456
|
+
const distinctValues = (key) => {
|
|
457
|
+
const rotulosFn = resolverRotulos(key);
|
|
458
|
+
if (!rotulosFn) return [];
|
|
459
|
+
let fonte = allData ?? data;
|
|
460
|
+
for (const [outraKey, escolhidos] of cruzFiltros) {
|
|
461
|
+
if (outraKey === key) continue;
|
|
462
|
+
const passa = passaFiltro(outraKey, escolhidos);
|
|
463
|
+
if (!passa) continue;
|
|
464
|
+
fonte = fonte.filter(passa);
|
|
465
|
+
}
|
|
466
|
+
for (const [outraKey, r] of cruzRanges) {
|
|
467
|
+
if (outraKey === key) continue;
|
|
468
|
+
const col = columns.find((c) => c.key === outraKey);
|
|
469
|
+
if (!col) continue;
|
|
470
|
+
fonte = fonte.filter((row) => {
|
|
471
|
+
const n = valorParaIntervalo(row, col);
|
|
472
|
+
if (!Number.isFinite(n)) return false;
|
|
473
|
+
if (r.min != null && n < r.min) return false;
|
|
474
|
+
if (r.max != null && n > r.max) return false;
|
|
475
|
+
return true;
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
const set = /* @__PURE__ */ new Set();
|
|
479
|
+
fonte.forEach((row) => rotulosFn(row).forEach((v) => set.add(v)));
|
|
480
|
+
return Array.from(set).sort(eColunaData(key) ? ordenarDias : ordenarRotulos);
|
|
481
|
+
};
|
|
482
|
+
const openFilterOptions = useMemo(() => {
|
|
483
|
+
if (!openFilter) return [];
|
|
484
|
+
return distinctValues(openFilter);
|
|
485
|
+
}, [openFilter, data, allData, columns, cruzFiltros, cruzRanges]);
|
|
486
|
+
const openFilterOptionsLower = useMemo(
|
|
487
|
+
() => openFilterOptions.map((v) => (openFilter ? rotuloVisivel(openFilter, v) : v).toLowerCase()),
|
|
488
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
489
|
+
[openFilterOptions]
|
|
490
|
+
);
|
|
491
|
+
const opcoesVisiveis = useMemo(() => {
|
|
492
|
+
const q = filterSearch.toLowerCase();
|
|
493
|
+
const corresponde = q ? modoExcel ? pesquisaCuringa(q) : (v) => v.includes(q) : null;
|
|
494
|
+
const opts = [];
|
|
495
|
+
const correspondentes = [];
|
|
496
|
+
for (let i = 0; i < openFilterOptions.length; i++) {
|
|
497
|
+
if (corresponde && !corresponde(openFilterOptionsLower[i])) continue;
|
|
498
|
+
correspondentes.push(openFilterOptions[i]);
|
|
499
|
+
if (opts.length < MAX_OPCOES_FILTRO) opts.push(openFilterOptions[i]);
|
|
500
|
+
}
|
|
501
|
+
return { opts, total: correspondentes.length, correspondentes };
|
|
502
|
+
}, [openFilterOptions, openFilterOptionsLower, filterSearch, modoExcel]);
|
|
503
|
+
const filtrar = (rows) => {
|
|
504
|
+
if (activeFilters.length === 0 && activeRanges.length === 0) return rows;
|
|
505
|
+
const predicados = activeFilters.flatMap(([key, sel]) => passaFiltro(key, sel) ?? []);
|
|
506
|
+
return rows.filter(
|
|
507
|
+
(row) => predicados.every((passa) => passa(row)) && activeRanges.every(([key, r]) => {
|
|
508
|
+
const col = columns.find((c) => c.key === key);
|
|
509
|
+
if (!col) return true;
|
|
510
|
+
const n = valorParaIntervalo(row, col);
|
|
511
|
+
if (!Number.isFinite(n)) return false;
|
|
512
|
+
if (r.min != null && n < r.min) return false;
|
|
513
|
+
if (r.max != null && n > r.max) return false;
|
|
514
|
+
return true;
|
|
515
|
+
})
|
|
516
|
+
);
|
|
517
|
+
};
|
|
518
|
+
const ordenar = (rows) => {
|
|
519
|
+
if (!sort) return rows;
|
|
520
|
+
const col = columns.find((c) => c.key === sort.key);
|
|
521
|
+
if (!col) return rows;
|
|
522
|
+
return [...rows].sort((a, b) => compare(rawValue(a, col), rawValue(b, col), col.sortType) * sort.dir);
|
|
523
|
+
};
|
|
524
|
+
const filtered = useMemo(
|
|
525
|
+
() => filtrar(effectiveData),
|
|
526
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
527
|
+
[effectiveData, activeFilters, activeRanges, columns]
|
|
528
|
+
);
|
|
529
|
+
const sorted = useMemo(
|
|
530
|
+
() => ordenar(filtered),
|
|
531
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
532
|
+
[filtered, sort, columns]
|
|
533
|
+
);
|
|
534
|
+
const avisarVisiveis = useRef(onVisibleRowsChange);
|
|
535
|
+
avisarVisiveis.current = onVisibleRowsChange;
|
|
536
|
+
useEffect(() => {
|
|
537
|
+
avisarVisiveis.current?.(sorted);
|
|
538
|
+
}, [sorted]);
|
|
539
|
+
const mudarGrupos = (proximo) => {
|
|
540
|
+
if (!grupoControlado) setGroupByInterno(proximo);
|
|
541
|
+
onGroupByChange?.(proximo);
|
|
542
|
+
setCollapsedGroups(/* @__PURE__ */ new Set());
|
|
543
|
+
};
|
|
544
|
+
const alternarGrupo = (key) => {
|
|
545
|
+
if (!allData) onDataNeeded?.();
|
|
546
|
+
mudarGrupos(groupByKeys.includes(key) ? groupByKeys.filter((k) => k !== key) : [...groupByKeys, key]);
|
|
547
|
+
};
|
|
548
|
+
const removerGrupo = (key) => mudarGrupos(groupByKeys.filter((k) => k !== key));
|
|
549
|
+
const limparGrupos = () => mudarGrupos([]);
|
|
550
|
+
const alternarColapso = (path) => setCollapsedGroups((prev) => {
|
|
551
|
+
const n = new Set(prev);
|
|
552
|
+
if (n.has(path)) n.delete(path);
|
|
553
|
+
else n.add(path);
|
|
554
|
+
return n;
|
|
555
|
+
});
|
|
556
|
+
const construirGrupos = (items, keys, nivel, pathPai) => {
|
|
557
|
+
if (nivel >= keys.length) return [];
|
|
558
|
+
const key = keys[nivel];
|
|
559
|
+
const col = columns.find((c) => c.key === key);
|
|
560
|
+
if (!col) return [];
|
|
561
|
+
const ordemFn = col.groupSortKey;
|
|
562
|
+
const mapa = /* @__PURE__ */ new Map();
|
|
563
|
+
items.forEach((item) => {
|
|
564
|
+
const rotulo = filterKey(item, col);
|
|
565
|
+
const ordem = ordemFn ? String(ordemFn(item) ?? "") : rotulo;
|
|
566
|
+
const atual = mapa.get(rotulo);
|
|
567
|
+
if (atual) atual.items.push(item);
|
|
568
|
+
else mapa.set(rotulo, { ordem, items: [item] });
|
|
569
|
+
});
|
|
570
|
+
return Array.from(mapa.entries()).sort(([ra, a], [rb, b]) => ordemFn ? COLLATOR.compare(a.ordem, b.ordem) : ordenarRotulos(ra, rb)).map(([val, { ordem, items: itensGrupo }]) => {
|
|
571
|
+
const path = pathPai ? `${pathPai}\0${val}` : val;
|
|
572
|
+
return { val, ordem, path, items: itensGrupo, filhos: construirGrupos(itensGrupo, keys, nivel + 1, path) };
|
|
573
|
+
});
|
|
574
|
+
};
|
|
575
|
+
const grupos = useMemo(
|
|
576
|
+
() => isGrouped ? construirGrupos(sorted, groupByKeys, 0, "") : [],
|
|
577
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
578
|
+
[sorted, groupByKeys, isGrouped, columns]
|
|
579
|
+
);
|
|
580
|
+
const [page, setPage] = useState(1);
|
|
581
|
+
const chavePageSize = storageKey ? `dt_pagesize_${storageKey}` : null;
|
|
582
|
+
const [pageSizeAtual, setPageSizeAtual] = useState(() => {
|
|
583
|
+
if (!pageSize || !chavePageSize) return pageSize;
|
|
584
|
+
try {
|
|
585
|
+
const guardado = Number(sessionStorage.getItem(chavePageSize));
|
|
586
|
+
return Number.isFinite(guardado) && guardado > 0 ? guardado : pageSize;
|
|
587
|
+
} catch {
|
|
588
|
+
return pageSize;
|
|
589
|
+
}
|
|
590
|
+
});
|
|
591
|
+
const pageSizeProp = useRef(pageSize);
|
|
592
|
+
useEffect(() => {
|
|
593
|
+
if (pageSizeProp.current === pageSize) return;
|
|
594
|
+
pageSizeProp.current = pageSize;
|
|
595
|
+
setPageSizeAtual(pageSize);
|
|
596
|
+
}, [pageSize]);
|
|
597
|
+
const escolherPageSize = (n) => {
|
|
598
|
+
setPageSizeAtual(n);
|
|
599
|
+
if (!chavePageSize) return;
|
|
600
|
+
try {
|
|
601
|
+
sessionStorage.setItem(chavePageSize, String(n));
|
|
602
|
+
} catch {
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
useEffect(() => {
|
|
606
|
+
setPage(1);
|
|
607
|
+
}, [columnFilters, rangeFilters, sort, groupByKeys, pageSizeAtual, isClientMode]);
|
|
608
|
+
const paginando = !!pageSizeAtual && !isGrouped && (!allData || isClientMode);
|
|
609
|
+
const totalPages = paginando ? Math.max(1, Math.ceil(sorted.length / pageSizeAtual)) : 1;
|
|
610
|
+
const currentPage = Math.min(page, totalPages);
|
|
611
|
+
const pageData = paginando ? sorted.slice((currentPage - 1) * pageSizeAtual, currentPage * pageSizeAtual) : sorted;
|
|
612
|
+
const chaveDe = (row, i) => String(rowKey ? rowKey(row, i) : i);
|
|
613
|
+
const indicePorLinha = useMemo(() => {
|
|
614
|
+
const m = /* @__PURE__ */ new Map();
|
|
615
|
+
sorted.forEach((r, i) => m.set(r, i));
|
|
616
|
+
return m;
|
|
617
|
+
}, [sorted]);
|
|
618
|
+
const podeSelecionar = (row) => !isRowSelectable || isRowSelectable(row);
|
|
619
|
+
const visibleKeys = useMemo(
|
|
620
|
+
() => pageData.flatMap((row, i) => podeSelecionar(row) ? [chaveDe(row, i)] : []),
|
|
621
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
622
|
+
[pageData, rowKey, isRowSelectable]
|
|
623
|
+
);
|
|
624
|
+
const alternarLinha = (key) => setSelectedKeys((prev) => {
|
|
625
|
+
const next = new Set(prev);
|
|
626
|
+
if (next.has(key)) next.delete(key);
|
|
627
|
+
else next.add(key);
|
|
628
|
+
onSelectionChange?.(next);
|
|
629
|
+
return next;
|
|
630
|
+
});
|
|
631
|
+
const alternarTodas = () => setSelectedKeys((prev) => {
|
|
632
|
+
const todasMarcadas = visibleKeys.length > 0 && visibleKeys.every((k) => prev.has(k));
|
|
633
|
+
const next = new Set(prev);
|
|
634
|
+
if (todasMarcadas) visibleKeys.forEach((k) => next.delete(k));
|
|
635
|
+
else visibleKeys.forEach((k) => next.add(k));
|
|
636
|
+
onSelectionChange?.(next);
|
|
637
|
+
return next;
|
|
638
|
+
});
|
|
639
|
+
const todasVisiveisMarcadas = visibleKeys.length > 0 && visibleKeys.every((k) => selectedKeys.has(k));
|
|
640
|
+
const algumaVisivelMarcada = visibleKeys.some((k) => selectedKeys.has(k)) && !todasVisiveisMarcadas;
|
|
641
|
+
useEffect(() => {
|
|
642
|
+
if (!viewRef) return;
|
|
643
|
+
viewRef.current = {
|
|
644
|
+
apply: (rows) => ordenar(filtrar(rows)),
|
|
645
|
+
rows: sorted,
|
|
646
|
+
hasFilters: hasActiveFilters,
|
|
647
|
+
precisaDataset: hasActiveFilters || !!sort || isGrouped,
|
|
648
|
+
estado: () => ({
|
|
649
|
+
columnFilters: Object.fromEntries(activeFilters.map(([k, v]) => [k, [...v]])),
|
|
650
|
+
rangeFilters: Object.fromEntries(activeRanges),
|
|
651
|
+
sortKey: sort?.key ?? null,
|
|
652
|
+
sortDir: sort ? sort.dir === 1 ? "asc" : "desc" : "asc",
|
|
653
|
+
groupBy: groupByKeys
|
|
654
|
+
}),
|
|
655
|
+
repor: (e) => {
|
|
656
|
+
setColumnFilters(lerFiltrosGuardados(columns, e?.columnFilters ?? {}));
|
|
657
|
+
setRangeFilters(e?.rangeFilters ?? {});
|
|
658
|
+
setSort(e?.sortKey ? { key: e.sortKey, dir: e.sortDir === "desc" ? -1 : 1 } : null);
|
|
659
|
+
mudarGrupos(e?.groupBy ?? []);
|
|
660
|
+
const precisaTudo = !!e?.sortKey || !!e?.groupBy?.length || Object.keys(e?.columnFilters ?? {}).length > 0 || Object.keys(e?.rangeFilters ?? {}).length > 0;
|
|
661
|
+
if (precisaTudo && !allData) onDataNeeded?.();
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
});
|
|
665
|
+
const toggleSort = (key) => {
|
|
666
|
+
if (!allData) onDataNeeded?.();
|
|
667
|
+
setSort((s) => s?.key === key ? s.dir === 1 ? { key, dir: -1 } : null : { key, dir: 1 });
|
|
668
|
+
};
|
|
669
|
+
const selecaoDaColuna = (key) => new Set(columnFilters[key] ?? (modoExcel ? openFilterOptions : []));
|
|
670
|
+
const aplicarSelecao = (key, sel) => mudarFiltrosCol((prev) => {
|
|
671
|
+
const proximo = { ...prev };
|
|
672
|
+
if (modoExcel && sel.size === openFilterOptions.length) delete proximo[key];
|
|
673
|
+
else proximo[key] = sel;
|
|
674
|
+
return proximo;
|
|
675
|
+
});
|
|
676
|
+
const toggleFilterValue = (key, val) => {
|
|
677
|
+
if (!allData) onDataNeeded?.();
|
|
678
|
+
const sel = selecaoDaColuna(key);
|
|
679
|
+
if (sel.has(val)) sel.delete(val);
|
|
680
|
+
else sel.add(val);
|
|
681
|
+
aplicarSelecao(key, sel);
|
|
682
|
+
};
|
|
683
|
+
const alternarTodos = (key, marcar) => {
|
|
684
|
+
if (!allData) onDataNeeded?.();
|
|
685
|
+
const sel = selecaoDaColuna(key);
|
|
686
|
+
for (const v of opcoesVisiveis.correspondentes) {
|
|
687
|
+
if (marcar) sel.add(v);
|
|
688
|
+
else sel.delete(v);
|
|
689
|
+
}
|
|
690
|
+
aplicarSelecao(key, sel);
|
|
691
|
+
};
|
|
692
|
+
const setRange = (key, campo, valor, tipo) => {
|
|
693
|
+
if (!allData) onDataNeeded?.();
|
|
694
|
+
setRangeFilters((prev) => {
|
|
695
|
+
const atual = { ...prev[key] ?? {} };
|
|
696
|
+
const n = tipo === "date" ? timestampDeData(valor) + (campo === "max" ? 86399999 : 0) : Number(valor);
|
|
697
|
+
if (valor === "" || !Number.isFinite(n)) delete atual[campo];
|
|
698
|
+
else atual[campo] = n;
|
|
699
|
+
const next = { ...prev };
|
|
700
|
+
if (atual.min == null && atual.max == null) delete next[key];
|
|
701
|
+
else next[key] = atual;
|
|
702
|
+
return next;
|
|
703
|
+
});
|
|
704
|
+
};
|
|
705
|
+
const clearColumnFilter = (key) => {
|
|
706
|
+
mudarFiltrosCol((prev) => {
|
|
707
|
+
const n = { ...prev };
|
|
708
|
+
delete n[key];
|
|
709
|
+
return n;
|
|
710
|
+
});
|
|
711
|
+
setRangeFilters((prev) => {
|
|
712
|
+
const n = { ...prev };
|
|
713
|
+
delete n[key];
|
|
714
|
+
return n;
|
|
715
|
+
});
|
|
716
|
+
};
|
|
717
|
+
const clearAllFilters = () => {
|
|
718
|
+
mudarFiltrosCol(() => ({}));
|
|
719
|
+
setRangeFilters({});
|
|
720
|
+
};
|
|
721
|
+
const temIntervalo = (key) => {
|
|
722
|
+
const r = rangeFilters[key];
|
|
723
|
+
return !!r && (r.min != null || r.max != null);
|
|
724
|
+
};
|
|
725
|
+
const temFiltro = (key) => (modoExcel ? columnFilters[key] !== void 0 : (columnFilters[key]?.size ?? 0) > 0) || temIntervalo(key);
|
|
726
|
+
const handleExport = () => {
|
|
727
|
+
if (onExport) return onExport(sorted);
|
|
728
|
+
const csv = toCsv(columns, sorted);
|
|
729
|
+
const blob = new Blob([`\uFEFF${csv}`], { type: "text/csv;charset=utf-8;" });
|
|
730
|
+
const url = URL.createObjectURL(blob);
|
|
731
|
+
const a = document.createElement("a");
|
|
732
|
+
a.href = url;
|
|
733
|
+
a.download = `${exportFileName}.csv`;
|
|
734
|
+
a.click();
|
|
735
|
+
URL.revokeObjectURL(url);
|
|
736
|
+
};
|
|
737
|
+
const alignClass = (a) => a === "right" ? "text-right" : a === "center" ? "text-center" : "text-left";
|
|
738
|
+
const ePresaAEsquerda = (c) => c.sticky === true || c.sticky === "left";
|
|
739
|
+
const stickyLeft = useMemo(() => {
|
|
740
|
+
const offsets = {};
|
|
741
|
+
let acc = selectable ? 40 : 0;
|
|
742
|
+
for (const c of columns) {
|
|
743
|
+
if (!ePresaAEsquerda(c)) continue;
|
|
744
|
+
offsets[c.key] = acc;
|
|
745
|
+
acc += c.width ?? DEFAULT_STICKY_WIDTH;
|
|
746
|
+
}
|
|
747
|
+
return offsets;
|
|
748
|
+
}, [columns, selectable]);
|
|
749
|
+
const stickyRight = useMemo(() => {
|
|
750
|
+
const offsets = {};
|
|
751
|
+
let acc = 0;
|
|
752
|
+
for (let i = columns.length - 1; i >= 0; i--) {
|
|
753
|
+
const c = columns[i];
|
|
754
|
+
if (c.sticky !== "right") continue;
|
|
755
|
+
offsets[c.key] = acc;
|
|
756
|
+
acc += c.width ?? DEFAULT_STICKY_WIDTH;
|
|
757
|
+
}
|
|
758
|
+
return offsets;
|
|
759
|
+
}, [columns]);
|
|
760
|
+
const estiloPreso = (c) => {
|
|
761
|
+
if (ePresaAEsquerda(c)) return { left: stickyLeft[c.key] };
|
|
762
|
+
if (c.sticky === "right") return { right: stickyRight[c.key] };
|
|
763
|
+
return void 0;
|
|
764
|
+
};
|
|
765
|
+
const nColunas = columns.length + (selectable ? 1 : 0);
|
|
766
|
+
const totalResultados = totalCount != null && !isClientMode && !hasActiveFilters ? totalCount : sorted.length;
|
|
767
|
+
const aEsperarDataset = !allData && (!!isAllDataLoading || !!onDataNeeded) && (hasActiveFilters || !!sort || isGrouped);
|
|
768
|
+
const linhasBase = allData ?? data;
|
|
769
|
+
const semDados = useMemo(
|
|
770
|
+
() => new Set(columns.filter((c) => !linhasBase.some((r) => temValor(r, c))).map((c) => c.key)),
|
|
771
|
+
[columns, linhasBase]
|
|
772
|
+
);
|
|
773
|
+
const filtravel = (c) => c.filterable ?? !semDados.has(c.key);
|
|
774
|
+
const agrupavel = (c) => c.groupable ?? (!semDados.has(c.key) && !c.groupAggregate && (!c.sortType || c.sortType === "text"));
|
|
775
|
+
const rolarComTeclado = (e) => {
|
|
776
|
+
if (e.target !== e.currentTarget) return;
|
|
777
|
+
const el = e.currentTarget;
|
|
778
|
+
const passo = Math.max(40, Math.round(el.clientWidth * 0.2));
|
|
779
|
+
if (e.key === "ArrowRight") el.scrollLeft += passo;
|
|
780
|
+
else if (e.key === "ArrowLeft") el.scrollLeft -= passo;
|
|
781
|
+
else if (e.key === "Home") el.scrollLeft = 0;
|
|
782
|
+
else if (e.key === "End") el.scrollLeft = el.scrollWidth;
|
|
783
|
+
else return;
|
|
784
|
+
e.preventDefault();
|
|
785
|
+
};
|
|
786
|
+
if (isError) {
|
|
787
|
+
return /* @__PURE__ */ jsx("div", { className: "py-16 text-center text-sm font-bold uppercase tracking-widest text-red-400", children: L.error });
|
|
788
|
+
}
|
|
789
|
+
const renderPopup = (coluna, key, listas) => {
|
|
790
|
+
const col = key === coluna.key ? coluna : void 0;
|
|
791
|
+
const { opts, total: totalOpcoes } = opcoesVisiveis;
|
|
792
|
+
const sel = columnFilters[key];
|
|
793
|
+
const isFiltered = temFiltro(key);
|
|
794
|
+
const podeOrdenar = !!sortFromFilter && !!col && col.sortable !== false;
|
|
795
|
+
const eData = col?.sortType === "date";
|
|
796
|
+
const temRange = !!col && (col.sortType === "number" || eData);
|
|
797
|
+
const [rotuloAsc, rotuloDesc] = eData ? [L.sortOldest, L.sortNewest] : col?.sortType === "number" ? [L.sortSmallest, L.sortLargest] : [L.sortAsc, L.sortDesc];
|
|
798
|
+
const [rotuloMin, rotuloMax] = eData ? [L.from, L.to] : [L.min, L.max];
|
|
799
|
+
const intervalo = rangeFilters[key];
|
|
800
|
+
const valorCampo = (n, campo) => n == null ? "" : eData ? new Date(campo === "max" ? n - 86399999 : n).toISOString().slice(0, 10) : String(n);
|
|
801
|
+
return createPortal(
|
|
802
|
+
/* @__PURE__ */ jsxs(
|
|
803
|
+
"div",
|
|
804
|
+
{
|
|
805
|
+
ref: popupRef,
|
|
806
|
+
style: { position: "fixed", top: popupPos.top, left: popupPos.left },
|
|
807
|
+
className: "z-[100] w-72 max-w-[80vw] bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-700 shadow-2xl rounded-xl overflow-hidden",
|
|
808
|
+
children: [
|
|
809
|
+
listas.length > 1 && // Seletor da lista a filtrar: a coluna e cada filtro extra partilham o mesmo funil.
|
|
810
|
+
/* @__PURE__ */ jsx("div", { className: "px-2 pt-2 pb-2 border-b border-slate-100 dark:border-slate-800", children: /* @__PURE__ */ jsx("div", { role: "group", "aria-label": coluna.label, className: "flex flex-wrap gap-0.5 p-0.5 rounded-lg bg-slate-100 dark:bg-slate-800", children: listas.map((l) => {
|
|
811
|
+
const ativa = l.key === key;
|
|
812
|
+
return /* @__PURE__ */ jsxs(
|
|
813
|
+
"button",
|
|
814
|
+
{
|
|
815
|
+
type: "button",
|
|
816
|
+
"aria-pressed": ativa,
|
|
817
|
+
onClick: () => {
|
|
818
|
+
if (ativa) return;
|
|
819
|
+
setOpenFilter(l.key);
|
|
820
|
+
setFilterSearch("");
|
|
821
|
+
},
|
|
822
|
+
className: `appearance-none border-0 cursor-pointer flex-1 min-w-0 inline-flex items-center justify-center gap-1 px-2 py-1 rounded-md text-[10px] font-black uppercase tracking-wider truncate transition-colors ${ativa ? "bg-white dark:bg-slate-900 text-proef-blue dark:text-proef-turquoise shadow-sm" : "bg-transparent text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200"}`,
|
|
823
|
+
children: [
|
|
824
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: l.label }),
|
|
825
|
+
temFiltro(l.key) && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "w-1.5 h-1.5 rounded-full bg-proef-turquoise shrink-0" })
|
|
826
|
+
]
|
|
827
|
+
},
|
|
828
|
+
l.key
|
|
829
|
+
);
|
|
830
|
+
}) }) }),
|
|
831
|
+
!allData && isAllDataLoading && // As opções à vista ainda são só as de `data`. Dizê-lo é melhor do que deixar
|
|
832
|
+
// escolher de uma lista incompleta.
|
|
833
|
+
/* @__PURE__ */ jsx("div", { className: "px-2 py-1.5 bg-amber-50 dark:bg-amber-500/10 border-b border-amber-100 dark:border-amber-500/20 text-[10px] text-amber-700 dark:text-amber-300", children: L.loadingOptions }),
|
|
834
|
+
podeOrdenar && /* @__PURE__ */ jsxs("div", { className: "border-b border-slate-100 dark:border-slate-800 p-1.5 space-y-0.5", children: [
|
|
835
|
+
/* @__PURE__ */ jsxs(
|
|
836
|
+
"button",
|
|
837
|
+
{
|
|
838
|
+
onClick: () => {
|
|
839
|
+
if (!allData) onDataNeeded?.();
|
|
840
|
+
setSort({ key, dir: 1 });
|
|
841
|
+
},
|
|
842
|
+
className: `appearance-none bg-transparent border-0 cursor-pointer w-full flex items-center gap-2 px-2.5 py-1.5 text-[11px] font-semibold text-left hover:bg-slate-50 dark:hover:bg-slate-800 ${sort?.key === key && sort.dir === 1 ? "text-proef-blue dark:text-proef-turquoise bg-slate-50 dark:bg-slate-800" : "text-slate-600 dark:text-slate-300"}`,
|
|
843
|
+
children: [
|
|
844
|
+
"▲ ",
|
|
845
|
+
rotuloAsc
|
|
846
|
+
]
|
|
847
|
+
}
|
|
848
|
+
),
|
|
849
|
+
/* @__PURE__ */ jsxs(
|
|
850
|
+
"button",
|
|
851
|
+
{
|
|
852
|
+
onClick: () => {
|
|
853
|
+
if (!allData) onDataNeeded?.();
|
|
854
|
+
setSort({ key, dir: -1 });
|
|
855
|
+
},
|
|
856
|
+
className: `appearance-none bg-transparent border-0 cursor-pointer w-full flex items-center gap-2 px-2.5 py-1.5 text-[11px] font-semibold text-left hover:bg-slate-50 dark:hover:bg-slate-800 ${sort?.key === key && sort.dir === -1 ? "text-proef-blue dark:text-proef-turquoise bg-slate-50 dark:bg-slate-800" : "text-slate-600 dark:text-slate-300"}`,
|
|
857
|
+
children: [
|
|
858
|
+
"▼ ",
|
|
859
|
+
rotuloDesc
|
|
860
|
+
]
|
|
861
|
+
}
|
|
862
|
+
)
|
|
863
|
+
] }),
|
|
864
|
+
/* @__PURE__ */ jsxs("div", { className: "p-2", children: [
|
|
865
|
+
temRange && // Intervalo antes da lista: numa coluna numérica ou de datas é o que se procura
|
|
866
|
+
// ("acima de 30 dias", "a partir de julho"), não um valor exato numa lista de dezenas.
|
|
867
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 mb-2", children: [
|
|
868
|
+
/* @__PURE__ */ jsx(
|
|
869
|
+
"input",
|
|
870
|
+
{
|
|
871
|
+
type: eData ? "date" : "number",
|
|
872
|
+
defaultValue: valorCampo(intervalo?.min, "min"),
|
|
873
|
+
onChange: (e) => setRange(key, "min", e.target.value, col.sortType),
|
|
874
|
+
placeholder: rotuloMin,
|
|
875
|
+
title: rotuloMin,
|
|
876
|
+
"aria-label": rotuloMin,
|
|
877
|
+
className: "w-1/2 bg-slate-50 dark:bg-slate-800 dark:text-slate-100 dark:[color-scheme:dark] border border-slate-200 dark:border-slate-700 rounded-lg px-2 py-1.5 text-xs outline-none focus:border-proef-blue dark:focus:border-proef-turquoise"
|
|
878
|
+
},
|
|
879
|
+
`${key}-min`
|
|
880
|
+
),
|
|
881
|
+
/* @__PURE__ */ jsx(
|
|
882
|
+
"input",
|
|
883
|
+
{
|
|
884
|
+
type: eData ? "date" : "number",
|
|
885
|
+
defaultValue: valorCampo(intervalo?.max, "max"),
|
|
886
|
+
onChange: (e) => setRange(key, "max", e.target.value, col.sortType),
|
|
887
|
+
placeholder: rotuloMax,
|
|
888
|
+
title: rotuloMax,
|
|
889
|
+
"aria-label": rotuloMax,
|
|
890
|
+
className: "w-1/2 bg-slate-50 dark:bg-slate-800 dark:text-slate-100 dark:[color-scheme:dark] border border-slate-200 dark:border-slate-700 rounded-lg px-2 py-1.5 text-xs outline-none focus:border-proef-blue dark:focus:border-proef-turquoise"
|
|
891
|
+
},
|
|
892
|
+
`${key}-max`
|
|
893
|
+
)
|
|
894
|
+
] }),
|
|
895
|
+
/* @__PURE__ */ jsx(
|
|
896
|
+
"input",
|
|
897
|
+
{
|
|
898
|
+
autoFocus: true,
|
|
899
|
+
value: filterSearch,
|
|
900
|
+
onChange: (e) => setFilterSearch(e.target.value),
|
|
901
|
+
placeholder: L.search,
|
|
902
|
+
className: "w-full bg-slate-50 dark:bg-slate-800 dark:text-slate-100 border border-slate-200 dark:border-slate-700 rounded-lg px-2 py-1.5 text-xs outline-none focus:border-proef-blue dark:focus:border-proef-turquoise mb-2"
|
|
903
|
+
}
|
|
904
|
+
),
|
|
905
|
+
/* @__PURE__ */ jsxs("div", { className: "max-h-64 overflow-y-auto overflow-x-hidden space-y-0.5", children: [
|
|
906
|
+
modoExcel && opts.length > 0 && (() => {
|
|
907
|
+
const marcados = opcoesVisiveis.correspondentes.filter((v) => sel ? sel.has(v) : true).length;
|
|
908
|
+
const todos = marcados === opcoesVisiveis.correspondentes.length;
|
|
909
|
+
const alguns = marcados > 0 && !todos;
|
|
910
|
+
return /* @__PURE__ */ jsxs(
|
|
911
|
+
"button",
|
|
912
|
+
{
|
|
913
|
+
onClick: () => alternarTodos(key, !todos),
|
|
914
|
+
className: "appearance-none bg-transparent border-0 border-b border-slate-100 dark:border-slate-800 cursor-pointer w-full flex items-center gap-2 px-1.5 py-1 mb-0.5 hover:bg-slate-50 dark:hover:bg-slate-800 text-left normal-case tracking-normal",
|
|
915
|
+
children: [
|
|
916
|
+
/* @__PURE__ */ jsxs(
|
|
917
|
+
"span",
|
|
918
|
+
{
|
|
919
|
+
className: `w-3.5 h-3.5 flex items-center justify-center border shrink-0 rounded ${todos || alguns ? "bg-proef-navy dark:bg-proef-turquoise border-proef-navy dark:border-proef-turquoise text-white dark:text-proef-navy" : "border-slate-300 dark:border-slate-600"}`,
|
|
920
|
+
children: [
|
|
921
|
+
todos && /* @__PURE__ */ jsx("span", { className: "text-[9px] leading-none", children: "✓" }),
|
|
922
|
+
alguns && /* @__PURE__ */ jsx("span", { className: "text-[9px] leading-none", children: "–" })
|
|
923
|
+
]
|
|
924
|
+
}
|
|
925
|
+
),
|
|
926
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-slate-700 dark:text-slate-200 font-semibold break-words", children: filterSearch ? L.selectAllResults : L.selectAll })
|
|
927
|
+
]
|
|
928
|
+
}
|
|
929
|
+
);
|
|
930
|
+
})(),
|
|
931
|
+
opts.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-[11px] text-slate-400 text-center py-3", children: L.noOptions }) : opts.map((v) => {
|
|
932
|
+
const checked = sel ? sel.has(v) : modoExcel;
|
|
933
|
+
return /* @__PURE__ */ jsxs(
|
|
934
|
+
"button",
|
|
935
|
+
{
|
|
936
|
+
onClick: () => toggleFilterValue(key, v),
|
|
937
|
+
className: "appearance-none bg-transparent border-0 cursor-pointer w-full flex items-center gap-2 px-1.5 py-1 hover:bg-slate-50 dark:hover:bg-slate-800 text-left normal-case tracking-normal",
|
|
938
|
+
children: [
|
|
939
|
+
/* @__PURE__ */ jsx(
|
|
940
|
+
"span",
|
|
941
|
+
{
|
|
942
|
+
className: `w-3.5 h-3.5 flex items-center justify-center border shrink-0 rounded ${checked ? "bg-proef-navy dark:bg-proef-turquoise border-proef-navy dark:border-proef-turquoise text-white dark:text-proef-navy" : "border-slate-300 dark:border-slate-600"}`,
|
|
943
|
+
children: checked && /* @__PURE__ */ jsx("span", { className: "text-[9px] leading-none", children: "✓" })
|
|
944
|
+
}
|
|
945
|
+
),
|
|
946
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-slate-700 dark:text-slate-200 font-normal break-words", children: rotuloVisivel(key, v) })
|
|
947
|
+
]
|
|
948
|
+
},
|
|
949
|
+
v
|
|
950
|
+
);
|
|
951
|
+
})
|
|
952
|
+
] }),
|
|
953
|
+
totalOpcoes > opts.length && /* @__PURE__ */ jsx("p", { className: "text-[10.5px] text-slate-400 text-center pt-2", children: L.moreOptions.replace("{shown}", String(opts.length)).replace("{total}", String(totalOpcoes)) }),
|
|
954
|
+
isFiltered && /* @__PURE__ */ jsx(
|
|
955
|
+
"button",
|
|
956
|
+
{
|
|
957
|
+
onClick: () => clearColumnFilter(key),
|
|
958
|
+
className: "appearance-none bg-transparent border-0 border-t border-slate-100 dark:border-slate-800 cursor-pointer w-full mt-2 pt-2 text-[10px] font-black uppercase tracking-wider text-red-400 hover:text-red-500",
|
|
959
|
+
children: L.clear
|
|
960
|
+
}
|
|
961
|
+
)
|
|
962
|
+
] })
|
|
963
|
+
]
|
|
964
|
+
}
|
|
965
|
+
),
|
|
966
|
+
document.body
|
|
967
|
+
);
|
|
968
|
+
};
|
|
969
|
+
const botaoFunil = (c) => {
|
|
970
|
+
const listas = [...filtravel(c) ? [{ key: c.key, label: c.label }] : [], ...(c.extraFilters ?? []).map((f) => ({ key: f.key, label: f.label }))];
|
|
971
|
+
if (listas.length === 0) return null;
|
|
972
|
+
const isOpen = funilAberto === c.key;
|
|
973
|
+
const isFiltered = listas.some((l) => temFiltro(l.key));
|
|
974
|
+
return /* @__PURE__ */ jsxs(
|
|
975
|
+
"div",
|
|
976
|
+
{
|
|
977
|
+
className: "relative",
|
|
978
|
+
ref: (el) => {
|
|
979
|
+
if (el) filterRefs.current.set(c.key, el);
|
|
980
|
+
else filterRefs.current.delete(c.key);
|
|
981
|
+
},
|
|
982
|
+
children: [
|
|
983
|
+
/* @__PURE__ */ jsx(
|
|
984
|
+
"button",
|
|
985
|
+
{
|
|
986
|
+
onClick: () => {
|
|
987
|
+
if (!isOpen && !allData) onDataNeeded?.();
|
|
988
|
+
setOpenFilter(isOpen ? null : listas[0].key);
|
|
989
|
+
setFilterSearch("");
|
|
990
|
+
},
|
|
991
|
+
className: `appearance-none border-0 bg-transparent cursor-pointer p-0.5 transition-colors ${isFiltered || isOpen ? "text-proef-turquoise" : "text-slate-300 dark:text-slate-600 hover:text-slate-500 dark:hover:text-slate-300"}`,
|
|
992
|
+
title: c.label,
|
|
993
|
+
"aria-label": c.label,
|
|
994
|
+
"aria-expanded": isOpen,
|
|
995
|
+
children: /* @__PURE__ */ jsx(Funnel, { size: 11, className: isFiltered ? "fill-current" : "" })
|
|
996
|
+
}
|
|
997
|
+
),
|
|
998
|
+
isOpen && popupPos && openFilter && renderPopup(c, openFilter, listas)
|
|
999
|
+
]
|
|
1000
|
+
},
|
|
1001
|
+
c.key
|
|
1002
|
+
);
|
|
1003
|
+
};
|
|
1004
|
+
const renderLinha = (row, i) => {
|
|
1005
|
+
const k = chaveDe(row, i);
|
|
1006
|
+
const marcada = selectable && selectedKeys.has(k);
|
|
1007
|
+
const selecionavel = !!selectable && podeSelecionar(row);
|
|
1008
|
+
return /* @__PURE__ */ jsxs(
|
|
1009
|
+
"tr",
|
|
1010
|
+
{
|
|
1011
|
+
onClick: () => onRowClick?.(row),
|
|
1012
|
+
onDoubleClick: () => onRowDoubleClick?.(row),
|
|
1013
|
+
className: `group even:bg-slate-50/50 dark:even:bg-slate-800/40 hover:bg-slate-100/70 dark:hover:bg-slate-800/70 transition-colors ${onRowClick || onRowDoubleClick ? "cursor-pointer" : ""} ${marcada ? "bg-proef-turquoise/5" : ""} ${rowClassName?.(row) ?? ""}`,
|
|
1014
|
+
children: [
|
|
1015
|
+
selectable && /* @__PURE__ */ jsx(
|
|
1016
|
+
"td",
|
|
1017
|
+
{
|
|
1018
|
+
className: `px-3 py-2.5 border-b border-slate-100 dark:border-slate-800 w-10 sticky left-0 z-[1] ${i % 2 === 1 ? "bg-slate-50 dark:bg-slate-800" : "bg-white dark:bg-slate-900"} group-hover:bg-slate-100 dark:group-hover:bg-slate-800`,
|
|
1019
|
+
onClick: (e) => {
|
|
1020
|
+
e.stopPropagation();
|
|
1021
|
+
if (selecionavel) alternarLinha(k);
|
|
1022
|
+
},
|
|
1023
|
+
children: /* @__PURE__ */ jsx(
|
|
1024
|
+
"span",
|
|
1025
|
+
{
|
|
1026
|
+
role: "checkbox",
|
|
1027
|
+
"aria-checked": !!marcada,
|
|
1028
|
+
"aria-disabled": !selecionavel || void 0,
|
|
1029
|
+
className: `w-4 h-4 flex items-center justify-center border transition-colors rounded ${marcada ? "bg-proef-navy dark:bg-proef-turquoise border-proef-navy dark:border-proef-turquoise text-white dark:text-proef-navy" : "border-slate-300 dark:border-slate-600 hover:border-slate-400 dark:hover:border-slate-500"} ${selecionavel ? "" : "opacity-40 cursor-not-allowed bg-slate-100 dark:bg-slate-800"}`,
|
|
1030
|
+
children: marcada && /* @__PURE__ */ jsx("span", { className: "text-[9px] leading-none", children: "✓" })
|
|
1031
|
+
}
|
|
1032
|
+
)
|
|
1033
|
+
}
|
|
1034
|
+
),
|
|
1035
|
+
columns.map((c) => /* @__PURE__ */ jsx(
|
|
1036
|
+
"td",
|
|
1037
|
+
{
|
|
1038
|
+
style: estiloPreso(c),
|
|
1039
|
+
className: `px-3 py-2.5 border-b border-slate-100 dark:border-slate-800 whitespace-nowrap ${alignClass(c.align)} ${c.sticky ? `sticky z-[1] ${c.sticky === "right" ? "border-l border-slate-200 dark:border-slate-700" : ""} ${i % 2 === 1 ? "bg-slate-50 dark:bg-slate-800" : "bg-white dark:bg-slate-900"} group-hover:bg-slate-100 dark:group-hover:bg-slate-800` : ""} ${c.cellClassName ?? ""}`,
|
|
1040
|
+
children: (() => {
|
|
1041
|
+
const conteudo = c.render ? c.render(row) : rawValue(row, c) ?? /* @__PURE__ */ jsx("span", { className: "text-slate-400", children: EMPTY });
|
|
1042
|
+
const max = larguraMax(c);
|
|
1043
|
+
if (!max) return conteudo;
|
|
1044
|
+
const v = rawValue(row, c);
|
|
1045
|
+
const dica = typeof conteudo === "string" || typeof conteudo === "number" ? String(conteudo) : c.sortType !== "date" && v !== null && v !== void 0 ? String(v) : void 0;
|
|
1046
|
+
return /* @__PURE__ */ jsx("div", { className: "overflow-hidden text-ellipsis", style: { maxWidth: max, width: larguras[c.key] }, title: dica, children: conteudo });
|
|
1047
|
+
})()
|
|
1048
|
+
},
|
|
1049
|
+
c.key
|
|
1050
|
+
))
|
|
1051
|
+
]
|
|
1052
|
+
},
|
|
1053
|
+
k
|
|
1054
|
+
);
|
|
1055
|
+
};
|
|
1056
|
+
const primeiraComValor = columns.findIndex((c) => !!c.groupAggregate);
|
|
1057
|
+
const colunasComValor = primeiraComValor >= 0 ? columns.slice(primeiraComValor) : [];
|
|
1058
|
+
const colunasRotuloGrupo = primeiraComValor >= 0 ? primeiraComValor + (selectable ? 1 : 0) : nColunas;
|
|
1059
|
+
const renderGrupos = (nos, nivel) => nos.map((no) => {
|
|
1060
|
+
const recolhido = collapsedGroups.has(no.path);
|
|
1061
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1062
|
+
/* @__PURE__ */ jsxs("tr", { className: "bg-slate-50/80 dark:bg-slate-800/60 cursor-pointer select-none", onClick: () => alternarColapso(no.path), children: [
|
|
1063
|
+
/* @__PURE__ */ jsx("td", { colSpan: colunasRotuloGrupo, className: "px-3 py-1.5 border-b border-t border-slate-100 dark:border-slate-800", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", style: { paddingLeft: nivel * 16 }, children: [
|
|
1064
|
+
/* @__PURE__ */ jsx(
|
|
1065
|
+
Caret,
|
|
1066
|
+
{
|
|
1067
|
+
size: 11,
|
|
1068
|
+
className: `text-proef-blue/60 dark:text-proef-turquoise/70 transition-transform shrink-0 ${recolhido ? "" : "rotate-90"}`
|
|
1069
|
+
}
|
|
1070
|
+
),
|
|
1071
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] font-black uppercase tracking-[0.15em] text-proef-blue/70 dark:text-proef-turquoise/80", children: no.val }),
|
|
1072
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[10px] text-slate-400 ml-1", children: [
|
|
1073
|
+
"(",
|
|
1074
|
+
no.items.length,
|
|
1075
|
+
")"
|
|
1076
|
+
] })
|
|
1077
|
+
] }) }),
|
|
1078
|
+
colunasComValor.map((c) => /* @__PURE__ */ jsx("td", { className: `px-3 py-1.5 border-b border-t border-slate-100 dark:border-slate-800 whitespace-nowrap text-xs font-bold text-slate-700 dark:text-slate-200 ${alignClass(c.align)}`, children: c.groupAggregate?.(no.items) }, c.key))
|
|
1079
|
+
] }),
|
|
1080
|
+
!recolhido && (no.filhos.length > 0 ? renderGrupos(no.filhos, nivel + 1) : no.items.map((row) => renderLinha(row, indicePorLinha.get(row) ?? 0)))
|
|
1081
|
+
] }, no.path);
|
|
1082
|
+
});
|
|
1083
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
1084
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2 mb-2.5", children: [
|
|
1085
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400", children: isLoading ? "" : L.results.replace("{count}", String(totalResultados)) }),
|
|
1086
|
+
/* @__PURE__ */ jsxs("div", { className: "ml-auto flex flex-wrap items-center justify-end gap-2", children: [
|
|
1087
|
+
extraToolbar,
|
|
1088
|
+
exportFileName && sorted.length > 0 && /* @__PURE__ */ jsxs(
|
|
1089
|
+
"button",
|
|
1090
|
+
{
|
|
1091
|
+
onClick: handleExport,
|
|
1092
|
+
className: "appearance-none cursor-pointer inline-flex items-center gap-1.5 h-8 px-3.5 rounded-lg border border-proef-navy dark:border-proef-turquoise bg-proef-navy dark:bg-proef-turquoise text-white dark:text-proef-navy hover:bg-proef-blue dark:hover:bg-proef-turquoise/80 text-[11px] font-black uppercase tracking-widest transition-colors",
|
|
1093
|
+
children: [
|
|
1094
|
+
"⭳ ",
|
|
1095
|
+
L.export
|
|
1096
|
+
]
|
|
1097
|
+
}
|
|
1098
|
+
)
|
|
1099
|
+
] })
|
|
1100
|
+
] }),
|
|
1101
|
+
isGrouped && /* @__PURE__ */ jsx(
|
|
1102
|
+
FilterChips,
|
|
1103
|
+
{
|
|
1104
|
+
className: "mb-2",
|
|
1105
|
+
items: groupByKeys.map((key) => ({
|
|
1106
|
+
key,
|
|
1107
|
+
tone: "group",
|
|
1108
|
+
icon: /* @__PURE__ */ jsx(Layers, { size: 9 }),
|
|
1109
|
+
label: columns.find((c) => c.key === key)?.label ?? key,
|
|
1110
|
+
onRemove: () => removerGrupo(key)
|
|
1111
|
+
})),
|
|
1112
|
+
onClearAll: limparGrupos,
|
|
1113
|
+
clearAllLabel: L.clearGroups
|
|
1114
|
+
}
|
|
1115
|
+
),
|
|
1116
|
+
(activeFilters.length > 0 || activeRanges.length > 0) && /* @__PURE__ */ jsx(
|
|
1117
|
+
FilterChips,
|
|
1118
|
+
{
|
|
1119
|
+
className: "mb-2",
|
|
1120
|
+
items: [
|
|
1121
|
+
...activeRanges.map(([key, r]) => {
|
|
1122
|
+
const col = columns.find((c) => c.key === key);
|
|
1123
|
+
const fmt = (v) => v == null ? "" : col?.sortType === "date" ? new Date(v).toLocaleDateString() : String(v);
|
|
1124
|
+
const txt = r.min != null && r.max != null ? `${fmt(r.min)} – ${fmt(r.max)}` : r.min != null ? `≥ ${fmt(r.min)}` : `≤ ${fmt(r.max)}`;
|
|
1125
|
+
return { key: `r-${key}`, label: `${col?.label ?? key}: ${txt}`, onRemove: () => clearColumnFilter(key) };
|
|
1126
|
+
}),
|
|
1127
|
+
...activeFilters.flatMap(([key, sel]) => {
|
|
1128
|
+
const col = columns.find((c) => c.key === key);
|
|
1129
|
+
const extra = !col ? columns.flatMap((c) => c.extraFilters ?? []).find((f) => f.key === key) : void 0;
|
|
1130
|
+
const chipLabel = col?.label ?? extra?.label ?? key;
|
|
1131
|
+
const arr = Array.from(sel);
|
|
1132
|
+
if (col?.valueChipColors) {
|
|
1133
|
+
const cores = col.valueChipColors;
|
|
1134
|
+
return arr.map((v) => ({
|
|
1135
|
+
key: `${key}:${v}`,
|
|
1136
|
+
label: `${chipLabel}: ${rotuloVisivel(key, v)}`,
|
|
1137
|
+
colorClassName: cores[v],
|
|
1138
|
+
onRemove: () => toggleFilterValue(key, v)
|
|
1139
|
+
}));
|
|
1140
|
+
}
|
|
1141
|
+
const txt = arr.length > 2 || arr.length === 0 ? L.selected.replace("{count}", String(arr.length)) : arr.map((v) => rotuloVisivel(key, v)).join(", ");
|
|
1142
|
+
return [{ key, label: `${chipLabel}: ${txt}`, onRemove: () => clearColumnFilter(key) }];
|
|
1143
|
+
})
|
|
1144
|
+
],
|
|
1145
|
+
onClearAll: clearAllFilters,
|
|
1146
|
+
clearAllLabel: L.clearAll
|
|
1147
|
+
}
|
|
1148
|
+
),
|
|
1149
|
+
/* @__PURE__ */ jsx(
|
|
1150
|
+
"div",
|
|
1151
|
+
{
|
|
1152
|
+
className: `overflow-auto rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 ${scrollAffordance ? "outline-none focus-visible:ring-2 focus-visible:ring-proef-blue dark:focus-visible:ring-proef-turquoise" : ""}`,
|
|
1153
|
+
style: { maxHeight },
|
|
1154
|
+
...scrollAffordance ? { tabIndex: 0, role: "region", "aria-label": L.scrollRegion ?? DEFAULT_LABELS.scrollRegion, onKeyDown: rolarComTeclado } : {},
|
|
1155
|
+
children: /* @__PURE__ */ jsxs("table", { className: "w-full text-[13px] border-collapse dark:text-slate-200", children: [
|
|
1156
|
+
/* @__PURE__ */ jsx("thead", { className: "sticky top-0 z-[2]", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
1157
|
+
selectable && /* @__PURE__ */ jsx("th", { className: "bg-slate-50 dark:bg-slate-800 px-3 py-2.5 border-b border-slate-200 dark:border-slate-700 w-10 sticky left-0 z-[3]", children: /* @__PURE__ */ jsx(
|
|
1158
|
+
"button",
|
|
1159
|
+
{
|
|
1160
|
+
onClick: alternarTodas,
|
|
1161
|
+
className: `appearance-none cursor-pointer w-4 h-4 flex items-center justify-center border transition-colors rounded ${todasVisiveisMarcadas ? "bg-proef-navy dark:bg-proef-turquoise border-proef-navy dark:border-proef-turquoise text-white dark:text-proef-navy" : algumaVisivelMarcada ? "bg-slate-300 dark:bg-slate-600 border-slate-300 dark:border-slate-600 text-white" : "bg-white dark:bg-slate-900 border-slate-300 dark:border-slate-600 hover:border-slate-400 dark:hover:border-slate-500"}`,
|
|
1162
|
+
children: (todasVisiveisMarcadas || algumaVisivelMarcada) && /* @__PURE__ */ jsx("span", { className: "text-[9px] leading-none", children: "✓" })
|
|
1163
|
+
}
|
|
1164
|
+
) }),
|
|
1165
|
+
columns.map((c) => {
|
|
1166
|
+
const podeOrdenar = c.sortable !== false;
|
|
1167
|
+
const podeAgrupar = agrupavel(c);
|
|
1168
|
+
const agrupada = groupByKeys.includes(c.key);
|
|
1169
|
+
return /* @__PURE__ */ jsxs(
|
|
1170
|
+
"th",
|
|
1171
|
+
{
|
|
1172
|
+
style: {
|
|
1173
|
+
...c.width ? { minWidth: c.width } : {},
|
|
1174
|
+
...larguras[c.key] ? { width: larguras[c.key], minWidth: larguras[c.key], maxWidth: larguras[c.key] } : {},
|
|
1175
|
+
...estiloPreso(c) ?? {}
|
|
1176
|
+
},
|
|
1177
|
+
className: `group/th relative bg-slate-50 dark:bg-slate-800 text-[11.5px] uppercase tracking-wide text-slate-500 dark:text-slate-400 font-semibold px-3 py-2.5 border-b border-slate-200 dark:border-slate-700 whitespace-nowrap select-none ${alignClass(
|
|
1178
|
+
c.align
|
|
1179
|
+
)} ${c.sticky ? `sticky z-[3] bg-slate-50 dark:bg-slate-800 ${c.sticky === "right" ? "border-l border-slate-200 dark:border-slate-700" : ""}` : ""} ${c.headerClassName ?? ""}`,
|
|
1180
|
+
children: [
|
|
1181
|
+
resizableColumns && // Pega no limite direito: arrastar redimensiona; duplo clique repõe a largura automática
|
|
1182
|
+
/* @__PURE__ */ jsx(
|
|
1183
|
+
"span",
|
|
1184
|
+
{
|
|
1185
|
+
role: "separator",
|
|
1186
|
+
"aria-orientation": "vertical",
|
|
1187
|
+
title: L.resizeColumn,
|
|
1188
|
+
onMouseDown: (e) => iniciarResize(e, c.key),
|
|
1189
|
+
onDoubleClick: () => reporLargura(c.key),
|
|
1190
|
+
onClick: (e) => e.stopPropagation(),
|
|
1191
|
+
className: "absolute right-0 top-0 z-[4] h-full w-1.5 cursor-col-resize bg-transparent hover:bg-proef-blue/40 group-hover/th:bg-slate-300/60 dark:group-hover/th:bg-slate-600/60"
|
|
1192
|
+
}
|
|
1193
|
+
),
|
|
1194
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1195
|
+
podeOrdenar ? /* @__PURE__ */ jsxs(
|
|
1196
|
+
"button",
|
|
1197
|
+
{
|
|
1198
|
+
onClick: () => toggleSort(c.key),
|
|
1199
|
+
className: "appearance-none bg-transparent border-0 cursor-pointer p-0 uppercase tracking-wide text-slate-500 dark:text-slate-400 hover:text-proef-blue dark:hover:text-proef-turquoise font-semibold",
|
|
1200
|
+
children: [
|
|
1201
|
+
c.label,
|
|
1202
|
+
sort?.key === c.key && /* @__PURE__ */ jsx("span", { className: "ml-1", children: sort.dir === 1 ? "▲" : "▼" })
|
|
1203
|
+
]
|
|
1204
|
+
}
|
|
1205
|
+
) : /* @__PURE__ */ jsx("span", { children: c.label }),
|
|
1206
|
+
podeAgrupar && /* @__PURE__ */ jsx(
|
|
1207
|
+
"button",
|
|
1208
|
+
{
|
|
1209
|
+
onClick: () => alternarGrupo(c.key),
|
|
1210
|
+
title: (agrupada ? L.ungroup : L.groupBy).replace("{label}", c.label),
|
|
1211
|
+
className: `appearance-none bg-transparent border-0 cursor-pointer p-0.5 transition-colors ${agrupada ? "text-violet-600 dark:text-violet-300" : "text-slate-300 dark:text-slate-600 hover:text-slate-500 dark:hover:text-slate-300"}`,
|
|
1212
|
+
children: /* @__PURE__ */ jsx(Layers, { size: 10 })
|
|
1213
|
+
}
|
|
1214
|
+
),
|
|
1215
|
+
botaoFunil(c)
|
|
1216
|
+
] }),
|
|
1217
|
+
c.headerExtra && /* @__PURE__ */ jsx("div", { className: "mt-0.5 normal-case font-normal tracking-normal", children: c.headerExtra(filtered) })
|
|
1218
|
+
]
|
|
1219
|
+
},
|
|
1220
|
+
c.key
|
|
1221
|
+
);
|
|
1222
|
+
})
|
|
1223
|
+
] }) }),
|
|
1224
|
+
/* @__PURE__ */ jsx("tbody", { children: isLoading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: nColunas, className: "py-16 text-center text-sm font-bold uppercase tracking-widest text-slate-400", children: /* @__PURE__ */ jsxs("div", { role: "status", "aria-live": "polite", className: "inline-flex items-center gap-2", children: [
|
|
1225
|
+
/* @__PURE__ */ jsx(Spinner, { size: 16, className: "text-proef-blue dark:text-proef-turquoise" }),
|
|
1226
|
+
/* @__PURE__ */ jsx("span", { children: L.loading })
|
|
1227
|
+
] }) }) }) : aEsperarDataset ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: nColunas, className: "py-16 text-center text-sm font-bold uppercase tracking-widest text-slate-400", children: L.loading }) }) : isGrouped ? grupos.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: nColunas, className: "py-16 text-center text-sm text-slate-400", children: L.empty }) }) : renderGrupos(grupos, 0) : sorted.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsxs("td", { colSpan: nColunas, className: "py-16 text-center", children: [
|
|
1228
|
+
emptyIcon && /* @__PURE__ */ jsx("div", { className: "flex justify-center mb-2", children: emptyIcon }),
|
|
1229
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-slate-400", children: L.empty }),
|
|
1230
|
+
emptySubLabel && /* @__PURE__ */ jsx("p", { className: "text-xs text-slate-400 mt-1", children: emptySubLabel })
|
|
1231
|
+
] }) }) : pageData.map((row, i) => renderLinha(row, i)) }),
|
|
1232
|
+
totalRow && !isLoading && !aEsperarDataset && sorted.length > 0 && /* @__PURE__ */ jsx("tfoot", { className: "sticky bottom-0 z-[2]", children: /* @__PURE__ */ jsxs("tr", { className: "bg-slate-100 dark:bg-slate-800 font-black text-slate-800 dark:text-slate-100", children: [
|
|
1233
|
+
/* @__PURE__ */ jsx("td", { colSpan: colunasRotuloGrupo, className: "px-3 py-2 border-t-2 border-slate-200 dark:border-slate-700 text-[10px] uppercase tracking-widest", children: L.total }),
|
|
1234
|
+
colunasComValor.map((c) => /* @__PURE__ */ jsx("td", { className: `px-3 py-2 border-t-2 border-slate-200 dark:border-slate-700 whitespace-nowrap text-xs ${alignClass(c.align)}`, children: c.groupAggregate?.(sorted) }, c.key))
|
|
1235
|
+
] }) })
|
|
1236
|
+
] })
|
|
1237
|
+
}
|
|
1238
|
+
),
|
|
1239
|
+
!isLoading && paginando && (totalPages > 1 || (pageSizeOptions?.length ?? 0) > 0) && /* @__PURE__ */ jsx(
|
|
1240
|
+
Pagination,
|
|
1241
|
+
{
|
|
1242
|
+
className: "mt-2.5",
|
|
1243
|
+
page: currentPage,
|
|
1244
|
+
pages: totalPages,
|
|
1245
|
+
onPageChange: (p) => setPage(Math.min(totalPages, Math.max(1, p))),
|
|
1246
|
+
pageSize: pageSizeAtual,
|
|
1247
|
+
pageSizeOptions,
|
|
1248
|
+
onPageSizeChange: escolherPageSize,
|
|
1249
|
+
labels: { page: L.page, perPage: L.perPage, prev: L.prev, next: L.next }
|
|
1250
|
+
}
|
|
1251
|
+
)
|
|
1252
|
+
] });
|
|
1253
|
+
}
|
|
1254
|
+
export {
|
|
1255
|
+
DataTable as default,
|
|
1256
|
+
pesquisaCuringa,
|
|
1257
|
+
timestampDeData
|
|
1258
|
+
};
|
|
1259
|
+
//# sourceMappingURL=DataTable.js.map
|