@archbase/components 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/dist/admin/types.d.ts +65 -0
  2. package/dist/archbase-components-3.0.0.tgz +0 -0
  3. package/dist/buttons/ActionsDemo.d.ts +2 -0
  4. package/dist/buttons/ArchbaseActionButtons.d.ts +61 -0
  5. package/dist/buttons/index.d.ts +2 -0
  6. package/dist/charts/ArchbaseTimeline.d.ts +24 -0
  7. package/dist/charts/index.d.ts +3 -0
  8. package/dist/charts/vis-timeline/ArchbaseVisTimeline.d.ts +9 -0
  9. package/dist/charts/vis-timeline/ArchbaseVisTimeline.types.d.ts +284 -0
  10. package/dist/charts/vis-timeline/index.d.ts +9 -0
  11. package/dist/charts/vis-timeline/utils/timelineOptions.d.ts +68 -0
  12. package/dist/datagrid/components/index.d.ts +6 -0
  13. package/dist/datagrid/components/pagination/grid-pagination.d.ts +7 -0
  14. package/dist/datagrid/components/render/archbase-data-grid-item-renderer.d.ts +10 -0
  15. package/dist/datagrid/components/toolbar/global-search-input.d.ts +16 -0
  16. package/dist/datagrid/components/toolbar/grid-toolbar.d.ts +19 -0
  17. package/dist/datagrid/hooks/index.d.ts +3 -0
  18. package/dist/datagrid/hooks/use-grid-data-stable-rendering.d.ts +15 -0
  19. package/dist/datagrid/hooks/use-grid-data.d.ts +32 -0
  20. package/dist/datagrid/hooks/use-grid-details-panel.d.ts +51 -0
  21. package/dist/datagrid/index.d.ts +6 -0
  22. package/dist/datagrid/main/archbase-data-grid-column.d.ts +26 -0
  23. package/dist/datagrid/main/archbase-data-grid-formatters.d.ts +57 -0
  24. package/dist/datagrid/main/archbase-data-grid-pagination.d.ts +8 -0
  25. package/dist/datagrid/main/archbase-data-grid-toolbar.d.ts +7 -0
  26. package/dist/datagrid/main/archbase-data-grid-types.d.ts +252 -0
  27. package/dist/datagrid/main/archbase-data-grid-utils.d.ts +45 -0
  28. package/dist/datagrid/main/archbase-data-grid.d.ts +9 -0
  29. package/dist/datagrid/main/archbase-detail-panel-component.d.ts +52 -0
  30. package/dist/datagrid/main/archbase-expand-button.d.ts +22 -0
  31. package/dist/datagrid/main/archbase-grid-popover.d.ts +37 -0
  32. package/dist/datagrid/main/grid-row-actions.d.ts +15 -0
  33. package/dist/datagrid/main/index.d.ts +21 -0
  34. package/dist/datagrid/modals/export-data.d.ts +13 -0
  35. package/dist/datagrid/modals/export-modal.d.ts +9 -0
  36. package/dist/datagrid/modals/index.d.ts +6 -0
  37. package/dist/datagrid/modals/print-data.d.ts +16 -0
  38. package/dist/datagrid/modals/print-modal.d.ts +9 -0
  39. package/dist/datagrid/types/grid-props.d.ts +48 -0
  40. package/dist/datagrid/types/index.d.ts +1 -0
  41. package/dist/datagrid/utils/formatter.d.ts +39 -0
  42. package/dist/datagrid/utils/index.d.ts +1 -0
  43. package/dist/debug/index.d.ts +4 -0
  44. package/dist/debug/jsonpathpicker/ArchbaseJsonPathPicker.d.ts +37 -0
  45. package/dist/debug/jsonpathpicker/index.d.ts +1 -0
  46. package/dist/debug/jsonview/ArchbaseJsonViewDataRenderer.d.ts +34 -0
  47. package/dist/debug/jsonview/ArchbaseJsonViewDataTypeDetection.d.ts +8 -0
  48. package/dist/debug/jsonview/index.d.ts +11 -0
  49. package/dist/debug/objectinspector/ArchbaseDebugInspector.d.ts +23 -0
  50. package/dist/debug/objectinspector/ArchbaseFloatingWindow.d.ts +24 -0
  51. package/dist/debug/objectinspector/ArchbaseObjectInspector.d.ts +6 -0
  52. package/dist/debug/objectinspector/index.d.ts +3 -0
  53. package/dist/display/index.d.ts +4 -0
  54. package/dist/editors/ArchbaseAsyncMultiSelect.d.ts +112 -0
  55. package/dist/editors/ArchbaseAsyncSelect.context.d.ts +8 -0
  56. package/dist/editors/ArchbaseAsyncSelect.d.ts +102 -0
  57. package/dist/editors/ArchbaseAvatarEdit.d.ts +49 -0
  58. package/dist/editors/ArchbaseCheckbox.d.ts +45 -0
  59. package/dist/editors/ArchbaseChip.d.ts +43 -0
  60. package/dist/editors/ArchbaseChipGroup.d.ts +42 -0
  61. package/dist/editors/ArchbaseChipItem.d.ts +18 -0
  62. package/dist/editors/ArchbaseColorPicker.d.ts +3 -0
  63. package/dist/editors/ArchbaseCountdownProgress.d.ts +5 -0
  64. package/dist/editors/ArchbaseCronExpressionEdit.d.ts +16 -0
  65. package/dist/editors/ArchbaseCronExpressionEditor.d.ts +8 -0
  66. package/dist/editors/ArchbaseDatePicker.d.ts +2 -0
  67. package/dist/editors/ArchbaseDatePickerEdit.d.ts +85 -0
  68. package/dist/editors/ArchbaseDatePickerRange.d.ts +47 -0
  69. package/dist/editors/ArchbaseDateTimePickerEdit.d.ts +43 -0
  70. package/dist/editors/ArchbaseDateTimePickerRange.d.ts +58 -0
  71. package/dist/editors/ArchbaseEdit.d.ts +56 -0
  72. package/dist/editors/ArchbaseEdit.example.d.ts +8 -0
  73. package/dist/editors/ArchbaseFileAttachment.d.ts +17 -0
  74. package/dist/editors/ArchbaseImageEdit.d.ts +50 -0
  75. package/dist/editors/ArchbaseJsonEdit.d.ts +49 -0
  76. package/dist/editors/ArchbaseKeyValueEditor.d.ts +22 -0
  77. package/dist/editors/ArchbaseLookupEdit.d.ts +57 -0
  78. package/dist/editors/ArchbaseLookupNumber.d.ts +69 -0
  79. package/dist/editors/ArchbaseLookupSelect.d.ts +9 -0
  80. package/dist/editors/ArchbaseMarkdownEdit.d.ts +52 -0
  81. package/dist/editors/ArchbaseMaskEdit.d.ts +79 -0
  82. package/dist/editors/ArchbaseNumberEdit.d.ts +51 -0
  83. package/dist/editors/ArchbaseNumberInput.d.ts +2 -0
  84. package/dist/editors/ArchbaseOperationHoursEditor.d.ts +8 -0
  85. package/dist/editors/ArchbasePasswordEdit.d.ts +44 -0
  86. package/dist/editors/ArchbasePasswordInput.d.ts +2 -0
  87. package/dist/editors/ArchbaseRadio.d.ts +2 -0
  88. package/dist/editors/ArchbaseRadioGroup.d.ts +45 -0
  89. package/dist/editors/ArchbaseRadioItem.d.ts +12 -0
  90. package/dist/editors/ArchbaseRating.d.ts +52 -0
  91. package/dist/editors/ArchbaseRichTextEdit.d.ts +80 -0
  92. package/dist/editors/ArchbaseSelect.context.d.ts +8 -0
  93. package/dist/editors/ArchbaseSelect.d.ts +107 -0
  94. package/dist/editors/ArchbaseSelectItem.d.ts +15 -0
  95. package/dist/editors/ArchbaseSwitch.d.ts +53 -0
  96. package/dist/editors/ArchbaseTextArea.d.ts +47 -0
  97. package/dist/editors/ArchbaseTimeEdit.d.ts +52 -0
  98. package/dist/editors/ArchbaseTimeRangeSelector.d.ts +40 -0
  99. package/dist/editors/ArchbaseTreeSelect.d.ts +65 -0
  100. package/dist/editors/index.d.ts +81 -0
  101. package/dist/feedback/index.d.ts +4 -0
  102. package/dist/filters/ArchbaseCompositeFilters.d.ts +23 -0
  103. package/dist/filters/ArchbaseCompositeFilters.types.d.ts +303 -0
  104. package/dist/filters/ArchbaseCompositeFilters.utils.d.ts +69 -0
  105. package/dist/filters/components/FilterPill.d.ts +5 -0
  106. package/dist/filters/hooks/index.d.ts +4 -0
  107. package/dist/filters/hooks/useArchbaseFilterHistory.d.ts +24 -0
  108. package/dist/filters/hooks/useArchbaseFilterPresets.d.ts +23 -0
  109. package/dist/filters/hooks/useArchbaseFilters.d.ts +32 -0
  110. package/dist/filters/hooks/useArchbaseQuickFilters.d.ts +26 -0
  111. package/dist/filters/index.d.ts +8 -0
  112. package/dist/forms/index.d.ts +3 -0
  113. package/dist/hooks/index.d.ts +5 -0
  114. package/dist/hooks/useArchbaseContainerDimensions.d.ts +4 -0
  115. package/dist/hooks/useArchbaseElementSizeArea.d.ts +6 -0
  116. package/dist/hooks/useArchbaseListContext.d.ts +2 -0
  117. package/dist/hooks/useArchbaseNavigateParams.d.ts +3 -0
  118. package/dist/hooks/useArchbaseVisible.d.ts +2 -0
  119. package/dist/image/ArchbaseImage.d.ts +33 -0
  120. package/dist/image/ArchbaseMicrosoftAvatar.d.ts +7 -0
  121. package/dist/image/editor/components/BasicFilters/BasicFilter.d.ts +9 -0
  122. package/dist/image/editor/components/CropprWrapper/ArchbaseCropperWrapper.d.ts +12 -0
  123. package/dist/image/editor/components/EditImage/ArchbaseEditImage.d.ts +11 -0
  124. package/dist/image/editor/components/Input/Input.d.ts +9 -0
  125. package/dist/image/editor/components/Tab/Tab.d.ts +23 -0
  126. package/dist/image/editor/functions/croppr/box.d.ts +95 -0
  127. package/dist/image/editor/functions/croppr/core.d.ts +121 -0
  128. package/dist/image/editor/functions/croppr/croppr.d.ts +68 -0
  129. package/dist/image/editor/functions/croppr/handle.d.ts +23 -0
  130. package/dist/image/editor/functions/croppr/index.d.ts +2 -0
  131. package/dist/image/editor/functions/croppr/touch.d.ts +10 -0
  132. package/dist/image/editor/functions/image-processing.d.ts +11 -0
  133. package/dist/image/editor/index.d.ts +12 -0
  134. package/dist/image/editor/models/index.models.d.ts +45 -0
  135. package/dist/image/index.d.ts +7 -0
  136. package/dist/image/languages.d.ts +299 -0
  137. package/dist/index.css +1 -0
  138. package/dist/index.d.ts +27 -0
  139. package/dist/index.js +18368 -0
  140. package/dist/jsonschema/ArchbaseJsonSchemaEditor.types.d.ts +131 -0
  141. package/dist/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.context.d.ts +7 -0
  142. package/dist/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.d.ts +9 -0
  143. package/dist/jsonschema/JsonSchemaEditor/advanced-boolean/index.d.ts +2 -0
  144. package/dist/jsonschema/JsonSchemaEditor/advanced-number/index.d.ts +2 -0
  145. package/dist/jsonschema/JsonSchemaEditor/advanced-string/index.d.ts +2 -0
  146. package/dist/jsonschema/JsonSchemaEditor/drop-plus/index.d.ts +10 -0
  147. package/dist/jsonschema/JsonSchemaEditor/index.d.ts +2 -0
  148. package/dist/jsonschema/JsonSchemaEditor/schema-advanced/index.d.ts +6 -0
  149. package/dist/jsonschema/JsonSchemaEditor/schema-array/index.d.ts +8 -0
  150. package/dist/jsonschema/JsonSchemaEditor/schema-item/index.d.ts +11 -0
  151. package/dist/jsonschema/JsonSchemaEditor/schema-object/index.d.ts +7 -0
  152. package/dist/jsonschema/JsonSchemaEditor/schema-root/index.d.ts +8 -0
  153. package/dist/jsonschema/JsonSchemaEditor/utils.d.ts +25 -0
  154. package/dist/jsonschema/JsonSchemaEditor/whoops.d.ts +2 -0
  155. package/dist/jsonschema/index.d.ts +2 -0
  156. package/dist/list/ArchbaseList.context.d.ts +27 -0
  157. package/dist/list/ArchbaseList.d.ts +104 -0
  158. package/dist/list/ArchbaseListItem.d.ts +59 -0
  159. package/dist/list/index.d.ts +8 -0
  160. package/dist/list/treeview/ArchbaseTreeView.d.ts +44 -0
  161. package/dist/list/treeview/ArchbaseTreeView.types.d.ts +40 -0
  162. package/dist/list/treeview/ArchbaseTreeViewItem.d.ts +19 -0
  163. package/dist/list/treeview/index.d.ts +5 -0
  164. package/dist/list-view/ArchbaseListViewTable.d.ts +111 -0
  165. package/dist/list-view/index.d.ts +2 -0
  166. package/dist/markdown/ArchbaseMarkdown.d.ts +23 -0
  167. package/dist/markdown/ArchbaseMarkdown.types.d.ts +181 -0
  168. package/dist/markdown/components/CodeBlock.d.ts +23 -0
  169. package/dist/markdown/components/LinkRenderer.d.ts +16 -0
  170. package/dist/markdown/index.d.ts +11 -0
  171. package/dist/masonry/ArchbaseMasonry.context.d.ts +21 -0
  172. package/dist/masonry/ArchbaseMasonry.d.ts +35 -0
  173. package/dist/masonry/index.d.ts +5 -0
  174. package/dist/navigation/index.d.ts +3 -0
  175. package/dist/notification/ArchbaseAlert.d.ts +22 -0
  176. package/dist/notification/ArchbaseDialog.d.ts +16 -0
  177. package/dist/notification/ArchbaseNotifications.d.ts +5 -0
  178. package/dist/notification/index.d.ts +4 -0
  179. package/dist/onboarding/ArchbaseOnboardingTour.d.ts +99 -0
  180. package/dist/onboarding/index.d.ts +2 -0
  181. package/dist/printer/ArchbaseThermalPrinter.d.ts +27 -0
  182. package/dist/printer/ArchbaseThermalPrinter.types.d.ts +199 -0
  183. package/dist/printer/index.d.ts +9 -0
  184. package/dist/printer/utils/escpos.d.ts +127 -0
  185. package/dist/spreadsheet/ArchbaseSpreadsheetImport.d.ts +4 -0
  186. package/dist/spreadsheet/ArchbaseSpreadsheetImport.types.d.ts +65 -0
  187. package/dist/spreadsheet/index.d.ts +2 -0
  188. package/dist/theme-editor/ArchbaseThemeEditor.d.ts +17 -0
  189. package/dist/theme-editor/ArchbaseThemeEditor.types.d.ts +187 -0
  190. package/dist/theme-editor/index.d.ts +9 -0
  191. package/dist/theme-editor/utils/themeExport.d.ts +198 -0
  192. package/dist/themes/ArchbaseThemeEditor.d.ts +49 -0
  193. package/dist/types/index.d.ts +106 -0
  194. package/dist/video/ArchbaseVideoPlayer.d.ts +18 -0
  195. package/dist/video/ArchbaseVideoPlayer.types.d.ts +200 -0
  196. package/dist/video/hooks/useVideoPlayer.d.ts +58 -0
  197. package/dist/video/index.d.ts +10 -0
  198. package/dist/viewers/ArchbasePDFViewer.annotations.d.ts +20 -0
  199. package/dist/viewers/ArchbasePDFViewer.d.ts +2 -0
  200. package/dist/viewers/ArchbasePDFViewer.toolbar.d.ts +20 -0
  201. package/dist/viewers/ArchbasePDFViewer.types.d.ts +68 -0
  202. package/dist/viewers/file-preview/ArchbaseFilePreviewer.d.ts +19 -0
  203. package/dist/viewers/file-preview/ArchbaseFilePreviewer.types.d.ts +153 -0
  204. package/dist/viewers/file-preview/index.d.ts +13 -0
  205. package/dist/viewers/file-preview/utils/fileTypeDetector.d.ts +33 -0
  206. package/dist/viewers/index.d.ts +5 -0
  207. package/package.json +154 -0
  208. package/src/admin/types.ts +73 -0
  209. package/src/arco.css +6 -0
  210. package/src/buttons/ActionsDemo.tsx +107 -0
  211. package/src/buttons/ArchbaseActionButtons.d.ts.map +1 -0
  212. package/src/buttons/ArchbaseActionButtons.tsx +387 -0
  213. package/src/buttons/index.d.ts.map +1 -0
  214. package/src/buttons/index.ts +7 -0
  215. package/src/charts/ArchbaseTimeline.d.ts.map +1 -0
  216. package/src/charts/ArchbaseTimeline.tsx +332 -0
  217. package/src/charts/index.d.ts.map +1 -0
  218. package/src/charts/index.ts +5 -0
  219. package/src/charts/vis-timeline/ArchbaseVisTimeline.tsx +401 -0
  220. package/src/charts/vis-timeline/ArchbaseVisTimeline.types.ts +294 -0
  221. package/src/charts/vis-timeline/index.ts +36 -0
  222. package/src/charts/vis-timeline/utils/timelineOptions.ts +213 -0
  223. package/src/datagrid/components/index.d.ts.map +1 -0
  224. package/src/datagrid/components/index.tsx +14 -0
  225. package/src/datagrid/components/pagination/grid-pagination.d.ts.map +1 -0
  226. package/src/datagrid/components/pagination/grid-pagination.tsx +150 -0
  227. package/src/datagrid/components/render/archbase-data-grid-item-renderer.tsx +26 -0
  228. package/src/datagrid/components/toolbar/global-search-input.d.ts.map +1 -0
  229. package/src/datagrid/components/toolbar/global-search-input.tsx +118 -0
  230. package/src/datagrid/components/toolbar/grid-toolbar.d.ts.map +1 -0
  231. package/src/datagrid/components/toolbar/grid-toolbar.tsx +106 -0
  232. package/src/datagrid/hooks/index.d.ts.map +1 -0
  233. package/src/datagrid/hooks/index.tsx +18 -0
  234. package/src/datagrid/hooks/use-grid-data-stable-rendering.d.ts.map +1 -0
  235. package/src/datagrid/hooks/use-grid-data-stable-rendering.ts +168 -0
  236. package/src/datagrid/hooks/use-grid-data.d.ts.map +1 -0
  237. package/src/datagrid/hooks/use-grid-data.tsx +598 -0
  238. package/src/datagrid/hooks/use-grid-details-panel.d.ts.map +1 -0
  239. package/src/datagrid/hooks/use-grid-details-panel.ts +316 -0
  240. package/src/datagrid/index.d.ts.map +1 -0
  241. package/src/datagrid/index.tsx +12 -0
  242. package/src/datagrid/main/archbase-data-grid-column.d.ts.map +1 -0
  243. package/src/datagrid/main/archbase-data-grid-column.ts +46 -0
  244. package/src/datagrid/main/archbase-data-grid-formatters.d.ts.map +1 -0
  245. package/src/datagrid/main/archbase-data-grid-formatters.tsx +384 -0
  246. package/src/datagrid/main/archbase-data-grid-pagination.d.ts.map +1 -0
  247. package/src/datagrid/main/archbase-data-grid-pagination.tsx +63 -0
  248. package/src/datagrid/main/archbase-data-grid-toolbar.d.ts.map +1 -0
  249. package/src/datagrid/main/archbase-data-grid-toolbar.tsx +160 -0
  250. package/src/datagrid/main/archbase-data-grid-types.d.ts.map +1 -0
  251. package/src/datagrid/main/archbase-data-grid-types.tsx +327 -0
  252. package/src/datagrid/main/archbase-data-grid-utils.d.ts.map +1 -0
  253. package/src/datagrid/main/archbase-data-grid-utils.ts +494 -0
  254. package/src/datagrid/main/archbase-data-grid.d.ts.map +1 -0
  255. package/src/datagrid/main/archbase-data-grid.tsx +1462 -0
  256. package/src/datagrid/main/archbase-detail-panel-component.d.ts.map +1 -0
  257. package/src/datagrid/main/archbase-detail-panel-component.tsx +186 -0
  258. package/src/datagrid/main/archbase-expand-button.d.ts.map +1 -0
  259. package/src/datagrid/main/archbase-expand-button.tsx +83 -0
  260. package/src/datagrid/main/archbase-grid-popover.d.ts.map +1 -0
  261. package/src/datagrid/main/archbase-grid-popover.tsx +188 -0
  262. package/src/datagrid/main/grid-row-actions.d.ts.map +1 -0
  263. package/src/datagrid/main/grid-row-actions.tsx +97 -0
  264. package/src/datagrid/main/index.d.ts.map +1 -0
  265. package/src/datagrid/main/index.tsx +75 -0
  266. package/src/datagrid/modals/export-data.d.ts.map +1 -0
  267. package/src/datagrid/modals/export-data.tsx +183 -0
  268. package/src/datagrid/modals/export-modal.d.ts.map +1 -0
  269. package/src/datagrid/modals/export-modal.tsx +168 -0
  270. package/src/datagrid/modals/index.d.ts.map +1 -0
  271. package/src/datagrid/modals/index.tsx +6 -0
  272. package/src/datagrid/modals/print-data.d.ts.map +1 -0
  273. package/src/datagrid/modals/print-data.tsx +267 -0
  274. package/src/datagrid/modals/print-modal.d.ts.map +1 -0
  275. package/src/datagrid/modals/print-modal.tsx +200 -0
  276. package/src/datagrid/types/grid-props.d.ts.map +1 -0
  277. package/src/datagrid/types/grid-props.tsx +53 -0
  278. package/src/datagrid/types/index.d.ts.map +1 -0
  279. package/src/datagrid/types/index.tsx +1 -0
  280. package/src/datagrid/utils/formatter.d.ts.map +1 -0
  281. package/src/datagrid/utils/formatter.tsx +308 -0
  282. package/src/datagrid/utils/index.d.ts.map +1 -0
  283. package/src/datagrid/utils/index.tsx +1 -0
  284. package/src/debug/index.d.ts.map +1 -0
  285. package/src/debug/index.ts +4 -0
  286. package/src/debug/jsonpathpicker/ArchbaseJsonPathPicker.css +46 -0
  287. package/src/debug/jsonpathpicker/ArchbaseJsonPathPicker.d.ts.map +1 -0
  288. package/src/debug/jsonpathpicker/ArchbaseJsonPathPicker.tsx +341 -0
  289. package/src/debug/jsonpathpicker/index.d.ts.map +1 -0
  290. package/src/debug/jsonpathpicker/index.ts +1 -0
  291. package/src/debug/jsonview/.eslintrc +5 -0
  292. package/src/debug/jsonview/ArchbaseJsonViewDataRenderer.d.ts.map +1 -0
  293. package/src/debug/jsonview/ArchbaseJsonViewDataRenderer.tsx +206 -0
  294. package/src/debug/jsonview/ArchbaseJsonViewDataTypeDetection.d.ts.map +1 -0
  295. package/src/debug/jsonview/ArchbaseJsonViewDataTypeDetection.ts +31 -0
  296. package/src/debug/jsonview/index.d.ts.map +1 -0
  297. package/src/debug/jsonview/index.tsx +60 -0
  298. package/src/debug/jsonview/styles.module.css +118 -0
  299. package/src/debug/jsonview/styles.module.css.d.ts +4 -0
  300. package/src/debug/objectinspector/ArchbaseDebugInspector.d.ts.map +1 -0
  301. package/src/debug/objectinspector/ArchbaseDebugInspector.tsx +79 -0
  302. package/src/debug/objectinspector/ArchbaseFloatingWindow.css +70 -0
  303. package/src/debug/objectinspector/ArchbaseFloatingWindow.d.ts.map +1 -0
  304. package/src/debug/objectinspector/ArchbaseFloatingWindow.tsx +266 -0
  305. package/src/debug/objectinspector/ArchbaseObjectInspector.d.ts.map +1 -0
  306. package/src/debug/objectinspector/ArchbaseObjectInspector.tsx +21 -0
  307. package/src/debug/objectinspector/index.d.ts.map +1 -0
  308. package/src/debug/objectinspector/index.ts +3 -0
  309. package/src/display/index.d.ts.map +1 -0
  310. package/src/display/index.ts +5 -0
  311. package/src/editors/ArchbaseAsyncMultiSelect.d.ts.map +1 -0
  312. package/src/editors/ArchbaseAsyncMultiSelect.tsx +667 -0
  313. package/src/editors/ArchbaseAsyncSelect.context.d.ts.map +1 -0
  314. package/src/editors/ArchbaseAsyncSelect.context.ts +9 -0
  315. package/src/editors/ArchbaseAsyncSelect.d.ts.map +1 -0
  316. package/src/editors/ArchbaseAsyncSelect.tsx +581 -0
  317. package/src/editors/ArchbaseAvatarEdit.d.ts.map +1 -0
  318. package/src/editors/ArchbaseAvatarEdit.tsx +625 -0
  319. package/src/editors/ArchbaseCheckbox.d.ts.map +1 -0
  320. package/src/editors/ArchbaseCheckbox.tsx +250 -0
  321. package/src/editors/ArchbaseChip.d.ts.map +1 -0
  322. package/src/editors/ArchbaseChip.tsx +233 -0
  323. package/src/editors/ArchbaseChipGroup.d.ts.map +1 -0
  324. package/src/editors/ArchbaseChipGroup.tsx +282 -0
  325. package/src/editors/ArchbaseChipItem.d.ts.map +1 -0
  326. package/src/editors/ArchbaseChipItem.tsx +21 -0
  327. package/src/editors/ArchbaseColorPicker.d.ts.map +1 -0
  328. package/src/editors/ArchbaseColorPicker.tsx +7 -0
  329. package/src/editors/ArchbaseCountdownProgress.d.ts.map +1 -0
  330. package/src/editors/ArchbaseCountdownProgress.tsx +57 -0
  331. package/src/editors/ArchbaseCronExpressionEdit.d.ts.map +1 -0
  332. package/src/editors/ArchbaseCronExpressionEdit.tsx +86 -0
  333. package/src/editors/ArchbaseCronExpressionEditor.d.ts.map +1 -0
  334. package/src/editors/ArchbaseCronExpressionEditor.tsx +133 -0
  335. package/src/editors/ArchbaseDatePicker.tsx +3 -0
  336. package/src/editors/ArchbaseDatePickerEdit.d.ts.map +1 -0
  337. package/src/editors/ArchbaseDatePickerEdit.tsx +785 -0
  338. package/src/editors/ArchbaseDatePickerRange.d.ts.map +1 -0
  339. package/src/editors/ArchbaseDatePickerRange.tsx +142 -0
  340. package/src/editors/ArchbaseDateTimePickerEdit.d.ts.map +1 -0
  341. package/src/editors/ArchbaseDateTimePickerEdit.tsx +259 -0
  342. package/src/editors/ArchbaseDateTimePickerRange.d.ts.map +1 -0
  343. package/src/editors/ArchbaseDateTimePickerRange.tsx +220 -0
  344. package/src/editors/ArchbaseEdit.d.ts.map +1 -0
  345. package/src/editors/ArchbaseEdit.example.tsx +240 -0
  346. package/src/editors/ArchbaseEdit.tsx +325 -0
  347. package/src/editors/ArchbaseFileAttachment.d.ts.map +1 -0
  348. package/src/editors/ArchbaseFileAttachment.tsx +259 -0
  349. package/src/editors/ArchbaseImageEdit.d.ts.map +1 -0
  350. package/src/editors/ArchbaseImageEdit.tsx +255 -0
  351. package/src/editors/ArchbaseJsonEdit.d.ts.map +1 -0
  352. package/src/editors/ArchbaseJsonEdit.tsx +257 -0
  353. package/src/editors/ArchbaseKeyValueEditor.d.ts.map +1 -0
  354. package/src/editors/ArchbaseKeyValueEditor.tsx +180 -0
  355. package/src/editors/ArchbaseLookupEdit.d.ts.map +1 -0
  356. package/src/editors/ArchbaseLookupEdit.tsx +368 -0
  357. package/src/editors/ArchbaseLookupNumber.d.ts.map +1 -0
  358. package/src/editors/ArchbaseLookupNumber.tsx +390 -0
  359. package/src/editors/ArchbaseLookupSelect.d.ts.map +1 -0
  360. package/src/editors/ArchbaseLookupSelect.tsx +225 -0
  361. package/src/editors/ArchbaseMarkdownEdit.tsx +367 -0
  362. package/src/editors/ArchbaseMaskEdit.d.ts.map +1 -0
  363. package/src/editors/ArchbaseMaskEdit.tsx +346 -0
  364. package/src/editors/ArchbaseNumberEdit.d.ts.map +1 -0
  365. package/src/editors/ArchbaseNumberEdit.tsx +626 -0
  366. package/src/editors/ArchbaseNumberInput.tsx +3 -0
  367. package/src/editors/ArchbaseOperationHoursEditor.d.ts.map +1 -0
  368. package/src/editors/ArchbaseOperationHoursEditor.tsx +206 -0
  369. package/src/editors/ArchbasePasswordEdit.d.ts.map +1 -0
  370. package/src/editors/ArchbasePasswordEdit.tsx +265 -0
  371. package/src/editors/ArchbasePasswordInput.tsx +3 -0
  372. package/src/editors/ArchbaseRadio.tsx +3 -0
  373. package/src/editors/ArchbaseRadioGroup.d.ts.map +1 -0
  374. package/src/editors/ArchbaseRadioGroup.tsx +293 -0
  375. package/src/editors/ArchbaseRadioItem.d.ts.map +1 -0
  376. package/src/editors/ArchbaseRadioItem.tsx +14 -0
  377. package/src/editors/ArchbaseRating.d.ts.map +1 -0
  378. package/src/editors/ArchbaseRating.tsx +236 -0
  379. package/src/editors/ArchbaseRichTextEdit.d.ts.map +1 -0
  380. package/src/editors/ArchbaseRichTextEdit.tsx +435 -0
  381. package/src/editors/ArchbaseSelect.context.d.ts.map +1 -0
  382. package/src/editors/ArchbaseSelect.context.ts +9 -0
  383. package/src/editors/ArchbaseSelect.d.ts.map +1 -0
  384. package/src/editors/ArchbaseSelect.tsx +550 -0
  385. package/src/editors/ArchbaseSelectItem.d.ts.map +1 -0
  386. package/src/editors/ArchbaseSelectItem.tsx +18 -0
  387. package/src/editors/ArchbaseSwitch.d.ts.map +1 -0
  388. package/src/editors/ArchbaseSwitch.tsx +266 -0
  389. package/src/editors/ArchbaseTextArea.d.ts.map +1 -0
  390. package/src/editors/ArchbaseTextArea.tsx +263 -0
  391. package/src/editors/ArchbaseTimeEdit.d.ts.map +1 -0
  392. package/src/editors/ArchbaseTimeEdit.tsx +319 -0
  393. package/src/editors/ArchbaseTimeRangeSelector.d.ts.map +1 -0
  394. package/src/editors/ArchbaseTimeRangeSelector.tsx +397 -0
  395. package/src/editors/ArchbaseTreeSelect.d.ts.map +1 -0
  396. package/src/editors/ArchbaseTreeSelect.tsx +434 -0
  397. package/src/editors/index.d.ts.map +1 -0
  398. package/src/editors/index.tsx +121 -0
  399. package/src/editors/intro.mdx +4 -0
  400. package/src/feedback/index.d.ts.map +1 -0
  401. package/src/feedback/index.ts +5 -0
  402. package/src/filters/ArchbaseCompositeFilters.tsx +696 -0
  403. package/src/filters/ArchbaseCompositeFilters.types.ts +402 -0
  404. package/src/filters/ArchbaseCompositeFilters.utils.ts +378 -0
  405. package/src/filters/components/FilterPill.tsx +100 -0
  406. package/src/filters/hooks/index.ts +4 -0
  407. package/src/filters/hooks/useArchbaseFilterHistory.ts +111 -0
  408. package/src/filters/hooks/useArchbaseFilterPresets.ts +157 -0
  409. package/src/filters/hooks/useArchbaseFilters.ts +279 -0
  410. package/src/filters/hooks/useArchbaseQuickFilters.ts +80 -0
  411. package/src/filters/index.ts +55 -0
  412. package/src/forms/index.d.ts.map +1 -0
  413. package/src/forms/index.ts +4 -0
  414. package/src/hooks/index.d.ts.map +1 -0
  415. package/src/hooks/index.ts +5 -0
  416. package/src/hooks/useArchbaseContainerDimensions.d.ts.map +1 -0
  417. package/src/hooks/useArchbaseContainerDimensions.ts +28 -0
  418. package/src/hooks/useArchbaseElementSizeArea.d.ts.map +1 -0
  419. package/src/hooks/useArchbaseElementSizeArea.ts +39 -0
  420. package/src/hooks/useArchbaseListContext.d.ts.map +1 -0
  421. package/src/hooks/useArchbaseListContext.ts +10 -0
  422. package/src/hooks/useArchbaseNavigateParams.d.ts.map +1 -0
  423. package/src/hooks/useArchbaseNavigateParams.ts +17 -0
  424. package/src/hooks/useArchbaseVisible.d.ts.map +1 -0
  425. package/src/hooks/useArchbaseVisible.ts +35 -0
  426. package/src/image/.placeholder +0 -0
  427. package/src/image/ArchbaseImage.d.ts.map +1 -0
  428. package/src/image/ArchbaseImage.tsx +56 -0
  429. package/src/image/ArchbaseMicrosoftAvatar.d.ts.map +1 -0
  430. package/src/image/ArchbaseMicrosoftAvatar.tsx +50 -0
  431. package/src/image/editor/components/BasicFilters/BasicFilter.d.ts.map +1 -0
  432. package/src/image/editor/components/BasicFilters/BasicFilter.tsx +179 -0
  433. package/src/image/editor/components/CropprWrapper/ArchbaseCropper.scss +73 -0
  434. package/src/image/editor/components/CropprWrapper/ArchbaseCropperWrapper.d.ts.map +1 -0
  435. package/src/image/editor/components/CropprWrapper/ArchbaseCropperWrapper.tsx +50 -0
  436. package/src/image/editor/components/EditImage/ArchbaseEditImage.d.ts.map +1 -0
  437. package/src/image/editor/components/EditImage/ArchbaseEditImage.scss +221 -0
  438. package/src/image/editor/components/EditImage/ArchbaseEditImage.tsx +469 -0
  439. package/src/image/editor/components/Input/Input.d.ts.map +1 -0
  440. package/src/image/editor/components/Input/Input.tsx +70 -0
  441. package/src/image/editor/components/Tab/Tab.d.ts.map +1 -0
  442. package/src/image/editor/components/Tab/Tab.tsx +150 -0
  443. package/src/image/editor/components/Tab/TabsStyles.scss +72 -0
  444. package/src/image/editor/functions/croppr/box.d.ts.map +1 -0
  445. package/src/image/editor/functions/croppr/box.ts +272 -0
  446. package/src/image/editor/functions/croppr/core.d.ts.map +1 -0
  447. package/src/image/editor/functions/croppr/core.ts +820 -0
  448. package/src/image/editor/functions/croppr/croppr.d.ts.map +1 -0
  449. package/src/image/editor/functions/croppr/croppr.ts +136 -0
  450. package/src/image/editor/functions/croppr/handle.d.ts.map +1 -0
  451. package/src/image/editor/functions/croppr/handle.ts +75 -0
  452. package/src/image/editor/functions/croppr/index.d.ts.map +1 -0
  453. package/src/image/editor/functions/croppr/index.ts +4 -0
  454. package/src/image/editor/functions/croppr/touch.d.ts.map +1 -0
  455. package/src/image/editor/functions/croppr/touch.ts +41 -0
  456. package/src/image/editor/functions/image-processing.d.ts.map +1 -0
  457. package/src/image/editor/functions/image-processing.ts +202 -0
  458. package/src/image/editor/image_editor_styles.scss +284 -0
  459. package/src/image/editor/index.d.ts.map +1 -0
  460. package/src/image/editor/index.tsx +437 -0
  461. package/src/image/editor/models/index.models.d.ts.map +1 -0
  462. package/src/image/editor/models/index.models.ts +48 -0
  463. package/src/image/index.d.ts.map +1 -0
  464. package/src/image/index.ts +7 -0
  465. package/src/image/intro.mdx +4 -0
  466. package/src/image/languages.d.ts.map +1 -0
  467. package/src/image/languages.ts +302 -0
  468. package/src/index.d.ts.map +1 -0
  469. package/src/index.ts +50 -0
  470. package/src/jsonschema/ArchbaseJsonSchemaEditor.types.d.ts.map +1 -0
  471. package/src/jsonschema/ArchbaseJsonSchemaEditor.types.ts +171 -0
  472. package/src/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.context.d.ts.map +1 -0
  473. package/src/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.context.tsx +8 -0
  474. package/src/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.d.ts.map +1 -0
  475. package/src/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.tsx +99 -0
  476. package/src/jsonschema/JsonSchemaEditor/JsonSchemaEditor.scss +19 -0
  477. package/src/jsonschema/JsonSchemaEditor/advanced-boolean/index.d.ts.map +1 -0
  478. package/src/jsonschema/JsonSchemaEditor/advanced-boolean/index.tsx +33 -0
  479. package/src/jsonschema/JsonSchemaEditor/advanced-number/index.d.ts.map +1 -0
  480. package/src/jsonschema/JsonSchemaEditor/advanced-number/index.tsx +119 -0
  481. package/src/jsonschema/JsonSchemaEditor/advanced-string/index.d.ts.map +1 -0
  482. package/src/jsonschema/JsonSchemaEditor/advanced-string/index.tsx +146 -0
  483. package/src/jsonschema/JsonSchemaEditor/drop-plus/index.d.ts.map +1 -0
  484. package/src/jsonschema/JsonSchemaEditor/drop-plus/index.tsx +80 -0
  485. package/src/jsonschema/JsonSchemaEditor/index.ts +2 -0
  486. package/src/jsonschema/JsonSchemaEditor/schema-advanced/index.d.ts.map +1 -0
  487. package/src/jsonschema/JsonSchemaEditor/schema-advanced/index.tsx +32 -0
  488. package/src/jsonschema/JsonSchemaEditor/schema-array/index.d.ts.map +1 -0
  489. package/src/jsonschema/JsonSchemaEditor/schema-array/index.tsx +164 -0
  490. package/src/jsonschema/JsonSchemaEditor/schema-item/index.d.ts.map +1 -0
  491. package/src/jsonschema/JsonSchemaEditor/schema-item/index.tsx +213 -0
  492. package/src/jsonschema/JsonSchemaEditor/schema-object/index.d.ts.map +1 -0
  493. package/src/jsonschema/JsonSchemaEditor/schema-object/index.tsx +68 -0
  494. package/src/jsonschema/JsonSchemaEditor/schema-root/index.d.ts.map +1 -0
  495. package/src/jsonschema/JsonSchemaEditor/schema-root/index.tsx +103 -0
  496. package/src/jsonschema/JsonSchemaEditor/utils.d.ts.map +1 -0
  497. package/src/jsonschema/JsonSchemaEditor/utils.ts +195 -0
  498. package/src/jsonschema/JsonSchemaEditor/whoops.tsx +79 -0
  499. package/src/jsonschema/index.d.ts.map +1 -0
  500. package/src/jsonschema/index.ts +2 -0
  501. package/src/list/ArchbaseList.context.d.ts.map +1 -0
  502. package/src/list/ArchbaseList.context.ts +28 -0
  503. package/src/list/ArchbaseList.d.ts.map +1 -0
  504. package/src/list/ArchbaseList.tsx +533 -0
  505. package/src/list/ArchbaseListItem.d.ts.map +1 -0
  506. package/src/list/ArchbaseListItem.tsx +161 -0
  507. package/src/list/index.d.ts.map +1 -0
  508. package/src/list/index.ts +9 -0
  509. package/src/list/treeview/ArchbaseTreeView.d.ts.map +1 -0
  510. package/src/list/treeview/ArchbaseTreeView.module.css +66 -0
  511. package/src/list/treeview/ArchbaseTreeView.tsx +657 -0
  512. package/src/list/treeview/ArchbaseTreeView.types.d.ts.map +1 -0
  513. package/src/list/treeview/ArchbaseTreeView.types.tsx +42 -0
  514. package/src/list/treeview/ArchbaseTreeViewItem.d.ts.map +1 -0
  515. package/src/list/treeview/ArchbaseTreeViewItem.tsx +210 -0
  516. package/src/list/treeview/index.d.ts.map +1 -0
  517. package/src/list/treeview/index.ts +5 -0
  518. package/src/list-view/ArchbaseListViewTable.tsx +150 -0
  519. package/src/list-view/index.ts +2 -0
  520. package/src/markdown/ArchbaseMarkdown.tsx +463 -0
  521. package/src/markdown/ArchbaseMarkdown.types.ts +213 -0
  522. package/src/markdown/components/CodeBlock.tsx +197 -0
  523. package/src/markdown/components/LinkRenderer.tsx +98 -0
  524. package/src/markdown/index.ts +29 -0
  525. package/src/masonry/ArchbaseMasonry.context.d.ts.map +1 -0
  526. package/src/masonry/ArchbaseMasonry.context.ts +24 -0
  527. package/src/masonry/ArchbaseMasonry.d.ts.map +1 -0
  528. package/src/masonry/ArchbaseMasonry.tsx +156 -0
  529. package/src/masonry/index.d.ts.map +1 -0
  530. package/src/masonry/index.ts +5 -0
  531. package/src/navigation/index.d.ts.map +1 -0
  532. package/src/navigation/index.ts +4 -0
  533. package/src/notification/ArchbaseAlert.d.ts.map +1 -0
  534. package/src/notification/ArchbaseAlert.tsx +77 -0
  535. package/src/notification/ArchbaseDialog.d.ts.map +1 -0
  536. package/src/notification/ArchbaseDialog.tsx +212 -0
  537. package/src/notification/ArchbaseNotifications.d.ts.map +1 -0
  538. package/src/notification/ArchbaseNotifications.tsx +64 -0
  539. package/src/notification/index.d.ts.map +1 -0
  540. package/src/notification/index.ts +4 -0
  541. package/src/notification/intro.mdx +4 -0
  542. package/src/onboarding/ArchbaseOnboardingTour.tsx +147 -0
  543. package/src/onboarding/index.ts +2 -0
  544. package/src/printer/ArchbaseThermalPrinter.tsx +465 -0
  545. package/src/printer/ArchbaseThermalPrinter.types.ts +221 -0
  546. package/src/printer/index.ts +54 -0
  547. package/src/printer/utils/escpos.ts +531 -0
  548. package/src/spreadsheet/ArchbaseSpreadsheetImport.tsx +223 -0
  549. package/src/spreadsheet/ArchbaseSpreadsheetImport.types.ts +66 -0
  550. package/src/spreadsheet/index.ts +10 -0
  551. package/src/theme-editor/ArchbaseThemeEditor.tsx +728 -0
  552. package/src/theme-editor/ArchbaseThemeEditor.types.ts +207 -0
  553. package/src/theme-editor/index.ts +45 -0
  554. package/src/theme-editor/utils/themeExport.ts +351 -0
  555. package/src/themes/.placeholder +0 -0
  556. package/src/themes/ArchbaseThemeEditor.d.ts.map +1 -0
  557. package/src/themes/ArchbaseThemeEditor.tsx +110 -0
  558. package/src/treeviews.scss +80 -0
  559. package/src/types/index.d.ts.map +1 -0
  560. package/src/types/index.ts +115 -0
  561. package/src/video/ArchbaseVideoPlayer.tsx +706 -0
  562. package/src/video/ArchbaseVideoPlayer.types.ts +221 -0
  563. package/src/video/hooks/useVideoPlayer.ts +362 -0
  564. package/src/video/index.ts +28 -0
  565. package/src/viewers/ArchbasePDFViewer.annotations.tsx +423 -0
  566. package/src/viewers/ArchbasePDFViewer.toolbar.tsx +218 -0
  567. package/src/viewers/ArchbasePDFViewer.tsx +317 -0
  568. package/src/viewers/ArchbasePDFViewer.types.ts +85 -0
  569. package/src/viewers/file-preview/ArchbaseFilePreviewer.tsx +756 -0
  570. package/src/viewers/file-preview/ArchbaseFilePreviewer.types.ts +186 -0
  571. package/src/viewers/file-preview/index.ts +43 -0
  572. package/src/viewers/file-preview/utils/fileTypeDetector.ts +317 -0
  573. package/src/viewers/index.ts +17 -0
