@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.
Files changed (452) hide show
  1. package/dist/esm/assets/imagem-6ee08a37d9.png +0 -0
  2. package/dist/esm/assets/imagem-6fcae1b87b.png +0 -0
  3. package/dist/esm/index.js +324 -0
  4. package/dist/esm/index.js.map +1 -0
  5. package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js +5 -0
  6. package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js.map +1 -0
  7. package/dist/esm/legacy/components/atoms/Acronym/Acronym.css +43 -0
  8. package/dist/esm/legacy/components/atoms/Acronym/Acronym.js +31 -0
  9. package/dist/esm/legacy/components/atoms/Acronym/Acronym.js.map +1 -0
  10. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.css +36 -0
  11. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js +57 -0
  12. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js.map +1 -0
  13. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.css +218 -0
  14. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js +50 -0
  15. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js.map +1 -0
  16. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.css +56 -0
  17. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js +34 -0
  18. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js.map +1 -0
  19. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.css +74 -0
  20. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js +29 -0
  21. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js.map +1 -0
  22. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.css +99 -0
  23. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js +36 -0
  24. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js.map +1 -0
  25. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.css +63 -0
  26. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js +21 -0
  27. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js.map +1 -0
  28. package/dist/esm/legacy/components/atoms/Field/Field.css +171 -0
  29. package/dist/esm/legacy/components/atoms/Field/Field.js +70 -0
  30. package/dist/esm/legacy/components/atoms/Field/Field.js.map +1 -0
  31. package/dist/esm/legacy/components/atoms/IconText/IconText.css +10 -0
  32. package/dist/esm/legacy/components/atoms/IconText/IconText.js +25 -0
  33. package/dist/esm/legacy/components/atoms/IconText/IconText.js.map +1 -0
  34. package/dist/esm/legacy/components/atoms/Icone/Icone.js +24 -0
  35. package/dist/esm/legacy/components/atoms/Icone/Icone.js.map +1 -0
  36. package/dist/esm/legacy/components/atoms/Input/Input.css +12 -0
  37. package/dist/esm/legacy/components/atoms/Input/Input.js +28 -0
  38. package/dist/esm/legacy/components/atoms/Input/Input.js.map +1 -0
  39. package/dist/esm/legacy/components/atoms/InputData/InputData.js +25 -0
  40. package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -0
  41. package/dist/esm/legacy/components/atoms/Label/Label.css +192 -0
  42. package/dist/esm/legacy/components/atoms/Label/Label.js +13 -0
  43. package/dist/esm/legacy/components/atoms/Label/Label.js.map +1 -0
  44. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.css +40 -0
  45. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js +21 -0
  46. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js.map +1 -0
  47. package/dist/esm/legacy/components/atoms/Select/Select.css +16 -0
  48. package/dist/esm/legacy/components/atoms/Select/Select.js +27 -0
  49. package/dist/esm/legacy/components/atoms/Select/Select.js.map +1 -0
  50. package/dist/esm/legacy/components/atoms/Stack/Stack.js +20 -0
  51. package/dist/esm/legacy/components/atoms/Stack/Stack.js.map +1 -0
  52. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.css +36 -0
  53. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js +29 -0
  54. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js.map +1 -0
  55. package/dist/esm/legacy/components/charts/Charts.js +349 -0
  56. package/dist/esm/legacy/components/charts/Charts.js.map +1 -0
  57. package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js +100 -0
  58. package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js.map +1 -0
  59. package/dist/esm/legacy/components/layout/Error/Error.css +20 -0
  60. package/dist/esm/legacy/components/layout/Error/Error.js +12 -0
  61. package/dist/esm/legacy/components/layout/Error/Error.js.map +1 -0
  62. package/dist/esm/legacy/components/layout/Footer/Footer.css +42 -0
  63. package/dist/esm/legacy/components/layout/Footer/Footer.js +23 -0
  64. package/dist/esm/legacy/components/layout/Footer/Footer.js.map +1 -0
  65. package/dist/esm/legacy/components/layout/Header/Header.css +66 -0
  66. package/dist/esm/legacy/components/layout/Header/Header.js +37 -0
  67. package/dist/esm/legacy/components/layout/Header/Header.js.map +1 -0
  68. package/dist/esm/legacy/components/layout/Layout/Layout.js +31 -0
  69. package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -0
  70. package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +38 -0
  71. package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -0
  72. package/dist/esm/legacy/components/layout/Spinner/Spinner.css +10 -0
  73. package/dist/esm/legacy/components/layout/Spinner/Spinner.js +19 -0
  74. package/dist/esm/legacy/components/layout/Spinner/Spinner.js.map +1 -0
  75. package/dist/esm/legacy/components/layout/TopBar/TopBar.js +34 -0
  76. package/dist/esm/legacy/components/layout/TopBar/TopBar.js.map +1 -0
  77. package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js +82 -0
  78. package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js.map +1 -0
  79. package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js +25 -0
  80. package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js.map +1 -0
  81. package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +246 -0
  82. package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -0
  83. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.css +3 -0
  84. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js +33 -0
  85. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js.map +1 -0
  86. package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +1259 -0
  87. package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -0
  88. package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js +68 -0
  89. package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js.map +1 -0
  90. package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js +96 -0
  91. package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js.map +1 -0
  92. package/dist/esm/legacy/components/molecules/Modal/Modal.css +54 -0
  93. package/dist/esm/legacy/components/molecules/Modal/Modal.js +64 -0
  94. package/dist/esm/legacy/components/molecules/Modal/Modal.js.map +1 -0
  95. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.css +97 -0
  96. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js +113 -0
  97. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js.map +1 -0
  98. package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js +114 -0
  99. package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js.map +1 -0
  100. package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js +116 -0
  101. package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js.map +1 -0
  102. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.css +69 -0
  103. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js +62 -0
  104. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js.map +1 -0
  105. package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +23 -0
  106. package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -0
  107. package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js +162 -0
  108. package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js.map +1 -0
  109. package/dist/esm/legacy/components/organisms/Kanban/Kanban.js +88 -0
  110. package/dist/esm/legacy/components/organisms/Kanban/Kanban.js.map +1 -0
  111. package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js +87 -0
  112. package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js.map +1 -0
  113. package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +427 -0
  114. package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -0
  115. package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +218 -0
  116. package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -0
  117. package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js +147 -0
  118. package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js.map +1 -0
  119. package/dist/esm/legacy/components/organisms/Profile/Profile.css +26 -0
  120. package/dist/esm/legacy/components/organisms/Profile/Profile.js +26 -0
  121. package/dist/esm/legacy/components/organisms/Profile/Profile.js.map +1 -0
  122. package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js +79 -0
  123. package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js.map +1 -0
  124. package/dist/esm/legacy/components/organisms/Selector/Selector.css +87 -0
  125. package/dist/esm/legacy/components/organisms/Selector/Selector.js +181 -0
  126. package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -0
  127. package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js +115 -0
  128. package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js.map +1 -0
  129. package/dist/esm/legacy/components/ui/Avisos.js +33 -0
  130. package/dist/esm/legacy/components/ui/Avisos.js.map +1 -0
  131. package/dist/esm/legacy/components/ui/BarraAcoes.js +19 -0
  132. package/dist/esm/legacy/components/ui/BarraAcoes.js.map +1 -0
  133. package/dist/esm/legacy/components/ui/CabecalhoPagina.js +19 -0
  134. package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -0
  135. package/dist/esm/legacy/components/ui/CaixaPesquisa.js +9 -0
  136. package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -0
  137. package/dist/esm/legacy/components/ui/Confirmacao.js +34 -0
  138. package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -0
  139. package/dist/esm/legacy/components/ui/Escolha.js +41 -0
  140. package/dist/esm/legacy/components/ui/Escolha.js.map +1 -0
  141. package/dist/esm/legacy/components/ui/FaixaAviso.js +19 -0
  142. package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -0
  143. package/dist/esm/legacy/components/ui/MenuAcoes.js +116 -0
  144. package/dist/esm/legacy/components/ui/MenuAcoes.js.map +1 -0
  145. package/dist/esm/legacy/components/ui/Passos.js +32 -0
  146. package/dist/esm/legacy/components/ui/Passos.js.map +1 -0
  147. package/dist/esm/legacy/components/ui/Separadores.js +17 -0
  148. package/dist/esm/legacy/components/ui/Separadores.js.map +1 -0
  149. package/dist/esm/legacy/components/ui/TextoAuto.js +33 -0
  150. package/dist/esm/legacy/components/ui/TextoAuto.js.map +1 -0
  151. package/dist/esm/legacy/components/ui/Ui.js +263 -0
  152. package/dist/esm/legacy/components/ui/Ui.js.map +1 -0
  153. package/dist/esm/legacy/components/ui/painelFlutuante.js +13 -0
  154. package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -0
  155. package/dist/esm/legacy/constants/Colors.js +33 -0
  156. package/dist/esm/legacy/constants/Colors.js.map +1 -0
  157. package/dist/esm/legacy/constants/FontWeight.js +35 -0
  158. package/dist/esm/legacy/constants/FontWeight.js.map +1 -0
  159. package/dist/esm/legacy/contexts/apiContext.js +25 -0
  160. package/dist/esm/legacy/contexts/apiContext.js.map +1 -0
  161. package/dist/esm/legacy/contexts/authContext.js +85 -0
  162. package/dist/esm/legacy/contexts/authContext.js.map +1 -0
  163. package/dist/esm/legacy/contexts/socketContext.js +34 -0
  164. package/dist/esm/legacy/contexts/socketContext.js.map +1 -0
  165. package/dist/esm/legacy/hooks/useApi.js +62 -0
  166. package/dist/esm/legacy/hooks/useApi.js.map +1 -0
  167. package/dist/esm/legacy/pages/Error/ErrorPage.css +18 -0
  168. package/dist/esm/legacy/pages/Error/ErrorPage.js +50 -0
  169. package/dist/esm/legacy/pages/Error/ErrorPage.js.map +1 -0
  170. package/dist/esm/legacy/pages/Loading/Loading.css +46 -0
  171. package/dist/esm/legacy/pages/Loading/Loading.js +9 -0
  172. package/dist/esm/legacy/pages/Loading/Loading.js.map +1 -0
  173. package/dist/esm/legacy/pages/Login/LoginScreen.js +46 -0
  174. package/dist/esm/legacy/pages/Login/LoginScreen.js.map +1 -0
  175. package/dist/esm/legacy/pages/NotFound/NotFound.css +21 -0
  176. package/dist/esm/legacy/pages/NotFound/NotFound.js +24 -0
  177. package/dist/esm/legacy/pages/NotFound/NotFound.js.map +1 -0
  178. package/dist/esm/legacy/styles/themes/ButtonThemes.js +28 -0
  179. package/dist/esm/legacy/styles/themes/ButtonThemes.js.map +1 -0
  180. package/dist/esm/legacy/styles/utils/utils.js +7 -0
  181. package/dist/esm/legacy/styles/utils/utils.js.map +1 -0
  182. package/dist/esm/legacy/utils/stringUtils.js +35 -0
  183. package/dist/esm/legacy/utils/stringUtils.js.map +1 -0
  184. package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js +157 -0
  185. package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js.map +1 -0
  186. package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js +52 -0
  187. package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js.map +1 -0
  188. package/dist/esm/v1/capabilities/theme/useIsDark.js +15 -0
  189. package/dist/esm/v1/capabilities/theme/useIsDark.js.map +1 -0
  190. package/dist/esm/v1/capabilities/theme/useTheme.js +66 -0
  191. package/dist/esm/v1/capabilities/theme/useTheme.js.map +1 -0
  192. package/dist/esm/v1/components/data/Pagination/Pagination.js +66 -0
  193. package/dist/esm/v1/components/data/Pagination/Pagination.js.map +1 -0
  194. package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js +307 -0
  195. package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js.map +1 -0
  196. package/dist/esm/v1/components/feedback/Toast/Toast.js +105 -0
  197. package/dist/esm/v1/components/feedback/Toast/Toast.js.map +1 -0
  198. package/dist/esm/v1/components/forms/FormField/FormField.js +59 -0
  199. package/dist/esm/v1/components/forms/FormField/FormField.js.map +1 -0
  200. package/dist/esm/v1/components/forms/FormGrid/FormGrid.js +20 -0
  201. package/dist/esm/v1/components/forms/FormGrid/FormGrid.js.map +1 -0
  202. package/dist/esm/v1/components/layout/AppShell/AppShell.js +89 -0
  203. package/dist/esm/v1/components/layout/AppShell/AppShell.js.map +1 -0
  204. package/dist/esm/v1/components/layout/Page/Page.js +16 -0
  205. package/dist/esm/v1/components/layout/Page/Page.js.map +1 -0
  206. package/dist/esm/v1/components/layout/PageHeader/PageHeader.js +26 -0
  207. package/dist/esm/v1/components/layout/PageHeader/PageHeader.js.map +1 -0
  208. package/dist/esm/v1/components/layout/SideNav/SideNav.js +287 -0
  209. package/dist/esm/v1/components/layout/SideNav/SideNav.js.map +1 -0
  210. package/dist/esm/v1/components/layout/navTrail.js +19 -0
  211. package/dist/esm/v1/components/layout/navTrail.js.map +1 -0
  212. package/dist/esm/v1/components/lists/ListFinder/ListFinder.js +271 -0
  213. package/dist/esm/v1/components/lists/ListFinder/ListFinder.js.map +1 -0
  214. package/dist/esm/v1/components/lists/ListFinder/labels.js +18 -0
  215. package/dist/esm/v1/components/lists/ListFinder/labels.js.map +1 -0
  216. package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js +95 -0
  217. package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js.map +1 -0
  218. package/dist/esm/v1/components/overlays/Dialog/Dialog.js +141 -0
  219. package/dist/esm/v1/components/overlays/Dialog/Dialog.js.map +1 -0
  220. package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js +98 -0
  221. package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js.map +1 -0
  222. package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js +84 -0
  223. package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js.map +1 -0
  224. package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js +33 -0
  225. package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js.map +1 -0
  226. package/dist/esm/v1/components/overlays/topLayer.js +28 -0
  227. package/dist/esm/v1/components/overlays/topLayer.js.map +1 -0
  228. package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js +50 -0
  229. package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js.map +1 -0
  230. package/dist/esm/v1/components/tables/Table/ColumnFilter.js +292 -0
  231. package/dist/esm/v1/components/tables/Table/ColumnFilter.js.map +1 -0
  232. package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js +129 -0
  233. package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js.map +1 -0
  234. package/dist/esm/v1/components/tables/Table/Table.js +1410 -0
  235. package/dist/esm/v1/components/tables/Table/Table.js.map +1 -0
  236. package/dist/esm/v1/components/tables/Table/labels.js +44 -0
  237. package/dist/esm/v1/components/tables/Table/labels.js.map +1 -0
  238. package/dist/esm/v1/foundations/icons/icons.js +227 -0
  239. package/dist/esm/v1/foundations/icons/icons.js.map +1 -0
  240. package/dist/esm/v1/primitives/buttons/Button/Button.js +41 -0
  241. package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -0
  242. package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js +65 -0
  243. package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js.map +1 -0
  244. package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js +10 -0
  245. package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js.map +1 -0
  246. package/dist/esm/v1/primitives/display/Avatar/Avatar.js +120 -0
  247. package/dist/esm/v1/primitives/display/Avatar/Avatar.js.map +1 -0
  248. package/dist/esm/v1/primitives/display/Badge/Badge.js +23 -0
  249. package/dist/esm/v1/primitives/display/Badge/Badge.js.map +1 -0
  250. package/dist/esm/v1/primitives/display/Card/Card.js +22 -0
  251. package/dist/esm/v1/primitives/display/Card/Card.js.map +1 -0
  252. package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js +45 -0
  253. package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js.map +1 -0
  254. package/dist/esm/v1/primitives/display/Kpi/Kpi.js +103 -0
  255. package/dist/esm/v1/primitives/display/Kpi/Kpi.js.map +1 -0
  256. package/dist/esm/v1/primitives/display/Notice/Notice.js +71 -0
  257. package/dist/esm/v1/primitives/display/Notice/Notice.js.map +1 -0
  258. package/dist/esm/v1/primitives/display/Person/Person.js +14 -0
  259. package/dist/esm/v1/primitives/display/Person/Person.js.map +1 -0
  260. package/dist/esm/v1/primitives/display/RichText/RichText.js +12 -0
  261. package/dist/esm/v1/primitives/display/RichText/RichText.js.map +1 -0
  262. package/dist/esm/v1/primitives/display/RichText/utils.js +56 -0
  263. package/dist/esm/v1/primitives/display/RichText/utils.js.map +1 -0
  264. package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js +137 -0
  265. package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js.map +1 -0
  266. package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js +26 -0
  267. package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js.map +1 -0
  268. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js +37 -0
  269. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -0
  270. package/dist/esm/v1/primitives/forms/DateInput/DateInput.js +150 -0
  271. package/dist/esm/v1/primitives/forms/DateInput/DateInput.js.map +1 -0
  272. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js +37 -0
  273. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js.map +1 -0
  274. package/dist/esm/v1/primitives/forms/RichTextEditor/RichTextEditor.js +253 -0
  275. package/dist/esm/v1/primitives/forms/RichTextEditor/RichTextEditor.js.map +1 -0
  276. package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js +43 -0
  277. package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js.map +1 -0
  278. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +207 -0
  279. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -0
  280. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js +75 -0
  281. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js.map +1 -0
  282. package/dist/esm/v1/primitives/forms/TextInput/TextInput.js +21 -0
  283. package/dist/esm/v1/primitives/forms/TextInput/TextInput.js.map +1 -0
  284. package/dist/esm/v1/primitives/forms/field.js +14 -0
  285. package/dist/esm/v1/primitives/forms/field.js.map +1 -0
  286. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js +73 -0
  287. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js.map +1 -0
  288. package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js +96 -0
  289. package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js.map +1 -0
  290. package/dist/style.components.css +3 -0
  291. package/dist/style.css +2 -0
  292. package/dist/style.layered.css +2 -0
  293. package/dist/tailwind.css +24 -0
  294. package/dist/theme-boot.js +1 -0
  295. package/dist/theme.css +265 -0
  296. package/dist/tokens.css +121 -0
  297. package/dist/types/index.d.ts +14 -0
  298. package/dist/types/legacy/components/atoms/Acronym/Acronym.d.ts +11 -0
  299. package/dist/types/legacy/components/atoms/BreadCrumb/BreadCrumb.d.ts +9 -0
  300. package/dist/types/legacy/components/atoms/Button/variants/ActionButton.d.ts +14 -0
  301. package/dist/types/legacy/components/atoms/Button/variants/FilterButton.d.ts +12 -0
  302. package/dist/types/legacy/components/atoms/Button/variants/IconButton.d.ts +22 -0
  303. package/dist/types/legacy/components/atoms/Button/variants/MainButton.d.ts +17 -0
  304. package/dist/types/legacy/components/atoms/Button/variants/TabButton.d.ts +14 -0
  305. package/dist/types/legacy/components/atoms/Field/Field.d.ts +15 -0
  306. package/dist/types/legacy/components/atoms/IconText/IconText.d.ts +12 -0
  307. package/dist/types/legacy/components/atoms/Icone/Icone.d.ts +31 -0
  308. package/dist/types/legacy/components/atoms/Input/Input.d.ts +13 -0
  309. package/dist/types/legacy/components/atoms/InputData/InputData.d.ts +38 -0
  310. package/dist/types/legacy/components/atoms/Label/Label.d.ts +11 -0
  311. package/dist/types/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.d.ts +10 -0
  312. package/dist/types/legacy/components/atoms/SearchSelect/SearchSelect.d.ts +15 -0
  313. package/dist/types/legacy/components/atoms/Select/Select.d.ts +16 -0
  314. package/dist/types/legacy/components/atoms/Stack/Stack.d.ts +9 -0
  315. package/dist/types/legacy/components/atoms/Switch/CustomSwitch.d.ts +12 -0
  316. package/dist/types/legacy/components/charts/Charts.d.ts +149 -0
  317. package/dist/types/legacy/components/layout/AppLauncher/AppLauncher.d.ts +35 -0
  318. package/dist/types/legacy/components/layout/Error/Error.d.ts +8 -0
  319. package/dist/types/legacy/components/layout/Footer/Footer.d.ts +11 -0
  320. package/dist/types/legacy/components/layout/Header/Header.d.ts +16 -0
  321. package/dist/types/legacy/components/layout/Layout/Layout.d.ts +35 -0
  322. package/dist/types/legacy/components/layout/Sidebar/Sidebar.d.ts +56 -0
  323. package/dist/types/legacy/components/layout/Spinner/Spinner.d.ts +5 -0
  324. package/dist/types/legacy/components/layout/TopBar/TopBar.d.ts +10 -0
  325. package/dist/types/legacy/components/layout/TopNavLayout/TopNavLayout.d.ts +43 -0
  326. package/dist/types/legacy/components/molecules/BarraValor/BarraValor.d.ts +28 -0
  327. package/dist/types/legacy/components/molecules/ColumnPicker/ColumnPicker.d.ts +116 -0
  328. package/dist/types/legacy/components/molecules/ConfirmModal/ConfirmModal.d.ts +13 -0
  329. package/dist/types/legacy/components/molecules/DataTable/DataTable.d.ts +344 -0
  330. package/dist/types/legacy/components/molecules/FileDropzone/FileDropzone.d.ts +25 -0
  331. package/dist/types/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +33 -0
  332. package/dist/types/legacy/components/molecules/Modal/Modal.d.ts +22 -0
  333. package/dist/types/legacy/components/molecules/MultiTagPicker/MultiTagPicker.d.ts +25 -0
  334. package/dist/types/legacy/components/molecules/PhotoAvatar/PhotoAvatar.d.ts +34 -0
  335. package/dist/types/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.d.ts +48 -0
  336. package/dist/types/legacy/components/molecules/Sidebar/Sidebar.d.ts +12 -0
  337. package/dist/types/legacy/components/molecules/UserAvatar/UserAvatar.d.ts +19 -0
  338. package/dist/types/legacy/components/organisms/GanttChart/GanttChart.d.ts +62 -0
  339. package/dist/types/legacy/components/organisms/Kanban/Kanban.d.ts +44 -0
  340. package/dist/types/legacy/components/organisms/LazyLoader/LazyLoader.d.ts +16 -0
  341. package/dist/types/legacy/components/organisms/MapaPontos/MapaPontos.d.ts +206 -0
  342. package/dist/types/legacy/components/organisms/PainelFiltros/PainelFiltros.d.ts +69 -0
  343. package/dist/types/legacy/components/organisms/PesquisaRapida/PesquisaRapida.d.ts +53 -0
  344. package/dist/types/legacy/components/organisms/Profile/Profile.d.ts +12 -0
  345. package/dist/types/legacy/components/organisms/RoleGuard/RoleGuard.d.ts +37 -0
  346. package/dist/types/legacy/components/organisms/Selector/Selector.d.ts +20 -0
  347. package/dist/types/legacy/components/organisms/StatusMatrix/StatusMatrix.d.ts +54 -0
  348. package/dist/types/legacy/components/ui/Avisos.d.ts +33 -0
  349. package/dist/types/legacy/components/ui/BarraAcoes.d.ts +19 -0
  350. package/dist/types/legacy/components/ui/CabecalhoPagina.d.ts +23 -0
  351. package/dist/types/legacy/components/ui/CaixaPesquisa.d.ts +14 -0
  352. package/dist/types/legacy/components/ui/Confirmacao.d.ts +24 -0
  353. package/dist/types/legacy/components/ui/Escolha.d.ts +35 -0
  354. package/dist/types/legacy/components/ui/FaixaAviso.d.ts +19 -0
  355. package/dist/types/legacy/components/ui/MenuAcoes.d.ts +31 -0
  356. package/dist/types/legacy/components/ui/Passos.d.ts +31 -0
  357. package/dist/types/legacy/components/ui/Separadores.d.ts +19 -0
  358. package/dist/types/legacy/components/ui/TextoAuto.d.ts +23 -0
  359. package/dist/types/legacy/components/ui/Ui.d.ts +181 -0
  360. package/dist/types/legacy/components/ui/painelFlutuante.d.ts +16 -0
  361. package/dist/types/legacy/constants/Colors.d.ts +28 -0
  362. package/dist/types/legacy/constants/FontWeight.d.ts +9 -0
  363. package/dist/types/legacy/contexts/apiContext.d.ts +10 -0
  364. package/dist/types/legacy/contexts/authContext.d.ts +31 -0
  365. package/dist/types/legacy/contexts/socketContext.d.ts +16 -0
  366. package/dist/types/legacy/exports/assets.d.ts +0 -0
  367. package/dist/types/legacy/exports/atoms.d.ts +19 -0
  368. package/dist/types/legacy/exports/charts.d.ts +2 -0
  369. package/dist/types/legacy/exports/constants.d.ts +0 -0
  370. package/dist/types/legacy/exports/contexts.d.ts +3 -0
  371. package/dist/types/legacy/exports/hooks.d.ts +4 -0
  372. package/dist/types/legacy/exports/layout.d.ts +14 -0
  373. package/dist/types/legacy/exports/molecules.d.ts +21 -0
  374. package/dist/types/legacy/exports/organisms.d.ts +17 -0
  375. package/dist/types/legacy/exports/pages.d.ts +5 -0
  376. package/dist/types/legacy/exports/styles.d.ts +2 -0
  377. package/dist/types/legacy/exports/types.d.ts +7 -0
  378. package/dist/types/legacy/exports/ui.d.ts +24 -0
  379. package/dist/types/legacy/exports/utils.d.ts +1 -0
  380. package/dist/types/legacy/hooks/useApi.d.ts +19 -0
  381. package/dist/types/legacy/pages/Error/ErrorPage.d.ts +16 -0
  382. package/dist/types/legacy/pages/Loading/Loading.d.ts +8 -0
  383. package/dist/types/legacy/pages/Login/LoginScreen.d.ts +42 -0
  384. package/dist/types/legacy/pages/NotFound/NotFound.d.ts +8 -0
  385. package/dist/types/legacy/styles/themes/ButtonThemes.d.ts +6 -0
  386. package/dist/types/legacy/styles/utils/utils.d.ts +2 -0
  387. package/dist/types/legacy/types/Fetcher.d.ts +5 -0
  388. package/dist/types/legacy/types/LoggedUser.d.ts +10 -0
  389. package/dist/types/legacy/types/SelectableElement.d.ts +6 -0
  390. package/dist/types/legacy/types/SidebarMenu.d.ts +12 -0
  391. package/dist/types/legacy/types/themes/AcronymThemes.d.ts +4 -0
  392. package/dist/types/legacy/types/themes/ButtonThemes.d.ts +21 -0
  393. package/dist/types/legacy/types/themes/CustomSwitchThemes.d.ts +4 -0
  394. package/dist/types/legacy/types/themes/IconTextThemes.d.ts +6 -0
  395. package/dist/types/legacy/utils/keycloak.d.ts +0 -0
  396. package/dist/types/legacy/utils/stringUtils.d.ts +6 -0
  397. package/dist/types/v1/capabilities/documents/QRScanning/scanQRCodes.d.ts +25 -0
  398. package/dist/types/v1/capabilities/overlay/useFloatingPanel.d.ts +20 -0
  399. package/dist/types/v1/capabilities/theme/useIsDark.d.ts +10 -0
  400. package/dist/types/v1/capabilities/theme/useTheme.d.ts +29 -0
  401. package/dist/types/v1/components/data/Pagination/Pagination.d.ts +33 -0
  402. package/dist/types/v1/components/documents/DocumentDropzone/DocumentDropzone.d.ts +60 -0
  403. package/dist/types/v1/components/feedback/Toast/Toast.d.ts +51 -0
  404. package/dist/types/v1/components/forms/FormField/FormField.d.ts +44 -0
  405. package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +23 -0
  406. package/dist/types/v1/components/layout/AppShell/AppShell.d.ts +35 -0
  407. package/dist/types/v1/components/layout/Page/Page.d.ts +23 -0
  408. package/dist/types/v1/components/layout/PageHeader/PageHeader.d.ts +35 -0
  409. package/dist/types/v1/components/layout/SideNav/SideNav.d.ts +92 -0
  410. package/dist/types/v1/components/layout/navTrail.d.ts +15 -0
  411. package/dist/types/v1/components/lists/ListFinder/ListFinder.d.ts +86 -0
  412. package/dist/types/v1/components/lists/ListFinder/labels.d.ts +24 -0
  413. package/dist/types/v1/components/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
  414. package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +66 -0
  415. package/dist/types/v1/components/overlays/Tooltip/Tooltip.d.ts +34 -0
  416. package/dist/types/v1/components/overlays/Tooltip/TooltipLayer.d.ts +18 -0
  417. package/dist/types/v1/components/overlays/Tooltip/TooltipPanel.d.ts +23 -0
  418. package/dist/types/v1/components/overlays/topLayer.d.ts +23 -0
  419. package/dist/types/v1/components/tables/PaginatedTable/PaginatedTable.d.ts +41 -0
  420. package/dist/types/v1/components/tables/Table/ColumnFilter.d.ts +48 -0
  421. package/dist/types/v1/components/tables/Table/OverlayScrollbar.d.ts +34 -0
  422. package/dist/types/v1/components/tables/Table/Table.d.ts +250 -0
  423. package/dist/types/v1/components/tables/Table/labels.d.ts +54 -0
  424. package/dist/types/v1/foundations/icons/icons.d.ts +81 -0
  425. package/dist/types/v1/index.d.ts +86 -0
  426. package/dist/types/v1/primitives/buttons/Button/Button.d.ts +35 -0
  427. package/dist/types/v1/primitives/buttons/SegmentedControl/SegmentedControl.d.ts +28 -0
  428. package/dist/types/v1/primitives/buttons/SegmentedControl/segmentedStyles.d.ts +16 -0
  429. package/dist/types/v1/primitives/display/Avatar/Avatar.d.ts +30 -0
  430. package/dist/types/v1/primitives/display/Badge/Badge.d.ts +25 -0
  431. package/dist/types/v1/primitives/display/Card/Card.d.ts +22 -0
  432. package/dist/types/v1/primitives/display/FilterChips/FilterChips.d.ts +33 -0
  433. package/dist/types/v1/primitives/display/Kpi/Kpi.d.ts +68 -0
  434. package/dist/types/v1/primitives/display/Notice/Notice.d.ts +29 -0
  435. package/dist/types/v1/primitives/display/Person/Person.d.ts +15 -0
  436. package/dist/types/v1/primitives/display/RichText/RichText.d.ts +17 -0
  437. package/dist/types/v1/primitives/display/RichText/utils.d.ts +22 -0
  438. package/dist/types/v1/primitives/documents/PdfPreview/PdfPreview.d.ts +17 -0
  439. package/dist/types/v1/primitives/documents/PdfPreview/pdfjs.d.ts +11 -0
  440. package/dist/types/v1/primitives/forms/Checkbox/Checkbox.d.ts +25 -0
  441. package/dist/types/v1/primitives/forms/DateInput/DateInput.d.ts +43 -0
  442. package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +28 -0
  443. package/dist/types/v1/primitives/forms/RichTextEditor/RichTextEditor.d.ts +64 -0
  444. package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
  445. package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +70 -0
  446. package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +40 -0
  447. package/dist/types/v1/primitives/forms/TextInput/TextInput.d.ts +16 -0
  448. package/dist/types/v1/primitives/forms/field.d.ts +22 -0
  449. package/dist/types/v1/primitives/lists/ListItem/ListItem.d.ts +67 -0
  450. package/dist/types/v1/primitives/navigation/Tabs/Tabs.d.ts +58 -0
  451. package/package.json +125 -6
  452. 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