@@ -0,0 +1,1462 @@
1
+ // @ts-nocheck
2
+ // ArchbaseDataGrid.tsx - Implementação completa com Detail Panel
3
+ /**
4
+ * ArchbaseDataGrid — grid reativo ligado ao DataSource com toolbar, exportação e painéis de detalhe.
5
+ * @status stable
6
+ */
7
+ import React, {
8
+ useState,
9
+ useEffect,
10
+ useRef,
11
+ useImperativeHandle,
12
+ useMemo,
13
+ useCallback
14
+ } from 'react'
15
+ import {
16
+ DataGrid,
17
+ GridColDef,
18
+ GridRowSelectionModel,
19
+ useGridApiRef,
20
+ GridColumnVisibilityModel,
21
+ GridCellParams,
22
+ GridRowId
23
+ } from '@mui/x-data-grid'
24
+ import { ptBR } from '@mui/x-data-grid/locales'
25
+ import { ActionIcon, Box, Group, Title, useMantineColorScheme } from '@mantine/core'
26
+ import { Children, isValidElement } from 'react'
27
+ import { ExportConfig, exportData } from '../modals/export-data'
28
+ import { PrintConfig, printData } from '../modals/print-data'
29
+ import { ExportModal } from '../modals/export-modal'
30
+ import { PrintModal } from '../modals/print-modal'
31
+ import { getAlignmentByDataType, getRendererByDataType } from './archbase-data-grid-formatters'
32
+
33
+ // Importar componentes e tipos relacionados
34
+ import {
35
+ ArchbaseDataGridProps,
36
+ ArchbaseDataGridColumnProps,
37
+ Columns,
38
+ ArchbaseDataGridRef
39
+ } from './archbase-data-grid-types'
40
+ import {
41
+ safeGetRowId,
42
+ buildFilterExpression,
43
+ getRgbValues,
44
+ getInitialSortModel,
45
+ convertColumnsToFilterDefinitions,
46
+ convertActiveFiltersToFilterModel
47
+ } from './archbase-data-grid-utils'
48
+ import { ArchbaseDataGridToolbar } from './archbase-data-grid-toolbar'
49
+ import { ArchbaseDataGridPagination } from './archbase-data-grid-pagination'
50
+
51
+ // Importar componentes específicos do Detail Panel
52
+ import {
53
+ ArchbaseDetailPanel,
54
+ ArchbaseDetailModal,
55
+ ArchbaseDetailDrawer
56
+ } from './archbase-detail-panel-component'
57
+ import { ArchbaseExpandButton, createExpandColumn } from './archbase-expand-button'
58
+ import {
59
+ useDetailPanels,
60
+ useDetailPanelAutoClose,
61
+ useDetailPanelPositions,
62
+ useAvailableSpace
63
+ } from '../hooks/use-grid-details-panel'
64
+ import { IconX } from '@tabler/icons-react'
65
+ import { useArchbaseTheme } from '@archbase/core'
66
+ import { useArchbaseAppContext } from '@archbase/core'
67
+ import { DataSourceEvent, DataSourceEventNames } from '@archbase/data'
68
+
69
+
70
+ // Constante para o limite máximo de pageSize permitido na versão MIT do DataGrid
71
+ const MAX_PAGE_SIZE_MIT = 100
72
+
73
+ /**
74
+ * Helper para detectar se o dataSource é V2
75
+ * V2 tem métodos específicos como appendToFieldArray e updateFieldArrayItem
76
+ */
77
+ const isDataSourceV2 = (ds: any): boolean => {
78
+ return ds && ('appendToFieldArray' in ds || 'updateFieldArrayItem' in ds || 'getRecords' in ds);
79
+ }
80
+
81
+ /**
82
+ * Helper para obter registros do dataSource (compatível com V1 e V2)
83
+ */
84
+ const getRecordsFromDataSource = <T,>(ds: any): T[] => {
85
+ if (isDataSourceV2(ds)) {
86
+ return ds.getRecords?.() || [];
87
+ }
88
+ return ds.browseRecords?.() || [];
89
+ }
90
+
91
+ /**
92
+ * Helper para obter opções do dataSource (V1 only, V2 retorna objeto vazio)
93
+ */
94
+ const getDataSourceOptions = (ds: any): any => {
95
+ if (isDataSourceV2(ds)) {
96
+ return {};
97
+ }
98
+ return ds.getOptions?.() || {};
99
+ }
100
+
101
+ /**
102
+ * Helper para obter página atual (compatível com V1 e V2)
103
+ */
104
+ const getCurrentPageFromDataSource = (ds: any): number => {
105
+ // Ambos V1 e V2 agora têm getCurrentPage()
106
+ const page = ds.getCurrentPage?.() ?? 0;
107
+ console.log('[getCurrentPageFromDataSource] isV2:', isDataSourceV2(ds), 'page:', page);
108
+ return page;
109
+ }
110
+
111
+ /**
112
+ * Componente ArchbaseDataGrid - Grid avançada baseada no MUI X DataGrid
113
+ * com toolbar e paginação extraídos para fora da grid para evitar problemas de foco
114
+ *
115
+ * Suporta tanto ArchbaseDataSource (V1) quanto ArchbaseRemoteDataSourceV2 (V2)
116
+ */
117
+ function ArchbaseDataGrid<T extends object = any, ID = any>(props: ArchbaseDataGridProps<T, ID>) {
118
+ const {
119
+ dataSource,
120
+ enableColumnResizing = true,
121
+ enableRowNumbers = true,
122
+ enableRowSelection = true,
123
+ enableRowActions = true,
124
+ enableColumnFilterModes = true,
125
+ enableGlobalFilter = true,
126
+ enableTopToolbar = true,
127
+ enableTopToolbarActions = true,
128
+ manualFiltering = true,
129
+ manualPagination = true,
130
+ manualSorting = true,
131
+ isLoading = false,
132
+ isError = false,
133
+ error,
134
+ height = '100%',
135
+ width = '100%',
136
+ pageSize = 15,
137
+ pageIndex = 0,
138
+ children,
139
+ onSelectedRowsChanged,
140
+ onCellDoubleClick,
141
+ getRowId,
142
+ renderRowActions,
143
+ renderToolbarActions,
144
+ renderToolbarInternalActions,
145
+ allowColumnFilters = true,
146
+ allowExportData = true,
147
+ allowPrintData = true,
148
+ withBorder = true,
149
+ withColumnBorders = true,
150
+ highlightOnHover = true,
151
+ striped = false,
152
+ className = '',
153
+ printTitle = 'Data Grid Print',
154
+ logoPrint,
155
+ globalDateFormat = 'dd/MM/yyyy',
156
+ csvOptions,
157
+ toolbarAlignment = 'right',
158
+ positionActionsColumn = 'first',
159
+ toolbarLeftContent,
160
+ columnAutoWidth = false,
161
+ rowHeight = 52,
162
+ paginationLabels,
163
+ onExport,
164
+ onPrint,
165
+ showProgressBars = true,
166
+ variant = 'filled',
167
+ fontSize,
168
+ cellPadding,
169
+ renderTopToolbar,
170
+ tableHeadCellPadding,
171
+ bottomToolbarMinHeight,
172
+ gridRef,
173
+ // Propriedades para o detail panel
174
+ renderDetailPanel,
175
+ allowMultipleDetailPanels = false,
176
+ detailPanelMinHeight = 200,
177
+ detailPanelStyle,
178
+ detailPanelClassName,
179
+ onDetailPanelChange,
180
+ detailPanelDisplayMode = 'auto', // 'auto', 'inline', 'modal', 'drawer'
181
+ detailPanelTitle = 'Detalhes',
182
+ detailPanelPosition = 'right',
183
+ detailPanelSize = 'md',
184
+ showPagination = true,
185
+ // Props de segurança
186
+ resourceName,
187
+ resourceDescription,
188
+ columnSecurityOptions,
189
+ // Props para ArchbaseCompositeFilters
190
+ useCompositeFilters = false,
191
+ filterDefinitions: externalFilterDefinitions,
192
+ activeFilters: externalActiveFilters,
193
+ onFiltersChange: externalOnFiltersChange,
194
+ hideMuiFilters = false,
195
+ } = props
196
+ const theme = useArchbaseTheme()
197
+ const { colorScheme } = useMantineColorScheme();
198
+ const apiRef = useGridApiRef()
199
+ const appContext = useArchbaseAppContext()
200
+
201
+ // 🔐 HOOK DE SEGURANÇA INTERNO
202
+ const useGridSecurity = (resourceName?: string) => {
203
+ const [securityState, setSecurityState] = useState({
204
+ isAvailable: false,
205
+ hasPermission: (permission?: string) => true,
206
+ registerAction: (action?: string, description?: string) => {},
207
+ });
208
+
209
+ useEffect(() => {
210
+ // Só ativa segurança SE resourceName fornecido
211
+ if (!resourceName) return;
212
+
213
+ try {
214
+ // Tentar usar o contexto de segurança se disponível
215
+ // Por enquanto, apenas simula que sempre tem permissão
216
+ console.debug(`Grid solicitou segurança para '${resourceName}', mas integração ainda em desenvolvimento.`);
217
+ setSecurityState({
218
+ isAvailable: false, // Desabilita por enquanto
219
+ hasPermission: (permission?: string) => true,
220
+ registerAction: (action?: string, description?: string) => {},
221
+ });
222
+ } catch (error) {
223
+ console.debug('Módulo de segurança não disponível');
224
+ }
225
+ }, [resourceName]);
226
+
227
+ return securityState;
228
+ };
229
+
230
+ const security = useGridSecurity(resourceName);
231
+
232
+ // Referência para o contêiner da grid (para detectar cliques e scroll)
233
+ const gridContainerRef = useRef<HTMLDivElement>(null)
234
+
235
+ // Referências para os botões de expansão
236
+ const expandButtonRefs = useRef<Map<GridRowId, React.RefObject<HTMLButtonElement>>>(new Map())
237
+
238
+ // Detectar versão do DataSource
239
+ const isV2 = isDataSourceV2(dataSource);
240
+
241
+ // Estados para dados e funcionalidades da grid
242
+ const [rows, setRows] = useState<T[]>(() => getRecordsFromDataSource<T>(dataSource))
243
+ const [columnVisibilityModel, setColumnVisibilityModel] = useState<GridColumnVisibilityModel>({})
244
+ const [exportModalOpen, setExportModalOpen] = useState<boolean>(false)
245
+ const [printModalOpen, setPrintModalOpen] = useState<boolean>(false)
246
+ const [isLoadingInternal, setIsLoadingInternal] = useState<boolean>(false)
247
+ const [rowSelection, setRowSelection] = useState<GridRowSelectionModel>([])
248
+ const [selectedRows, setSelectedRows] = useState<T[]>([])
249
+ const [totalRecords, setTotalRecords] = useState<number>(() => {
250
+ const total = dataSource.getGrandTotalRecords();
251
+ return Number.isFinite(total) ? Math.max(0, total) : 0;
252
+ });
253
+
254
+ // Estado para paginação com limitação de tamanho de página (MIT version)
255
+ const [paginationModel, setPaginationModel] = useState({
256
+ page: Number.isFinite(getCurrentPageFromDataSource(dataSource)) ? getCurrentPageFromDataSource(dataSource) : pageIndex,
257
+ pageSize: Math.min(
258
+ Number.isFinite(dataSource?.getPageSize?.()) ? dataSource.getPageSize() : pageSize,
259
+ MAX_PAGE_SIZE_MIT
260
+ )
261
+ });
262
+
263
+ const [sortModel, setSortModel] = useState(() => getInitialSortModel(dataSource))
264
+ const dsOptions = getDataSourceOptions(dataSource);
265
+ const [filterModel, setFilterModel] = useState({
266
+ items: dsOptions.originFilter || [],
267
+ quickFilterValues: dsOptions.originGlobalFilter ? [dsOptions.originGlobalFilter] : []
268
+ })
269
+
270
+ // Estado interno para ArchbaseCompositeFilters (se não controlado externamente)
271
+ const [internalActiveFilters, setInternalActiveFilters] = useState<typeof externalActiveFilters>([])
272
+ const activeFilters = externalActiveFilters !== undefined ? externalActiveFilters : internalActiveFilters
273
+
274
+ // Usar os hooks personalizados para gerenciar os painéis de detalhes
275
+ const {
276
+ expandedRowIds,
277
+ detailPanelHeight,
278
+ detailPanelRefs,
279
+ toggleExpand,
280
+ closeDetailPanel,
281
+ closeAllDetailPanels,
282
+ expandDetailPanel,
283
+ setExpandedRowIds
284
+ } = useDetailPanels({
285
+ allowMultipleDetailPanels,
286
+ onDetailPanelChange,
287
+ detailPanelMinHeight
288
+ })
289
+
290
+ // Hook para fechar painéis ao clicar fora ou fazer scroll
291
+ useDetailPanelAutoClose({
292
+ containerRef: gridContainerRef,
293
+ expandedRowIds,
294
+ detailPanelRefs,
295
+ closeAllDetailPanels
296
+ })
297
+
298
+ // Verificar espaço disponível
299
+ const shouldUseModal = useAvailableSpace({
300
+ containerRef: gridContainerRef,
301
+ rows,
302
+ getRowId,
303
+ safeGetRowId,
304
+ rowHeight,
305
+ detailPanelMinHeight
306
+ })
307
+ // Refs para controle de operações internas
308
+ const syncInProgress = useRef<boolean>(false)
309
+ const keyboardNavDebounceTimer = useRef<NodeJS.Timeout | null>(null)
310
+ const skipNextFocusSync = useRef<boolean>(false)
311
+
312
+ // Limpar timer ao desmontar
313
+ useEffect(() => {
314
+ return () => {
315
+ if (keyboardNavDebounceTimer.current) {
316
+ clearTimeout(keyboardNavDebounceTimer.current)
317
+ }
318
+ }
319
+ }, [])
320
+
321
+ // Configurar a sincronização entre o Grid e o DataSource usando o evento cellFocusIn
322
+ useEffect(() => {
323
+ const handleCellFocusChange = (params: any) => {
324
+ // Se já estamos em processo de sincronização ou devemos pular, ignorar
325
+ if (syncInProgress.current || skipNextFocusSync.current) {
326
+ skipNextFocusSync.current = false
327
+ return
328
+ }
329
+
330
+ // Se o foco for em uma célula válida (não header)
331
+ if (params.id !== undefined && params.field) {
332
+ try {
333
+ // Obter os dados da linha a partir do id
334
+ const row = apiRef.current.getRow(params.id)
335
+
336
+ if (row) {
337
+ // Sincronizar com o dataSource
338
+ syncInProgress.current = true
339
+
340
+ // Ir para o registro correspondente no DataSource (V1 e V2)
341
+ if (dataSource.gotoRecordByData) {
342
+ dataSource.gotoRecordByData(row)
343
+ }
344
+
345
+ // Resetar flag após um breve delay
346
+ setTimeout(() => {
347
+ syncInProgress.current = false
348
+ }, 100)
349
+ }
350
+ } catch (error) {
351
+ console.error('[FOCUS] Erro ao sincronizar com DataSource:', error)
352
+ syncInProgress.current = false
353
+ }
354
+ }
355
+ }
356
+
357
+ // Registrar o listener para o evento de mudança de foco
358
+ let focusInSubscription: any = null
359
+
360
+ if (apiRef.current) {
361
+ focusInSubscription = apiRef.current.subscribeEvent('cellFocusIn', handleCellFocusChange)
362
+ }
363
+
364
+ // Limpar a inscrição quando o componente for desmontado
365
+ return () => {
366
+ if (focusInSubscription) {
367
+ focusInSubscription()
368
+ }
369
+ }
370
+ }, [apiRef, dataSource])
371
+
372
+ // Handler para clique duplo em célula
373
+ const handleCellDoubleClick = (params: GridCellParams) => {
374
+ if (onCellDoubleClick) {
375
+ // Obter os dados da linha
376
+ const rowData = params.row as T
377
+
378
+ onCellDoubleClick({
379
+ id: params.id,
380
+ columnName: params.field,
381
+ rowData
382
+ })
383
+ }
384
+ }
385
+
386
+ // Handler para mudança na seleção da linha
387
+ const handleSelectionModelChange = (newSelectionModel: GridRowSelectionModel) => {
388
+ // Se já estamos em processo de sincronização, ignorar
389
+ if (syncInProgress.current) return
390
+
391
+ skipNextFocusSync.current = true
392
+ setRowSelection(newSelectionModel)
393
+
394
+ // Mapear IDs selecionados para objetos de dados
395
+ const selected: T[] = []
396
+ newSelectionModel.forEach((id) => {
397
+ const rowData = rows.find((row) => {
398
+ try {
399
+ return String(safeGetRowId(row, getRowId)) === String(id)
400
+ } catch (e) {
401
+ return false
402
+ }
403
+ })
404
+
405
+ if (rowData) {
406
+ selected.push(rowData)
407
+ }
408
+ })
409
+
410
+ setSelectedRows(selected)
411
+
412
+ // Notificar sobre a mudança de seleção
413
+ if (onSelectedRowsChanged) {
414
+ onSelectedRowsChanged(selected)
415
+ }
416
+
417
+ // Se temos exatamente uma linha, atualizar o dataSource (V1 e V2)
418
+ if (selected.length === 1 && dataSource.gotoRecordByData) {
419
+ syncInProgress.current = true
420
+
421
+ try {
422
+ // Tentar ir para o registro no dataSource
423
+ dataSource.gotoRecordByData(selected[0])
424
+ } catch (error) {
425
+ console.error('[SELECTION] Erro ao atualizar dataSource:', error)
426
+ }
427
+
428
+ // Resetar a flag após um breve delay
429
+ setTimeout(() => {
430
+ syncInProgress.current = false
431
+ }, 100)
432
+ }
433
+ }
434
+
435
+ // Métodos para exportação e impressão com modais
436
+ const handleExportClick = () => {
437
+ setExportModalOpen(true)
438
+ }
439
+
440
+ const handlePrintClick = () => {
441
+ setPrintModalOpen(true)
442
+ }
443
+
444
+ const handleExportConfirm = (exportConfig: ExportConfig) => {
445
+ exportData(rows, columns, exportConfig)
446
+ setExportModalOpen(false)
447
+ }
448
+
449
+ const handlePrintConfirm = (printConfig: PrintConfig) => {
450
+ printData(rows, columns, printConfig)
451
+ setPrintModalOpen(false)
452
+ }
453
+
454
+ // Métodos para atualização de dados
455
+ const handleRefresh = () => {
456
+ // V2: Agora também chama refreshData no dataSource
457
+ if (isV2) {
458
+ // Construir a expressão de filtro
459
+ const filter = buildFilterExpression(filterModel, columns)
460
+ const originGlobalFilter =
461
+ filterModel.quickFilterValues && filterModel.quickFilterValues.length > 0
462
+ ? filterModel.quickFilterValues[0]
463
+ : ''
464
+
465
+ console.log('[REFRESH V2] Refresh com filtro global:', originGlobalFilter);
466
+
467
+ setIsLoadingInternal(true)
468
+ ;(dataSource as any).refreshData?.({
469
+ currentPage: paginationModel.page,
470
+ pageSize: paginationModel.pageSize,
471
+ filter: filter,
472
+ originFilter: filterModel.items,
473
+ originGlobalFilter: originGlobalFilter
474
+ })
475
+ closeAllDetailPanels()
476
+ return
477
+ }
478
+
479
+ // V1: Comportamento original
480
+ const options = getDataSourceOptions(dataSource)
481
+
482
+ // Reutilizar o filtro atual
483
+ options.filter = buildFilterExpression(filterModel, columns)
484
+ options.originFilter = filterModel.items
485
+
486
+ // Garantir que o filtro global seja preservado
487
+ options.originGlobalFilter =
488
+ filterModel.quickFilterValues && filterModel.quickFilterValues.length > 0
489
+ ? filterModel.quickFilterValues[0]
490
+ : ''
491
+
492
+ console.log('[REFRESH] Refresh com filtro global:', options.originGlobalFilter);
493
+
494
+ // Indicar que estamos carregando
495
+ setIsLoadingInternal(true);
496
+
497
+ // Aplicar a atualização com os filtros
498
+ (dataSource as any).refreshData?.(options);
499
+
500
+ // Fechar todos os painéis de detalhes
501
+ closeAllDetailPanels()
502
+ }
503
+
504
+ const handlePaginationChange = (newPaginationModel: { page: number; pageSize: number }) => {
505
+ console.log('[PAGINATION] Mudou pagination model ', newPaginationModel.page, newPaginationModel.pageSize, 'isV2:', isV2)
506
+ // Garantir que o pageSize não exceda o limite
507
+ const safePageSize = Math.min(newPaginationModel.pageSize, MAX_PAGE_SIZE_MIT)
508
+
509
+ setPaginationModel({
510
+ page: newPaginationModel.page,
511
+ pageSize: safePageSize
512
+ })
513
+
514
+ // V2: Agora também chama refreshData para recarregar dados
515
+ if (isV2) {
516
+ console.log('[PAGINATION V2] Chamando refreshData com page:', newPaginationModel.page, 'size:', safePageSize)
517
+ setIsLoadingInternal(true)
518
+ ;(dataSource as any).refreshData?.({
519
+ currentPage: newPaginationModel.page,
520
+ pageSize: safePageSize
521
+ })
522
+ closeAllDetailPanels()
523
+ return
524
+ }
525
+
526
+ // V1: Comportamento original
527
+ const options = getDataSourceOptions(dataSource)
528
+ options.currentPage = newPaginationModel.page
529
+ options.pageSize = safePageSize
530
+
531
+ setIsLoadingInternal(true)
532
+ ;(dataSource as any).refreshData?.(options)
533
+
534
+ // Fechar todos os painéis de detalhes ao mudar de página
535
+ closeAllDetailPanels()
536
+ }
537
+
538
+ const handleSortModelChange = (newSortModel: any) => {
539
+ setSortModel(newSortModel)
540
+
541
+ // V2: Agora também chama refreshData para recarregar dados com nova ordenação
542
+ if (isV2) {
543
+ const sortFields = newSortModel.map((sort: any) => `${sort.field}:${sort.sort}`)
544
+ setIsLoadingInternal(true)
545
+ ;(dataSource as any).refreshData?.({
546
+ currentPage: paginationModel.page,
547
+ pageSize: paginationModel.pageSize,
548
+ sort: sortFields
549
+ })
550
+ closeAllDetailPanels()
551
+ return
552
+ }
553
+
554
+ // V1: Comportamento original
555
+ const options = getDataSourceOptions(dataSource)
556
+ options.sort = newSortModel.map((sort: any) => `${sort.field}:${sort.sort}`)
557
+ options.originSort = newSortModel
558
+
559
+ setIsLoadingInternal(true)
560
+ ;(dataSource as any).refreshData?.(options)
561
+
562
+ // Fechar todos os painéis de detalhes ao mudar a ordenação
563
+ closeAllDetailPanels()
564
+ }
565
+
566
+ const handleFilterModelChange = (newFilterModel: any) => {
567
+ // Atualizar o estado do filtro primeiro
568
+ setFilterModel(newFilterModel)
569
+
570
+ // Certificar que estamos usando o valor mais recente
571
+ console.log('[FILTER] Aplicando filtro:', newFilterModel)
572
+
573
+ // V2: Agora também chama refreshData para recarregar dados com filtro
574
+ if (isV2) {
575
+ setPaginationModel((prev) => ({ ...prev, page: 0 }))
576
+
577
+ // Construir a expressão de filtro
578
+ const filter = buildFilterExpression(newFilterModel, columns)
579
+ const originGlobalFilter =
580
+ newFilterModel.quickFilterValues && newFilterModel.quickFilterValues.length > 0
581
+ ? newFilterModel.quickFilterValues[0]
582
+ : ''
583
+
584
+ console.log('[FILTER V2] filter construído:', filter, 'tipo:', typeof filter)
585
+ console.log('[FILTER V2] originGlobalFilter:', originGlobalFilter)
586
+
587
+ setIsLoadingInternal(true)
588
+ ;(dataSource as any).refreshData?.({
589
+ currentPage: 0,
590
+ pageSize: paginationModel.pageSize,
591
+ filter: filter,
592
+ originFilter: newFilterModel.items,
593
+ originGlobalFilter: originGlobalFilter
594
+ })
595
+ closeAllDetailPanels()
596
+ return
597
+ }
598
+
599
+ // V1: Comportamento original
600
+ const options = getDataSourceOptions(dataSource)
601
+
602
+ // Construir a expressão de filtro
603
+ options.filter = buildFilterExpression(newFilterModel, columns)
604
+ options.originFilter = newFilterModel.items
605
+
606
+ // Salvar o valor do filtro global para uso posterior
607
+ options.originGlobalFilter =
608
+ newFilterModel.quickFilterValues && newFilterModel.quickFilterValues.length > 0
609
+ ? newFilterModel.quickFilterValues[0]
610
+ : ''
611
+
612
+ console.log('[FILTER] Filtro global definido como:', options.originGlobalFilter)
613
+
614
+ // Voltar para a primeira página ao aplicar filtro
615
+ options.currentPage = 0
616
+ setPaginationModel((prev) => ({ ...prev, page: 0 }))
617
+
618
+ // Indicar que estamos carregando
619
+ setIsLoadingInternal(true)
620
+
621
+ // Aplicar o filtro no dataSource
622
+ ;(dataSource as any).refreshData?.(options)
623
+
624
+ // Fechar todos os painéis de detalhes ao filtrar
625
+ closeAllDetailPanels()
626
+ }
627
+
628
+ // Handler para mudança nos filtros compostos (ArchbaseCompositeFilters)
629
+ const handleCompositeFiltersChange = useCallback((filters: any[], rsql?: string) => {
630
+ console.log('[COMPOSITE FILTERS] Filtros alterados:', filters, 'RSQL:', rsql)
631
+
632
+ // Atualizar estado interno se não controlado externamente
633
+ if (externalActiveFilters === undefined) {
634
+ setInternalActiveFilters(filters)
635
+ }
636
+
637
+ // Chamar callback externo se fornecido
638
+ if (externalOnFiltersChange) {
639
+ externalOnFiltersChange(filters, rsql)
640
+ }
641
+
642
+ // Se tivermos RSQL, converter para filterModel do MUI e aplicar
643
+ if (rsql || (filters && filters.length > 0)) {
644
+ // Converter activeFilters para filterModel
645
+ const newFilterModel = convertActiveFiltersToFilterModel(filters || [])
646
+
647
+ // Atualizar o filterModel para manter sincronia com o MUI
648
+ setFilterModel(newFilterModel)
649
+
650
+ // Aplicar o filtro no dataSource
651
+ if (isV2) {
652
+ setPaginationModel((prev) => ({ ...prev, page: 0 }))
653
+
654
+ setIsLoadingInternal(true)
655
+ ;(dataSource as any).refreshData?.({
656
+ currentPage: 0,
657
+ pageSize: paginationModel.pageSize,
658
+ filter: rsql,
659
+ originFilter: newFilterModel.items,
660
+ originGlobalFilter: undefined // RSQL substitui o filtro global
661
+ })
662
+ closeAllDetailPanels()
663
+ return
664
+ }
665
+
666
+ // V1: Comportamento original
667
+ const options = getDataSourceOptions(dataSource)
668
+ options.filter = rsql
669
+ options.originFilter = newFilterModel.items
670
+ options.currentPage = 0
671
+
672
+ setIsLoadingInternal(true)
673
+ ;(dataSource as any).refreshData?.(options)
674
+
675
+ closeAllDetailPanels()
676
+ } else {
677
+ // Se não há filtros, limpar
678
+ setFilterModel({ items: [], quickFilterValues: [] })
679
+
680
+ if (isV2) {
681
+ setIsLoadingInternal(true)
682
+ ;(dataSource as any).refreshData?.({
683
+ currentPage: 0,
684
+ pageSize: paginationModel.pageSize,
685
+ filter: undefined,
686
+ originFilter: [],
687
+ originGlobalFilter: undefined
688
+ })
689
+ closeAllDetailPanels()
690
+ return
691
+ }
692
+
693
+ const options = getDataSourceOptions(dataSource)
694
+ options.filter = undefined
695
+ options.originFilter = []
696
+
697
+ setIsLoadingInternal(true)
698
+ ;(dataSource as any).refreshData?.(options)
699
+
700
+ closeAllDetailPanels()
701
+ }
702
+ }, [externalActiveFilters, externalOnFiltersChange, isV2, dataSource, paginationModel.pageSize])
703
+
704
+ // Registrar funções de exportação e impressão nos callbacks, se fornecidos
705
+ useEffect(() => {
706
+ if (onExport) {
707
+ onExport(handleExportClick)
708
+ }
709
+ if (onPrint) {
710
+ onPrint(handlePrintClick)
711
+ }
712
+ }, [onExport, onPrint])
713
+
714
+ // Expor métodos via ref - Correção para tipos
715
+ useImperativeHandle<any, ArchbaseDataGridRef<T>>(
716
+ gridRef,
717
+ () => ({
718
+ refreshData: handleRefresh,
719
+ getSelectedRows: () => selectedRows,
720
+ clearSelection: () => {
721
+ setRowSelection([])
722
+ setSelectedRows([])
723
+ },
724
+ exportData: handleExportClick,
725
+ printData: handlePrintClick,
726
+ // Métodos adicionais para o detail panel
727
+ expandRow: (rowId: GridRowId) => expandDetailPanel(rowId),
728
+ collapseRow: (rowId: GridRowId) => closeDetailPanel(rowId),
729
+ collapseAllRows: closeAllDetailPanels,
730
+ getExpandedRows: () => Array.from(expandedRowIds)
731
+ }),
732
+ [selectedRows, expandedRowIds, expandDetailPanel, closeDetailPanel, closeAllDetailPanels]
733
+ )
734
+
735
+ // Configurar estilos personalizados para o grid
736
+ const getThemedStyles = () => {
737
+ return {
738
+ root: {
739
+ border: withBorder
740
+ ? `1px solid ${theme.colors.gray[colorScheme === 'dark' ? 8 : 3]}`
741
+ : '0',
742
+ borderRadius: theme.radius.sm,
743
+ overflow: 'hidden', // Garante que o conteúdo respeite o border-radius
744
+ backgroundColor: colorScheme === 'dark' ? theme.colors.dark[6] : theme.white,
745
+ color: colorScheme === 'dark' ? theme.colors.gray[0] : theme.colors.dark[9],
746
+ fontSize:
747
+ typeof fontSize === 'string' &&
748
+ ['xs', 'sm', 'md', 'lg', 'xl'].includes(fontSize as string)
749
+ ? theme.fontSizes[fontSize as 'xs' | 'sm' | 'md' | 'lg' | 'xl']
750
+ : theme.fontSizes.sm,
751
+
752
+ // Estilos dos cabeçalhos
753
+ '& .MuiDataGrid-columnHeaders': {
754
+ backgroundColor: colorScheme === 'dark' ? theme.colors.dark[7] : theme.white,
755
+ color:
756
+ colorScheme === 'dark'
757
+ ? theme.colors.gray[0]
758
+ : theme.colors[theme.primaryColor][6],
759
+ fontWeight: 600
760
+ },
761
+
762
+ // Estilos das células
763
+ '& .MuiDataGrid-cell': {
764
+ borderRight: withColumnBorders
765
+ ? `1px solid ${theme.colors.gray[colorScheme === 'dark' ? 7 : 3]}`
766
+ : 'none',
767
+ padding: typeof cellPadding === 'number' ? `${cellPadding}px` : cellPadding || '4px',
768
+ color: colorScheme === 'dark' ? theme.colors.gray[0] : theme.colors.dark[9]
769
+ },
770
+
771
+ // Estilos das linhas
772
+ '& .MuiDataGrid-row': {
773
+ backgroundColor: colorScheme === 'dark' ? theme.colors.dark[6] : theme.white,
774
+ color: colorScheme === 'dark' ? theme.colors.gray[0] : theme.colors.dark[9],
775
+ '&:hover': {
776
+ backgroundColor: highlightOnHover
777
+ ? colorScheme === 'dark'
778
+ ? theme.colors.dark[5]
779
+ : theme.colors.gray[1]
780
+ : 'inherit'
781
+ },
782
+ '&.Mui-selected': {
783
+ backgroundColor: `rgba(${getRgbValues(
784
+ theme.colors[theme.primaryColor][colorScheme === 'dark' ? 9 : 1]
785
+ )}, ${colorScheme === 'dark' ? 0.8 : 0.1})`,
786
+ '&:hover': {
787
+ backgroundColor: `rgba(${getRgbValues(
788
+ theme.colors[theme.primaryColor][colorScheme === 'dark' ? 8 : 2]
789
+ )}, ${colorScheme === 'dark' ? 0.4 : 0.15})`
790
+ }
791
+ },
792
+ '&:nth-of-type(even)': {
793
+ backgroundColor: striped
794
+ ? colorScheme === 'dark'
795
+ ? theme.colors.dark[5]
796
+ : theme.colors.gray[0]
797
+ : 'inherit'
798
+ }
799
+ },
800
+
801
+ // Melhorando a visibilidade do checkbox
802
+ '& .MuiCheckbox-root': {
803
+ color: colorScheme === 'dark' ? theme.colors.gray[3] : theme.colors.dark[6],
804
+ '&.Mui-checked': {
805
+ color:
806
+ colorScheme === 'dark'
807
+ ? theme.colors[theme.primaryColor][5]
808
+ : theme.colors[theme.primaryColor][7]
809
+ }
810
+ },
811
+
812
+ // Células selecionadas (diferente da célula com foco)
813
+ '& .MuiDataGrid-cell.MuiDataGrid-cell--selected': {
814
+ backgroundColor: 'transparent', // Remover destaque padrão do MUI
815
+ color: colorScheme === 'dark' ? theme.colors.gray[0] : theme.colors.dark[9],
816
+ outline: 'none'
817
+ },
818
+
819
+ '& .MuiDataGrid-cell:focus': {
820
+ backgroundColor: theme.colors[theme.primaryColor][6],
821
+ color: theme.white
822
+ },
823
+
824
+ // Estilos específicos para o painel de detalhes
825
+ '& .detail-panel-container': {
826
+ borderTop: `1px solid ${theme.colors.gray[colorScheme === 'dark' ? 7 : 3]}`,
827
+ backgroundColor:
828
+ colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[0],
829
+ padding: theme.spacing.md,
830
+ width: '100%'
831
+ },
832
+
833
+ '& .MuiDataGrid-virtualScroller': {
834
+ paddingBottom: '14px !important'
835
+ }
836
+ }
837
+ }
838
+ }
839
+
840
+ // Calcular a altura total da grid, incluindo os painéis de detalhes
841
+ const gridHeight = useMemo(() => {
842
+ // Se a altura for uma string (e.g., '100%'), retorna a string diretamente
843
+ if (typeof height === 'string') {
844
+ return height
845
+ }
846
+
847
+ // Se a altura for um número, ajusta para incluir a altura dos painéis de detalhes
848
+ return Math.max(height as number, (height as number) + detailPanelHeight)
849
+ }, [height, detailPanelHeight])
850
+
851
+ // Extrai as colunas dos children
852
+ const columns = useMemo(() => {
853
+ const columnsDefs: GridColDef[] = []
854
+
855
+ // Objeto para armazenar metadados personalizados
856
+ const columnMetadata = {} as Record<string, any>
857
+
858
+ // Adiciona coluna de expansão se renderDetailPanel estiver disponível
859
+ if (renderDetailPanel) {
860
+ columnsDefs.push(createExpandColumn(expandedRowIds, toggleExpand, expandButtonRefs.current))
861
+ }
862
+
863
+ // Adiciona coluna de ações se necessário
864
+ if (enableRowActions && renderRowActions) {
865
+ const actionsColumn :any = {
866
+ field: 'actions',
867
+ headerName: 'Ações',
868
+ type: 'string' as const,
869
+ sortable: false,
870
+ filterable: false,
871
+ width: 120,
872
+ renderCell: (params) => renderRowActions(params.row as T)
873
+ }
874
+
875
+ // Adicionar no início ou no final conforme a configuração
876
+ if (positionActionsColumn === 'first') {
877
+ columnsDefs.unshift(actionsColumn)
878
+ } else {
879
+ columnsDefs.push(actionsColumn)
880
+ }
881
+
882
+ // Adicionar aos metadados também
883
+ columnMetadata['actions'] = {
884
+ enableGlobalFilter: false
885
+ }
886
+ }
887
+
888
+ // Extrai definições de colunas dos children com SEGURANÇA
889
+ Children.forEach(children, (child) => {
890
+ if ((isValidElement(child) && child.type === Columns)) {
891
+ Children.forEach((child.props as any).children, (column) => {
892
+ if (isValidElement(column)) {
893
+ // Tratamos column.props como desconhecido e fornecemos tipagem explícita
894
+ const columnProps = column.props as ArchbaseDataGridColumnProps<any>
895
+
896
+ // 🔐 VERIFICAR SEGURANÇA DA COLUNA
897
+ const permissionName = columnProps.viewPermission ?
898
+ (columnSecurityOptions?.permissionPrefix ?
899
+ `${columnSecurityOptions.permissionPrefix}${columnProps.viewPermission}` :
900
+ columnProps.viewPermission) :
901
+ undefined;
902
+
903
+ const hasColumnPermission = !security.isAvailable ||
904
+ !permissionName ||
905
+ security.hasPermission(permissionName);
906
+
907
+ // SE NÃO TEM PERMISSÃO E deve ocultar completamente
908
+ if (!hasColumnPermission && columnProps.hideWhenNoPermission) {
909
+ return; // Pula esta coluna completamente
910
+ }
911
+
912
+ if (columnProps.visible !== false) {
913
+ // Auto-registrar permissão se solicitado
914
+ if (security.isAvailable &&
915
+ columnProps.autoRegisterPermission !== false &&
916
+ permissionName) {
917
+ security.registerAction(
918
+ permissionName,
919
+ `Visualizar coluna ${columnProps.header}`
920
+ );
921
+ }
922
+
923
+ // Armazenar metadados personalizados
924
+ columnMetadata[columnProps.dataField] = {
925
+ enableGlobalFilter: columnProps.enableGlobalFilter,
926
+ dataType: columnProps.dataType
927
+ }
928
+
929
+ // Obter o renderizador adequado para o tipo de dados
930
+ const originalRenderer = getRendererByDataType(columnProps.dataType, columnProps.render, {
931
+ maskOptions: columnProps.maskOptions,
932
+ dateFormat: appContext?.dateFormat || globalDateFormat,
933
+ dateTimeFormat: appContext?.dateTimeFormat,
934
+ timeFormat: 'HH:mm:ss',
935
+ enumValues: columnProps.enumValues,
936
+ decimalPlaces: 2 // Padrão para campos percentuais ou decimais
937
+ })
938
+
939
+ // 🔐 CRIAR RENDERIZADOR SEGURO
940
+ const secureRenderer = (params: any) => {
941
+ // Se não tem permissão, mostrar fallback
942
+ if (!hasColumnPermission) {
943
+ const fallback = columnProps.fallbackContent ||
944
+ columnSecurityOptions?.defaultFallback ||
945
+ '***';
946
+ return typeof fallback === 'string' ?
947
+ <span style={{ color: '#999', fontStyle: 'italic' }}>{fallback}</span> :
948
+ fallback;
949
+ }
950
+
951
+ // Se tem permissão, renderizar normalmente
952
+ return originalRenderer(params);
953
+ };
954
+
955
+ // Obter o alinhamento adequado para o tipo de dados
956
+ const alignment = getAlignmentByDataType(columnProps.dataType, columnProps.align)
957
+
958
+ columnsDefs.push({
959
+ field: columnProps.dataField,
960
+ headerName: columnProps.header,
961
+ width: columnProps.size || 150,
962
+ minWidth: columnProps.minSize,
963
+ maxWidth: columnProps.maxSize,
964
+ sortable: columnProps.enableSorting !== false,
965
+ filterable: columnProps.enableColumnFilter !== false,
966
+ editable: false,
967
+ flex: columnAutoWidth ? 1 : undefined,
968
+ // 🔐 Usar o renderizador seguro
969
+ renderCell: (params) => {
970
+ return (
971
+ <div
972
+ style={{
973
+ width: '100%',
974
+ display: 'flex',
975
+ justifyContent:
976
+ alignment === 'left'
977
+ ? 'flex-start'
978
+ : alignment === 'right'
979
+ ? 'flex-end'
980
+ : 'center',
981
+ alignItems: 'center'
982
+ }}
983
+ >
984
+ {secureRenderer({
985
+ getValue: () => params.value,
986
+ row: params.row
987
+ })}
988
+ </div>
989
+ )
990
+ },
991
+ valueGetter: (value, row, column) => {
992
+ // Suporte para caminhos aninhados (user.address.street)
993
+ if (columnProps.dataField.includes('.')) {
994
+ const parts = columnProps.dataField.split('.')
995
+ let result = row
996
+ for (const part of parts) {
997
+ if (result && typeof result === 'object') {
998
+ result = result[part]
999
+ } else {
1000
+ return undefined
1001
+ }
1002
+ }
1003
+ return result
1004
+ }
1005
+ return row[columnProps.dataField]
1006
+ }
1007
+ })
1008
+ }
1009
+ }
1010
+ })
1011
+ }
1012
+ })
1013
+
1014
+ // Adicionar metadados às colunas de forma segura
1015
+ columnsDefs.forEach((col) => {
1016
+ const metadata = columnMetadata[col.field]
1017
+ if (metadata) {
1018
+ ;(col as any).enableGlobalFilter = metadata.enableGlobalFilter
1019
+ ;(col as any).dataType = metadata.dataType
1020
+ }
1021
+ })
1022
+
1023
+ return columnsDefs
1024
+ }, [
1025
+ children,
1026
+ enableRowActions,
1027
+ columnAutoWidth,
1028
+ renderRowActions,
1029
+ appContext?.dateFormat,
1030
+ appContext?.dateTimeFormat,
1031
+ globalDateFormat,
1032
+ positionActionsColumn,
1033
+ renderDetailPanel,
1034
+ expandedRowIds,
1035
+ toggleExpand,
1036
+ // Dependências de segurança
1037
+ security,
1038
+ columnSecurityOptions
1039
+ ])
1040
+
1041
+ // Gerar automaticamente as definições de filtro a partir das colunas
1042
+ const autoGeneratedFilterDefinitions = useMemo(() => {
1043
+ if (externalFilterDefinitions) {
1044
+ return externalFilterDefinitions
1045
+ }
1046
+ return convertColumnsToFilterDefinitions(columns, {
1047
+ excludeColumns: ['actions', 'id'],
1048
+ onlyFilterable: true
1049
+ })
1050
+ }, [columns, externalFilterDefinitions])
1051
+
1052
+ // Listener para eventos do DataSource
1053
+ useEffect(() => {
1054
+ const handleDataSourceEvent = (event: DataSourceEvent<T>) => {
1055
+ // Quando os dados são atualizados
1056
+ if (event.type === DataSourceEventNames.refreshData) {
1057
+ setRows(getRecordsFromDataSource<T>(dataSource));
1058
+
1059
+ // Validar valores da paginação
1060
+ const currentPage = Number.isFinite(getCurrentPageFromDataSource(dataSource))
1061
+ ? getCurrentPageFromDataSource(dataSource)
1062
+ : 0;
1063
+
1064
+ const pageSize = Number.isFinite(dataSource.getPageSize?.())
1065
+ ? Math.min(Math.max(1, dataSource.getPageSize()), MAX_PAGE_SIZE_MIT)
1066
+ : 10;
1067
+
1068
+ setPaginationModel({
1069
+ page: currentPage,
1070
+ pageSize: pageSize
1071
+ });
1072
+
1073
+ // Validar o total de registros
1074
+ const grandTotal = Number.isFinite(dataSource.getGrandTotalRecords?.())
1075
+ ? Math.max(0, dataSource.getGrandTotalRecords())
1076
+ : 0;
1077
+
1078
+ setTotalRecords(grandTotal);
1079
+ setIsLoadingInternal(false);
1080
+
1081
+ // Fechar todos os painéis quando os dados são atualizados
1082
+ closeAllDetailPanels();
1083
+ }
1084
+ // Quando os dados são modificados
1085
+ else if (
1086
+ event.type === DataSourceEventNames.dataChanged ||
1087
+ event.type === DataSourceEventNames.afterRemove ||
1088
+ event.type === DataSourceEventNames.afterSave ||
1089
+ event.type === DataSourceEventNames.afterAppend ||
1090
+ event.type === DataSourceEventNames.afterCancel
1091
+ ) {
1092
+ setRows(getRecordsFromDataSource<T>(dataSource));
1093
+
1094
+ // Validar valores da paginação
1095
+ const currentPage = Number.isFinite(getCurrentPageFromDataSource(dataSource))
1096
+ ? getCurrentPageFromDataSource(dataSource)
1097
+ : 0;
1098
+
1099
+ const pageSize = Number.isFinite(dataSource.getPageSize?.())
1100
+ ? Math.min(Math.max(1, dataSource.getPageSize()), MAX_PAGE_SIZE_MIT)
1101
+ : 10;
1102
+
1103
+ setPaginationModel({
1104
+ page: currentPage,
1105
+ pageSize: pageSize
1106
+ });
1107
+
1108
+ // Validar o total de registros
1109
+ const grandTotal = Number.isFinite(dataSource.getGrandTotalRecords?.())
1110
+ ? Math.max(0, dataSource.getGrandTotalRecords())
1111
+ : 0;
1112
+
1113
+ setTotalRecords(grandTotal);
1114
+ setIsLoadingInternal(false);
1115
+
1116
+ // Fechar todos os painéis quando os dados são modificados
1117
+ closeAllDetailPanels();
1118
+ }
1119
+ // Quando o registro atual do dataSource muda
1120
+ else if (event.type === DataSourceEventNames.afterScroll) {
1121
+ // Ignorar se estamos em um processo de sincronização iniciado pela grid
1122
+ if (syncInProgress.current) return
1123
+
1124
+ const currentRecord = dataSource.getCurrentRecord()
1125
+ if (currentRecord) {
1126
+ try {
1127
+ const currentId = safeGetRowId(currentRecord, getRowId)
1128
+
1129
+ if (currentId !== undefined) {
1130
+ // Encontrar a primeira coluna disponível
1131
+ const firstField = columns[0]?.field
1132
+
1133
+ if (firstField && apiRef.current) {
1134
+ // Iniciar o processo de sincronização
1135
+ syncInProgress.current = true
1136
+
1137
+ try {
1138
+ // Tentar atualizar a seleção para refletir o registro atual
1139
+ const newSelection = [currentId]
1140
+ setRowSelection(newSelection)
1141
+
1142
+ // Encontrar o objeto de linha e atualizá-lo na lista de linhas selecionadas
1143
+ const rowData = rows.find(
1144
+ (row) => String(safeGetRowId(row, getRowId)) === String(currentId)
1145
+ )
1146
+
1147
+ if (rowData) {
1148
+ setSelectedRows([rowData])
1149
+
1150
+ if (onSelectedRowsChanged) {
1151
+ onSelectedRowsChanged([rowData])
1152
+ }
1153
+ }
1154
+
1155
+ // Opcional: também atualizar o foco para a célula
1156
+ setTimeout(() => {
1157
+ try {
1158
+ apiRef.current.scrollToIndexes({
1159
+ rowIndex: rows.findIndex(
1160
+ (row) => String(safeGetRowId(row, getRowId)) === String(currentId)
1161
+ )
1162
+ })
1163
+ apiRef.current.setCellFocus(currentId, firstField)
1164
+ } catch (error) {
1165
+ console.error('[DATASOURCE] Erro ao ajustar foco:', error)
1166
+ }
1167
+
1168
+ // Resetar a flag de sincronização
1169
+ syncInProgress.current = false
1170
+ }, 100)
1171
+ } catch (error) {
1172
+ console.error('[DATASOURCE] Erro ao processar afterScroll:', error)
1173
+ syncInProgress.current = false
1174
+ }
1175
+ }
1176
+ }
1177
+ } catch (error) {
1178
+ console.error('[DATASOURCE] Erro ao processar afterScroll:', error)
1179
+ syncInProgress.current = false
1180
+ }
1181
+ }
1182
+ }
1183
+ }
1184
+
1185
+ // Adicionar listener ao dataSource
1186
+ dataSource.addListener(handleDataSourceEvent)
1187
+
1188
+ // Cleanup: remover o listener quando o componente for desmontado
1189
+ return () => {
1190
+ dataSource.removeListener(handleDataSourceEvent)
1191
+ }
1192
+ }, [dataSource, getRowId, columns, rows, apiRef, onSelectedRowsChanged, closeAllDetailPanels])
1193
+
1194
+ // Criar os modais para exportação e impressão
1195
+ const modalColumns = useMemo(() => {
1196
+ return columns.map((col) => ({
1197
+ id: col.field,
1198
+ title: col.headerName || col.field
1199
+ }))
1200
+ }, [columns])
1201
+
1202
+ const renderFixedDetailPanel = () => {
1203
+ if (!renderDetailPanel || expandedRowIds.size === 0) return null
1204
+
1205
+ // Pegar apenas o primeiro rowId expandido
1206
+ const rowId = Array.from(expandedRowIds)[0]
1207
+ const rowData = rows.find((row) => String(safeGetRowId(row, getRowId)) === String(rowId))
1208
+
1209
+ if (!rowData) return null
1210
+
1211
+ // Determinar o título do painel
1212
+ const panelTitle =
1213
+ typeof detailPanelTitle === 'function' ? detailPanelTitle(rowId, rowData) : detailPanelTitle
1214
+
1215
+ // Gerar o conteúdo do painel usando a função renderDetailPanel
1216
+ const detailContent = renderDetailPanel({ row: rowData })
1217
+
1218
+ return (
1219
+ <div
1220
+ key={`fixed-detail-panel-${rowId}`}
1221
+ ref={(el) => {
1222
+ if (el) detailPanelRefs.current.set(rowId, el)
1223
+ }}
1224
+ style={{
1225
+ width: '100%',
1226
+ borderBottom: `1px solid ${theme.colors.gray[colorScheme === 'dark' ? 7 : 3]}`,
1227
+ marginBottom: '8px',
1228
+ zIndex: 2
1229
+ }}
1230
+ >
1231
+ <Box
1232
+ className={`detail-panel-container ${detailPanelClassName || ''}`}
1233
+ style={{
1234
+ padding: 8,
1235
+ backgroundColor:
1236
+ colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[0],
1237
+ borderTop: `1px solid ${theme.colors.gray[colorScheme === 'dark' ? 7 : 3]}`,
1238
+ width: '100%',
1239
+ ...(detailPanelStyle || {})
1240
+ }}
1241
+ >
1242
+ <Group justify="apart" mb="xs">
1243
+ <Title order={4} style={{ fontSize: '1rem', fontWeight: 500 }}>
1244
+ {panelTitle}
1245
+ </Title>
1246
+ <ActionIcon onClick={() => closeDetailPanel(rowId)} size="sm" color="gray">
1247
+ <IconX size={16} />
1248
+ </ActionIcon>
1249
+ </Group>
1250
+
1251
+ <Box>{detailContent}</Box>
1252
+ </Box>
1253
+ </div>
1254
+ )
1255
+ }
1256
+
1257
+ const renderFloatingDetailPanels = () => {
1258
+ if (!renderDetailPanel || expandedRowIds.size === 0) return null
1259
+
1260
+ return Array.from(expandedRowIds).map((rowId) => {
1261
+ const rowData = rows.find((row) => String(safeGetRowId(row, getRowId)) === String(rowId))
1262
+ if (!rowData) return null
1263
+
1264
+ // Determinar o título do painel
1265
+ const panelTitle =
1266
+ typeof detailPanelTitle === 'function' ? detailPanelTitle(rowId, rowData) : detailPanelTitle
1267
+
1268
+ // Renderizar de acordo com o modo explicitamente definido
1269
+ // Sem conversão automática de drawer para modal
1270
+ if (detailPanelDisplayMode === 'modal') {
1271
+ return (
1272
+ <ArchbaseDetailModal
1273
+ key={`detail-modal-${rowId}`}
1274
+ rowId={rowId}
1275
+ rowData={rowData}
1276
+ renderDetailPanel={renderDetailPanel}
1277
+ onClose={closeDetailPanel}
1278
+ theme={theme}
1279
+ className={detailPanelClassName}
1280
+ style={detailPanelStyle}
1281
+ opened={expandedRowIds.has(rowId)}
1282
+ title={panelTitle}
1283
+ />
1284
+ )
1285
+ } else if (detailPanelDisplayMode === 'drawer') {
1286
+ return (
1287
+ <ArchbaseDetailDrawer
1288
+ key={`detail-drawer-${rowId}`}
1289
+ rowId={rowId}
1290
+ rowData={rowData}
1291
+ renderDetailPanel={renderDetailPanel}
1292
+ onClose={closeDetailPanel}
1293
+ theme={theme}
1294
+ className={detailPanelClassName}
1295
+ style={detailPanelStyle}
1296
+ opened={expandedRowIds.has(rowId)}
1297
+ title={panelTitle}
1298
+ position={detailPanelPosition}
1299
+ size={detailPanelSize}
1300
+ />
1301
+ )
1302
+ } else if (detailPanelDisplayMode === 'auto') {
1303
+ // No modo auto, escolher entre modal e inline baseado no shouldUseModal
1304
+ if (shouldUseModal) {
1305
+ return (
1306
+ <ArchbaseDetailModal
1307
+ key={`detail-modal-${rowId}`}
1308
+ rowId={rowId}
1309
+ rowData={rowData}
1310
+ renderDetailPanel={renderDetailPanel}
1311
+ onClose={closeDetailPanel}
1312
+ theme={theme}
1313
+ className={detailPanelClassName}
1314
+ style={detailPanelStyle}
1315
+ opened={expandedRowIds.has(rowId)}
1316
+ title={panelTitle}
1317
+ />
1318
+ )
1319
+ }
1320
+ // Se shouldUseModal for false no modo auto, não renderizamos nada aqui
1321
+ // porque renderFixedDetailPanel já cuidará disso
1322
+ return null
1323
+ }
1324
+
1325
+ // Caso default: não renderizar nada (inline será tratado por renderFixedDetailPanel)
1326
+ return null
1327
+ })
1328
+ }
1329
+
1330
+ // Renderização do componente com toolbar e paginação extraídas
1331
+ return (
1332
+ <Box
1333
+ className={`archbase-data-grid ${className}`}
1334
+ ref={gridContainerRef}
1335
+ style={{
1336
+ height: gridHeight,
1337
+ width: width,
1338
+ position: 'relative',
1339
+ color: colorScheme === 'dark' ? theme.colors.gray[0] : theme.colors.dark[9],
1340
+ display: 'flex',
1341
+ flexDirection: 'column',
1342
+ overflow: 'hidden',
1343
+ }}
1344
+ >
1345
+ {/* Toolbar extraída para fora da grid */}
1346
+ {enableTopToolbar && (
1347
+ <ArchbaseDataGridToolbar
1348
+ dataSource={dataSource}
1349
+ filterModel={filterModel}
1350
+ enableGlobalFilter={enableGlobalFilter}
1351
+ enableTopToolbarActions={enableTopToolbarActions}
1352
+ allowExportData={allowExportData}
1353
+ allowPrintData={allowPrintData}
1354
+ toolbarAlignment={toolbarAlignment}
1355
+ toolbarLeftContent={toolbarLeftContent}
1356
+ renderToolbarActions={renderToolbarActions}
1357
+ renderToolbarInternalActions={renderToolbarInternalActions}
1358
+ theme={theme}
1359
+ onFilterModelChange={handleFilterModelChange}
1360
+ onRefresh={handleRefresh}
1361
+ onExport={handleExportClick}
1362
+ onPrint={handlePrintClick}
1363
+ apiRef={apiRef}
1364
+ children={children}
1365
+ // Props para ArchbaseCompositeFilters
1366
+ useCompositeFilters={useCompositeFilters}
1367
+ filterDefinitions={autoGeneratedFilterDefinitions}
1368
+ activeFilters={activeFilters}
1369
+ onFiltersChange={handleCompositeFiltersChange}
1370
+ hideMuiFilters={hideMuiFilters}
1371
+ />
1372
+ )}
1373
+
1374
+ {/* Detail Panel fixo (apenas no modo inline ou auto com espaço suficiente) */}
1375
+ {(detailPanelDisplayMode === 'inline' ||
1376
+ (detailPanelDisplayMode === 'auto' && !shouldUseModal)) &&
1377
+ renderFixedDetailPanel()}
1378
+
1379
+ {/* Grid sem toolbar interna */}
1380
+ <Box style={{ flex: 1, overflow: 'hidden', position: 'relative' }}>
1381
+ <DataGrid
1382
+ apiRef={apiRef}
1383
+ rows={rows}
1384
+ density="compact"
1385
+ columns={columns}
1386
+ loading={isLoadingInternal || isLoading}
1387
+ pagination
1388
+ paginationMode="server"
1389
+ filterMode="server"
1390
+ sortingMode="server"
1391
+ rowCount={totalRecords}
1392
+ paginationModel={paginationModel}
1393
+ onPaginationModelChange={handlePaginationChange}
1394
+ sortModel={sortModel}
1395
+ onSortModelChange={handleSortModelChange}
1396
+ filterModel={filterModel}
1397
+ onFilterModelChange={handleFilterModelChange}
1398
+ rowHeight={rowHeight}
1399
+ checkboxSelection={enableRowSelection}
1400
+ rowSelectionModel={rowSelection}
1401
+ columnVisibilityModel={columnVisibilityModel}
1402
+ onRowSelectionModelChange={handleSelectionModelChange}
1403
+ onCellDoubleClick={handleCellDoubleClick}
1404
+ onColumnVisibilityModelChange={setColumnVisibilityModel}
1405
+ getRowId={(row) => safeGetRowId(row, getRowId) || ''}
1406
+ sx={getThemedStyles().root}
1407
+ disableColumnFilter={!allowColumnFilters}
1408
+ disableColumnMenu={true}
1409
+ slots={{
1410
+ // Removemos os slots de toolbar e paginação pois eles agora estão fora da grid
1411
+ toolbar: null,
1412
+ pagination: null
1413
+ }}
1414
+ // Adicionando internacionalização em português
1415
+ localeText={ptBR.components.MuiDataGrid.defaultProps.localeText}
1416
+ // Configurações importantes para separar foco de seleção
1417
+ disableRowSelectionOnClick={true} // NÃO selecionar linha ao clicar na célula
1418
+ isRowSelectable={(params) => (enableRowSelection ? true : false)}
1419
+ />
1420
+ </Box>
1421
+
1422
+ {/* Paginação extraída para fora da grid */}
1423
+ {showPagination?<ArchbaseDataGridPagination
1424
+ paginationModel={paginationModel}
1425
+ totalRecords={totalRecords}
1426
+ onPaginationModelChange={handlePaginationChange}
1427
+ paginationLabels={paginationLabels}
1428
+ bottomToolbarMinHeight={bottomToolbarMinHeight}
1429
+ theme={theme}
1430
+ />:null}
1431
+
1432
+ {/* Painéis de detalhes nos modos não-inline (modal/drawer) */}
1433
+ {renderFloatingDetailPanels()}
1434
+
1435
+ {/* Modais de exportação e impressão */}
1436
+ <ExportModal
1437
+ opened={exportModalOpen}
1438
+ onClose={() => setExportModalOpen(false)}
1439
+ onExport={handleExportConfirm}
1440
+ columns={modalColumns}
1441
+ defaultConfig={{
1442
+ filename: printTitle || 'export',
1443
+ dateFormat: globalDateFormat
1444
+ }}
1445
+ />
1446
+
1447
+ <PrintModal
1448
+ opened={printModalOpen}
1449
+ onClose={() => setPrintModalOpen(false)}
1450
+ onPrint={handlePrintConfirm}
1451
+ columns={modalColumns}
1452
+ defaultConfig={{
1453
+ title: printTitle,
1454
+ orientation: 'landscape',
1455
+ pageSize: 'A4'
1456
+ }}
1457
+ />
1458
+ </Box>
1459
+ )
1460
+ }
1461
+
1462
+ export default ArchbaseDataGrid