@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.
- package/dist/admin/types.d.ts +65 -0
- package/dist/archbase-components-3.0.0.tgz +0 -0
- package/dist/buttons/ActionsDemo.d.ts +2 -0
- package/dist/buttons/ArchbaseActionButtons.d.ts +61 -0
- package/dist/buttons/index.d.ts +2 -0
- package/dist/charts/ArchbaseTimeline.d.ts +24 -0
- package/dist/charts/index.d.ts +3 -0
- package/dist/charts/vis-timeline/ArchbaseVisTimeline.d.ts +9 -0
- package/dist/charts/vis-timeline/ArchbaseVisTimeline.types.d.ts +284 -0
- package/dist/charts/vis-timeline/index.d.ts +9 -0
- package/dist/charts/vis-timeline/utils/timelineOptions.d.ts +68 -0
- package/dist/datagrid/components/index.d.ts +6 -0
- package/dist/datagrid/components/pagination/grid-pagination.d.ts +7 -0
- package/dist/datagrid/components/render/archbase-data-grid-item-renderer.d.ts +10 -0
- package/dist/datagrid/components/toolbar/global-search-input.d.ts +16 -0
- package/dist/datagrid/components/toolbar/grid-toolbar.d.ts +19 -0
- package/dist/datagrid/hooks/index.d.ts +3 -0
- package/dist/datagrid/hooks/use-grid-data-stable-rendering.d.ts +15 -0
- package/dist/datagrid/hooks/use-grid-data.d.ts +32 -0
- package/dist/datagrid/hooks/use-grid-details-panel.d.ts +51 -0
- package/dist/datagrid/index.d.ts +6 -0
- package/dist/datagrid/main/archbase-data-grid-column.d.ts +26 -0
- package/dist/datagrid/main/archbase-data-grid-formatters.d.ts +57 -0
- package/dist/datagrid/main/archbase-data-grid-pagination.d.ts +8 -0
- package/dist/datagrid/main/archbase-data-grid-toolbar.d.ts +7 -0
- package/dist/datagrid/main/archbase-data-grid-types.d.ts +252 -0
- package/dist/datagrid/main/archbase-data-grid-utils.d.ts +45 -0
- package/dist/datagrid/main/archbase-data-grid.d.ts +9 -0
- package/dist/datagrid/main/archbase-detail-panel-component.d.ts +52 -0
- package/dist/datagrid/main/archbase-expand-button.d.ts +22 -0
- package/dist/datagrid/main/archbase-grid-popover.d.ts +37 -0
- package/dist/datagrid/main/grid-row-actions.d.ts +15 -0
- package/dist/datagrid/main/index.d.ts +21 -0
- package/dist/datagrid/modals/export-data.d.ts +13 -0
- package/dist/datagrid/modals/export-modal.d.ts +9 -0
- package/dist/datagrid/modals/index.d.ts +6 -0
- package/dist/datagrid/modals/print-data.d.ts +16 -0
- package/dist/datagrid/modals/print-modal.d.ts +9 -0
- package/dist/datagrid/types/grid-props.d.ts +48 -0
- package/dist/datagrid/types/index.d.ts +1 -0
- package/dist/datagrid/utils/formatter.d.ts +39 -0
- package/dist/datagrid/utils/index.d.ts +1 -0
- package/dist/debug/index.d.ts +4 -0
- package/dist/debug/jsonpathpicker/ArchbaseJsonPathPicker.d.ts +37 -0
- package/dist/debug/jsonpathpicker/index.d.ts +1 -0
- package/dist/debug/jsonview/ArchbaseJsonViewDataRenderer.d.ts +34 -0
- package/dist/debug/jsonview/ArchbaseJsonViewDataTypeDetection.d.ts +8 -0
- package/dist/debug/jsonview/index.d.ts +11 -0
- package/dist/debug/objectinspector/ArchbaseDebugInspector.d.ts +23 -0
- package/dist/debug/objectinspector/ArchbaseFloatingWindow.d.ts +24 -0
- package/dist/debug/objectinspector/ArchbaseObjectInspector.d.ts +6 -0
- package/dist/debug/objectinspector/index.d.ts +3 -0
- package/dist/display/index.d.ts +4 -0
- package/dist/editors/ArchbaseAsyncMultiSelect.d.ts +112 -0
- package/dist/editors/ArchbaseAsyncSelect.context.d.ts +8 -0
- package/dist/editors/ArchbaseAsyncSelect.d.ts +102 -0
- package/dist/editors/ArchbaseAvatarEdit.d.ts +49 -0
- package/dist/editors/ArchbaseCheckbox.d.ts +45 -0
- package/dist/editors/ArchbaseChip.d.ts +43 -0
- package/dist/editors/ArchbaseChipGroup.d.ts +42 -0
- package/dist/editors/ArchbaseChipItem.d.ts +18 -0
- package/dist/editors/ArchbaseColorPicker.d.ts +3 -0
- package/dist/editors/ArchbaseCountdownProgress.d.ts +5 -0
- package/dist/editors/ArchbaseCronExpressionEdit.d.ts +16 -0
- package/dist/editors/ArchbaseCronExpressionEditor.d.ts +8 -0
- package/dist/editors/ArchbaseDatePicker.d.ts +2 -0
- package/dist/editors/ArchbaseDatePickerEdit.d.ts +85 -0
- package/dist/editors/ArchbaseDatePickerRange.d.ts +47 -0
- package/dist/editors/ArchbaseDateTimePickerEdit.d.ts +43 -0
- package/dist/editors/ArchbaseDateTimePickerRange.d.ts +58 -0
- package/dist/editors/ArchbaseEdit.d.ts +56 -0
- package/dist/editors/ArchbaseEdit.example.d.ts +8 -0
- package/dist/editors/ArchbaseFileAttachment.d.ts +17 -0
- package/dist/editors/ArchbaseImageEdit.d.ts +50 -0
- package/dist/editors/ArchbaseJsonEdit.d.ts +49 -0
- package/dist/editors/ArchbaseKeyValueEditor.d.ts +22 -0
- package/dist/editors/ArchbaseLookupEdit.d.ts +57 -0
- package/dist/editors/ArchbaseLookupNumber.d.ts +69 -0
- package/dist/editors/ArchbaseLookupSelect.d.ts +9 -0
- package/dist/editors/ArchbaseMarkdownEdit.d.ts +52 -0
- package/dist/editors/ArchbaseMaskEdit.d.ts +79 -0
- package/dist/editors/ArchbaseNumberEdit.d.ts +51 -0
- package/dist/editors/ArchbaseNumberInput.d.ts +2 -0
- package/dist/editors/ArchbaseOperationHoursEditor.d.ts +8 -0
- package/dist/editors/ArchbasePasswordEdit.d.ts +44 -0
- package/dist/editors/ArchbasePasswordInput.d.ts +2 -0
- package/dist/editors/ArchbaseRadio.d.ts +2 -0
- package/dist/editors/ArchbaseRadioGroup.d.ts +45 -0
- package/dist/editors/ArchbaseRadioItem.d.ts +12 -0
- package/dist/editors/ArchbaseRating.d.ts +52 -0
- package/dist/editors/ArchbaseRichTextEdit.d.ts +80 -0
- package/dist/editors/ArchbaseSelect.context.d.ts +8 -0
- package/dist/editors/ArchbaseSelect.d.ts +107 -0
- package/dist/editors/ArchbaseSelectItem.d.ts +15 -0
- package/dist/editors/ArchbaseSwitch.d.ts +53 -0
- package/dist/editors/ArchbaseTextArea.d.ts +47 -0
- package/dist/editors/ArchbaseTimeEdit.d.ts +52 -0
- package/dist/editors/ArchbaseTimeRangeSelector.d.ts +40 -0
- package/dist/editors/ArchbaseTreeSelect.d.ts +65 -0
- package/dist/editors/index.d.ts +81 -0
- package/dist/feedback/index.d.ts +4 -0
- package/dist/filters/ArchbaseCompositeFilters.d.ts +23 -0
- package/dist/filters/ArchbaseCompositeFilters.types.d.ts +303 -0
- package/dist/filters/ArchbaseCompositeFilters.utils.d.ts +69 -0
- package/dist/filters/components/FilterPill.d.ts +5 -0
- package/dist/filters/hooks/index.d.ts +4 -0
- package/dist/filters/hooks/useArchbaseFilterHistory.d.ts +24 -0
- package/dist/filters/hooks/useArchbaseFilterPresets.d.ts +23 -0
- package/dist/filters/hooks/useArchbaseFilters.d.ts +32 -0
- package/dist/filters/hooks/useArchbaseQuickFilters.d.ts +26 -0
- package/dist/filters/index.d.ts +8 -0
- package/dist/forms/index.d.ts +3 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/useArchbaseContainerDimensions.d.ts +4 -0
- package/dist/hooks/useArchbaseElementSizeArea.d.ts +6 -0
- package/dist/hooks/useArchbaseListContext.d.ts +2 -0
- package/dist/hooks/useArchbaseNavigateParams.d.ts +3 -0
- package/dist/hooks/useArchbaseVisible.d.ts +2 -0
- package/dist/image/ArchbaseImage.d.ts +33 -0
- package/dist/image/ArchbaseMicrosoftAvatar.d.ts +7 -0
- package/dist/image/editor/components/BasicFilters/BasicFilter.d.ts +9 -0
- package/dist/image/editor/components/CropprWrapper/ArchbaseCropperWrapper.d.ts +12 -0
- package/dist/image/editor/components/EditImage/ArchbaseEditImage.d.ts +11 -0
- package/dist/image/editor/components/Input/Input.d.ts +9 -0
- package/dist/image/editor/components/Tab/Tab.d.ts +23 -0
- package/dist/image/editor/functions/croppr/box.d.ts +95 -0
- package/dist/image/editor/functions/croppr/core.d.ts +121 -0
- package/dist/image/editor/functions/croppr/croppr.d.ts +68 -0
- package/dist/image/editor/functions/croppr/handle.d.ts +23 -0
- package/dist/image/editor/functions/croppr/index.d.ts +2 -0
- package/dist/image/editor/functions/croppr/touch.d.ts +10 -0
- package/dist/image/editor/functions/image-processing.d.ts +11 -0
- package/dist/image/editor/index.d.ts +12 -0
- package/dist/image/editor/models/index.models.d.ts +45 -0
- package/dist/image/index.d.ts +7 -0
- package/dist/image/languages.d.ts +299 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +18368 -0
- package/dist/jsonschema/ArchbaseJsonSchemaEditor.types.d.ts +131 -0
- package/dist/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.context.d.ts +7 -0
- package/dist/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.d.ts +9 -0
- package/dist/jsonschema/JsonSchemaEditor/advanced-boolean/index.d.ts +2 -0
- package/dist/jsonschema/JsonSchemaEditor/advanced-number/index.d.ts +2 -0
- package/dist/jsonschema/JsonSchemaEditor/advanced-string/index.d.ts +2 -0
- package/dist/jsonschema/JsonSchemaEditor/drop-plus/index.d.ts +10 -0
- package/dist/jsonschema/JsonSchemaEditor/index.d.ts +2 -0
- package/dist/jsonschema/JsonSchemaEditor/schema-advanced/index.d.ts +6 -0
- package/dist/jsonschema/JsonSchemaEditor/schema-array/index.d.ts +8 -0
- package/dist/jsonschema/JsonSchemaEditor/schema-item/index.d.ts +11 -0
- package/dist/jsonschema/JsonSchemaEditor/schema-object/index.d.ts +7 -0
- package/dist/jsonschema/JsonSchemaEditor/schema-root/index.d.ts +8 -0
- package/dist/jsonschema/JsonSchemaEditor/utils.d.ts +25 -0
- package/dist/jsonschema/JsonSchemaEditor/whoops.d.ts +2 -0
- package/dist/jsonschema/index.d.ts +2 -0
- package/dist/list/ArchbaseList.context.d.ts +27 -0
- package/dist/list/ArchbaseList.d.ts +104 -0
- package/dist/list/ArchbaseListItem.d.ts +59 -0
- package/dist/list/index.d.ts +8 -0
- package/dist/list/treeview/ArchbaseTreeView.d.ts +44 -0
- package/dist/list/treeview/ArchbaseTreeView.types.d.ts +40 -0
- package/dist/list/treeview/ArchbaseTreeViewItem.d.ts +19 -0
- package/dist/list/treeview/index.d.ts +5 -0
- package/dist/list-view/ArchbaseListViewTable.d.ts +111 -0
- package/dist/list-view/index.d.ts +2 -0
- package/dist/markdown/ArchbaseMarkdown.d.ts +23 -0
- package/dist/markdown/ArchbaseMarkdown.types.d.ts +181 -0
- package/dist/markdown/components/CodeBlock.d.ts +23 -0
- package/dist/markdown/components/LinkRenderer.d.ts +16 -0
- package/dist/markdown/index.d.ts +11 -0
- package/dist/masonry/ArchbaseMasonry.context.d.ts +21 -0
- package/dist/masonry/ArchbaseMasonry.d.ts +35 -0
- package/dist/masonry/index.d.ts +5 -0
- package/dist/navigation/index.d.ts +3 -0
- package/dist/notification/ArchbaseAlert.d.ts +22 -0
- package/dist/notification/ArchbaseDialog.d.ts +16 -0
- package/dist/notification/ArchbaseNotifications.d.ts +5 -0
- package/dist/notification/index.d.ts +4 -0
- package/dist/onboarding/ArchbaseOnboardingTour.d.ts +99 -0
- package/dist/onboarding/index.d.ts +2 -0
- package/dist/printer/ArchbaseThermalPrinter.d.ts +27 -0
- package/dist/printer/ArchbaseThermalPrinter.types.d.ts +199 -0
- package/dist/printer/index.d.ts +9 -0
- package/dist/printer/utils/escpos.d.ts +127 -0
- package/dist/spreadsheet/ArchbaseSpreadsheetImport.d.ts +4 -0
- package/dist/spreadsheet/ArchbaseSpreadsheetImport.types.d.ts +65 -0
- package/dist/spreadsheet/index.d.ts +2 -0
- package/dist/theme-editor/ArchbaseThemeEditor.d.ts +17 -0
- package/dist/theme-editor/ArchbaseThemeEditor.types.d.ts +187 -0
- package/dist/theme-editor/index.d.ts +9 -0
- package/dist/theme-editor/utils/themeExport.d.ts +198 -0
- package/dist/themes/ArchbaseThemeEditor.d.ts +49 -0
- package/dist/types/index.d.ts +106 -0
- package/dist/video/ArchbaseVideoPlayer.d.ts +18 -0
- package/dist/video/ArchbaseVideoPlayer.types.d.ts +200 -0
- package/dist/video/hooks/useVideoPlayer.d.ts +58 -0
- package/dist/video/index.d.ts +10 -0
- package/dist/viewers/ArchbasePDFViewer.annotations.d.ts +20 -0
- package/dist/viewers/ArchbasePDFViewer.d.ts +2 -0
- package/dist/viewers/ArchbasePDFViewer.toolbar.d.ts +20 -0
- package/dist/viewers/ArchbasePDFViewer.types.d.ts +68 -0
- package/dist/viewers/file-preview/ArchbaseFilePreviewer.d.ts +19 -0
- package/dist/viewers/file-preview/ArchbaseFilePreviewer.types.d.ts +153 -0
- package/dist/viewers/file-preview/index.d.ts +13 -0
- package/dist/viewers/file-preview/utils/fileTypeDetector.d.ts +33 -0
- package/dist/viewers/index.d.ts +5 -0
- package/package.json +154 -0
- package/src/admin/types.ts +73 -0
- package/src/arco.css +6 -0
- package/src/buttons/ActionsDemo.tsx +107 -0
- package/src/buttons/ArchbaseActionButtons.d.ts.map +1 -0
- package/src/buttons/ArchbaseActionButtons.tsx +387 -0
- package/src/buttons/index.d.ts.map +1 -0
- package/src/buttons/index.ts +7 -0
- package/src/charts/ArchbaseTimeline.d.ts.map +1 -0
- package/src/charts/ArchbaseTimeline.tsx +332 -0
- package/src/charts/index.d.ts.map +1 -0
- package/src/charts/index.ts +5 -0
- package/src/charts/vis-timeline/ArchbaseVisTimeline.tsx +401 -0
- package/src/charts/vis-timeline/ArchbaseVisTimeline.types.ts +294 -0
- package/src/charts/vis-timeline/index.ts +36 -0
- package/src/charts/vis-timeline/utils/timelineOptions.ts +213 -0
- package/src/datagrid/components/index.d.ts.map +1 -0
- package/src/datagrid/components/index.tsx +14 -0
- package/src/datagrid/components/pagination/grid-pagination.d.ts.map +1 -0
- package/src/datagrid/components/pagination/grid-pagination.tsx +150 -0
- package/src/datagrid/components/render/archbase-data-grid-item-renderer.tsx +26 -0
- package/src/datagrid/components/toolbar/global-search-input.d.ts.map +1 -0
- package/src/datagrid/components/toolbar/global-search-input.tsx +118 -0
- package/src/datagrid/components/toolbar/grid-toolbar.d.ts.map +1 -0
- package/src/datagrid/components/toolbar/grid-toolbar.tsx +106 -0
- package/src/datagrid/hooks/index.d.ts.map +1 -0
- package/src/datagrid/hooks/index.tsx +18 -0
- package/src/datagrid/hooks/use-grid-data-stable-rendering.d.ts.map +1 -0
- package/src/datagrid/hooks/use-grid-data-stable-rendering.ts +168 -0
- package/src/datagrid/hooks/use-grid-data.d.ts.map +1 -0
- package/src/datagrid/hooks/use-grid-data.tsx +598 -0
- package/src/datagrid/hooks/use-grid-details-panel.d.ts.map +1 -0
- package/src/datagrid/hooks/use-grid-details-panel.ts +316 -0
- package/src/datagrid/index.d.ts.map +1 -0
- package/src/datagrid/index.tsx +12 -0
- package/src/datagrid/main/archbase-data-grid-column.d.ts.map +1 -0
- package/src/datagrid/main/archbase-data-grid-column.ts +46 -0
- package/src/datagrid/main/archbase-data-grid-formatters.d.ts.map +1 -0
- package/src/datagrid/main/archbase-data-grid-formatters.tsx +384 -0
- package/src/datagrid/main/archbase-data-grid-pagination.d.ts.map +1 -0
- package/src/datagrid/main/archbase-data-grid-pagination.tsx +63 -0
- package/src/datagrid/main/archbase-data-grid-toolbar.d.ts.map +1 -0
- package/src/datagrid/main/archbase-data-grid-toolbar.tsx +160 -0
- package/src/datagrid/main/archbase-data-grid-types.d.ts.map +1 -0
- package/src/datagrid/main/archbase-data-grid-types.tsx +327 -0
- package/src/datagrid/main/archbase-data-grid-utils.d.ts.map +1 -0
- package/src/datagrid/main/archbase-data-grid-utils.ts +494 -0
- package/src/datagrid/main/archbase-data-grid.d.ts.map +1 -0
- package/src/datagrid/main/archbase-data-grid.tsx +1462 -0
- package/src/datagrid/main/archbase-detail-panel-component.d.ts.map +1 -0
- package/src/datagrid/main/archbase-detail-panel-component.tsx +186 -0
- package/src/datagrid/main/archbase-expand-button.d.ts.map +1 -0
- package/src/datagrid/main/archbase-expand-button.tsx +83 -0
- package/src/datagrid/main/archbase-grid-popover.d.ts.map +1 -0
- package/src/datagrid/main/archbase-grid-popover.tsx +188 -0
- package/src/datagrid/main/grid-row-actions.d.ts.map +1 -0
- package/src/datagrid/main/grid-row-actions.tsx +97 -0
- package/src/datagrid/main/index.d.ts.map +1 -0
- package/src/datagrid/main/index.tsx +75 -0
- package/src/datagrid/modals/export-data.d.ts.map +1 -0
- package/src/datagrid/modals/export-data.tsx +183 -0
- package/src/datagrid/modals/export-modal.d.ts.map +1 -0
- package/src/datagrid/modals/export-modal.tsx +168 -0
- package/src/datagrid/modals/index.d.ts.map +1 -0
- package/src/datagrid/modals/index.tsx +6 -0
- package/src/datagrid/modals/print-data.d.ts.map +1 -0
- package/src/datagrid/modals/print-data.tsx +267 -0
- package/src/datagrid/modals/print-modal.d.ts.map +1 -0
- package/src/datagrid/modals/print-modal.tsx +200 -0
- package/src/datagrid/types/grid-props.d.ts.map +1 -0
- package/src/datagrid/types/grid-props.tsx +53 -0
- package/src/datagrid/types/index.d.ts.map +1 -0
- package/src/datagrid/types/index.tsx +1 -0
- package/src/datagrid/utils/formatter.d.ts.map +1 -0
- package/src/datagrid/utils/formatter.tsx +308 -0
- package/src/datagrid/utils/index.d.ts.map +1 -0
- package/src/datagrid/utils/index.tsx +1 -0
- package/src/debug/index.d.ts.map +1 -0
- package/src/debug/index.ts +4 -0
- package/src/debug/jsonpathpicker/ArchbaseJsonPathPicker.css +46 -0
- package/src/debug/jsonpathpicker/ArchbaseJsonPathPicker.d.ts.map +1 -0
- package/src/debug/jsonpathpicker/ArchbaseJsonPathPicker.tsx +341 -0
- package/src/debug/jsonpathpicker/index.d.ts.map +1 -0
- package/src/debug/jsonpathpicker/index.ts +1 -0
- package/src/debug/jsonview/.eslintrc +5 -0
- package/src/debug/jsonview/ArchbaseJsonViewDataRenderer.d.ts.map +1 -0
- package/src/debug/jsonview/ArchbaseJsonViewDataRenderer.tsx +206 -0
- package/src/debug/jsonview/ArchbaseJsonViewDataTypeDetection.d.ts.map +1 -0
- package/src/debug/jsonview/ArchbaseJsonViewDataTypeDetection.ts +31 -0
- package/src/debug/jsonview/index.d.ts.map +1 -0
- package/src/debug/jsonview/index.tsx +60 -0
- package/src/debug/jsonview/styles.module.css +118 -0
- package/src/debug/jsonview/styles.module.css.d.ts +4 -0
- package/src/debug/objectinspector/ArchbaseDebugInspector.d.ts.map +1 -0
- package/src/debug/objectinspector/ArchbaseDebugInspector.tsx +79 -0
- package/src/debug/objectinspector/ArchbaseFloatingWindow.css +70 -0
- package/src/debug/objectinspector/ArchbaseFloatingWindow.d.ts.map +1 -0
- package/src/debug/objectinspector/ArchbaseFloatingWindow.tsx +266 -0
- package/src/debug/objectinspector/ArchbaseObjectInspector.d.ts.map +1 -0
- package/src/debug/objectinspector/ArchbaseObjectInspector.tsx +21 -0
- package/src/debug/objectinspector/index.d.ts.map +1 -0
- package/src/debug/objectinspector/index.ts +3 -0
- package/src/display/index.d.ts.map +1 -0
- package/src/display/index.ts +5 -0
- package/src/editors/ArchbaseAsyncMultiSelect.d.ts.map +1 -0
- package/src/editors/ArchbaseAsyncMultiSelect.tsx +667 -0
- package/src/editors/ArchbaseAsyncSelect.context.d.ts.map +1 -0
- package/src/editors/ArchbaseAsyncSelect.context.ts +9 -0
- package/src/editors/ArchbaseAsyncSelect.d.ts.map +1 -0
- package/src/editors/ArchbaseAsyncSelect.tsx +581 -0
- package/src/editors/ArchbaseAvatarEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseAvatarEdit.tsx +625 -0
- package/src/editors/ArchbaseCheckbox.d.ts.map +1 -0
- package/src/editors/ArchbaseCheckbox.tsx +250 -0
- package/src/editors/ArchbaseChip.d.ts.map +1 -0
- package/src/editors/ArchbaseChip.tsx +233 -0
- package/src/editors/ArchbaseChipGroup.d.ts.map +1 -0
- package/src/editors/ArchbaseChipGroup.tsx +282 -0
- package/src/editors/ArchbaseChipItem.d.ts.map +1 -0
- package/src/editors/ArchbaseChipItem.tsx +21 -0
- package/src/editors/ArchbaseColorPicker.d.ts.map +1 -0
- package/src/editors/ArchbaseColorPicker.tsx +7 -0
- package/src/editors/ArchbaseCountdownProgress.d.ts.map +1 -0
- package/src/editors/ArchbaseCountdownProgress.tsx +57 -0
- package/src/editors/ArchbaseCronExpressionEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseCronExpressionEdit.tsx +86 -0
- package/src/editors/ArchbaseCronExpressionEditor.d.ts.map +1 -0
- package/src/editors/ArchbaseCronExpressionEditor.tsx +133 -0
- package/src/editors/ArchbaseDatePicker.tsx +3 -0
- package/src/editors/ArchbaseDatePickerEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseDatePickerEdit.tsx +785 -0
- package/src/editors/ArchbaseDatePickerRange.d.ts.map +1 -0
- package/src/editors/ArchbaseDatePickerRange.tsx +142 -0
- package/src/editors/ArchbaseDateTimePickerEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseDateTimePickerEdit.tsx +259 -0
- package/src/editors/ArchbaseDateTimePickerRange.d.ts.map +1 -0
- package/src/editors/ArchbaseDateTimePickerRange.tsx +220 -0
- package/src/editors/ArchbaseEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseEdit.example.tsx +240 -0
- package/src/editors/ArchbaseEdit.tsx +325 -0
- package/src/editors/ArchbaseFileAttachment.d.ts.map +1 -0
- package/src/editors/ArchbaseFileAttachment.tsx +259 -0
- package/src/editors/ArchbaseImageEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseImageEdit.tsx +255 -0
- package/src/editors/ArchbaseJsonEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseJsonEdit.tsx +257 -0
- package/src/editors/ArchbaseKeyValueEditor.d.ts.map +1 -0
- package/src/editors/ArchbaseKeyValueEditor.tsx +180 -0
- package/src/editors/ArchbaseLookupEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseLookupEdit.tsx +368 -0
- package/src/editors/ArchbaseLookupNumber.d.ts.map +1 -0
- package/src/editors/ArchbaseLookupNumber.tsx +390 -0
- package/src/editors/ArchbaseLookupSelect.d.ts.map +1 -0
- package/src/editors/ArchbaseLookupSelect.tsx +225 -0
- package/src/editors/ArchbaseMarkdownEdit.tsx +367 -0
- package/src/editors/ArchbaseMaskEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseMaskEdit.tsx +346 -0
- package/src/editors/ArchbaseNumberEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseNumberEdit.tsx +626 -0
- package/src/editors/ArchbaseNumberInput.tsx +3 -0
- package/src/editors/ArchbaseOperationHoursEditor.d.ts.map +1 -0
- package/src/editors/ArchbaseOperationHoursEditor.tsx +206 -0
- package/src/editors/ArchbasePasswordEdit.d.ts.map +1 -0
- package/src/editors/ArchbasePasswordEdit.tsx +265 -0
- package/src/editors/ArchbasePasswordInput.tsx +3 -0
- package/src/editors/ArchbaseRadio.tsx +3 -0
- package/src/editors/ArchbaseRadioGroup.d.ts.map +1 -0
- package/src/editors/ArchbaseRadioGroup.tsx +293 -0
- package/src/editors/ArchbaseRadioItem.d.ts.map +1 -0
- package/src/editors/ArchbaseRadioItem.tsx +14 -0
- package/src/editors/ArchbaseRating.d.ts.map +1 -0
- package/src/editors/ArchbaseRating.tsx +236 -0
- package/src/editors/ArchbaseRichTextEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseRichTextEdit.tsx +435 -0
- package/src/editors/ArchbaseSelect.context.d.ts.map +1 -0
- package/src/editors/ArchbaseSelect.context.ts +9 -0
- package/src/editors/ArchbaseSelect.d.ts.map +1 -0
- package/src/editors/ArchbaseSelect.tsx +550 -0
- package/src/editors/ArchbaseSelectItem.d.ts.map +1 -0
- package/src/editors/ArchbaseSelectItem.tsx +18 -0
- package/src/editors/ArchbaseSwitch.d.ts.map +1 -0
- package/src/editors/ArchbaseSwitch.tsx +266 -0
- package/src/editors/ArchbaseTextArea.d.ts.map +1 -0
- package/src/editors/ArchbaseTextArea.tsx +263 -0
- package/src/editors/ArchbaseTimeEdit.d.ts.map +1 -0
- package/src/editors/ArchbaseTimeEdit.tsx +319 -0
- package/src/editors/ArchbaseTimeRangeSelector.d.ts.map +1 -0
- package/src/editors/ArchbaseTimeRangeSelector.tsx +397 -0
- package/src/editors/ArchbaseTreeSelect.d.ts.map +1 -0
- package/src/editors/ArchbaseTreeSelect.tsx +434 -0
- package/src/editors/index.d.ts.map +1 -0
- package/src/editors/index.tsx +121 -0
- package/src/editors/intro.mdx +4 -0
- package/src/feedback/index.d.ts.map +1 -0
- package/src/feedback/index.ts +5 -0
- package/src/filters/ArchbaseCompositeFilters.tsx +696 -0
- package/src/filters/ArchbaseCompositeFilters.types.ts +402 -0
- package/src/filters/ArchbaseCompositeFilters.utils.ts +378 -0
- package/src/filters/components/FilterPill.tsx +100 -0
- package/src/filters/hooks/index.ts +4 -0
- package/src/filters/hooks/useArchbaseFilterHistory.ts +111 -0
- package/src/filters/hooks/useArchbaseFilterPresets.ts +157 -0
- package/src/filters/hooks/useArchbaseFilters.ts +279 -0
- package/src/filters/hooks/useArchbaseQuickFilters.ts +80 -0
- package/src/filters/index.ts +55 -0
- package/src/forms/index.d.ts.map +1 -0
- package/src/forms/index.ts +4 -0
- package/src/hooks/index.d.ts.map +1 -0
- package/src/hooks/index.ts +5 -0
- package/src/hooks/useArchbaseContainerDimensions.d.ts.map +1 -0
- package/src/hooks/useArchbaseContainerDimensions.ts +28 -0
- package/src/hooks/useArchbaseElementSizeArea.d.ts.map +1 -0
- package/src/hooks/useArchbaseElementSizeArea.ts +39 -0
- package/src/hooks/useArchbaseListContext.d.ts.map +1 -0
- package/src/hooks/useArchbaseListContext.ts +10 -0
- package/src/hooks/useArchbaseNavigateParams.d.ts.map +1 -0
- package/src/hooks/useArchbaseNavigateParams.ts +17 -0
- package/src/hooks/useArchbaseVisible.d.ts.map +1 -0
- package/src/hooks/useArchbaseVisible.ts +35 -0
- package/src/image/.placeholder +0 -0
- package/src/image/ArchbaseImage.d.ts.map +1 -0
- package/src/image/ArchbaseImage.tsx +56 -0
- package/src/image/ArchbaseMicrosoftAvatar.d.ts.map +1 -0
- package/src/image/ArchbaseMicrosoftAvatar.tsx +50 -0
- package/src/image/editor/components/BasicFilters/BasicFilter.d.ts.map +1 -0
- package/src/image/editor/components/BasicFilters/BasicFilter.tsx +179 -0
- package/src/image/editor/components/CropprWrapper/ArchbaseCropper.scss +73 -0
- package/src/image/editor/components/CropprWrapper/ArchbaseCropperWrapper.d.ts.map +1 -0
- package/src/image/editor/components/CropprWrapper/ArchbaseCropperWrapper.tsx +50 -0
- package/src/image/editor/components/EditImage/ArchbaseEditImage.d.ts.map +1 -0
- package/src/image/editor/components/EditImage/ArchbaseEditImage.scss +221 -0
- package/src/image/editor/components/EditImage/ArchbaseEditImage.tsx +469 -0
- package/src/image/editor/components/Input/Input.d.ts.map +1 -0
- package/src/image/editor/components/Input/Input.tsx +70 -0
- package/src/image/editor/components/Tab/Tab.d.ts.map +1 -0
- package/src/image/editor/components/Tab/Tab.tsx +150 -0
- package/src/image/editor/components/Tab/TabsStyles.scss +72 -0
- package/src/image/editor/functions/croppr/box.d.ts.map +1 -0
- package/src/image/editor/functions/croppr/box.ts +272 -0
- package/src/image/editor/functions/croppr/core.d.ts.map +1 -0
- package/src/image/editor/functions/croppr/core.ts +820 -0
- package/src/image/editor/functions/croppr/croppr.d.ts.map +1 -0
- package/src/image/editor/functions/croppr/croppr.ts +136 -0
- package/src/image/editor/functions/croppr/handle.d.ts.map +1 -0
- package/src/image/editor/functions/croppr/handle.ts +75 -0
- package/src/image/editor/functions/croppr/index.d.ts.map +1 -0
- package/src/image/editor/functions/croppr/index.ts +4 -0
- package/src/image/editor/functions/croppr/touch.d.ts.map +1 -0
- package/src/image/editor/functions/croppr/touch.ts +41 -0
- package/src/image/editor/functions/image-processing.d.ts.map +1 -0
- package/src/image/editor/functions/image-processing.ts +202 -0
- package/src/image/editor/image_editor_styles.scss +284 -0
- package/src/image/editor/index.d.ts.map +1 -0
- package/src/image/editor/index.tsx +437 -0
- package/src/image/editor/models/index.models.d.ts.map +1 -0
- package/src/image/editor/models/index.models.ts +48 -0
- package/src/image/index.d.ts.map +1 -0
- package/src/image/index.ts +7 -0
- package/src/image/intro.mdx +4 -0
- package/src/image/languages.d.ts.map +1 -0
- package/src/image/languages.ts +302 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.ts +50 -0
- package/src/jsonschema/ArchbaseJsonSchemaEditor.types.d.ts.map +1 -0
- package/src/jsonschema/ArchbaseJsonSchemaEditor.types.ts +171 -0
- package/src/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.context.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.context.tsx +8 -0
- package/src/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/ArchbaseJsonSchemaEditor.tsx +99 -0
- package/src/jsonschema/JsonSchemaEditor/JsonSchemaEditor.scss +19 -0
- package/src/jsonschema/JsonSchemaEditor/advanced-boolean/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/advanced-boolean/index.tsx +33 -0
- package/src/jsonschema/JsonSchemaEditor/advanced-number/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/advanced-number/index.tsx +119 -0
- package/src/jsonschema/JsonSchemaEditor/advanced-string/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/advanced-string/index.tsx +146 -0
- package/src/jsonschema/JsonSchemaEditor/drop-plus/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/drop-plus/index.tsx +80 -0
- package/src/jsonschema/JsonSchemaEditor/index.ts +2 -0
- package/src/jsonschema/JsonSchemaEditor/schema-advanced/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/schema-advanced/index.tsx +32 -0
- package/src/jsonschema/JsonSchemaEditor/schema-array/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/schema-array/index.tsx +164 -0
- package/src/jsonschema/JsonSchemaEditor/schema-item/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/schema-item/index.tsx +213 -0
- package/src/jsonschema/JsonSchemaEditor/schema-object/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/schema-object/index.tsx +68 -0
- package/src/jsonschema/JsonSchemaEditor/schema-root/index.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/schema-root/index.tsx +103 -0
- package/src/jsonschema/JsonSchemaEditor/utils.d.ts.map +1 -0
- package/src/jsonschema/JsonSchemaEditor/utils.ts +195 -0
- package/src/jsonschema/JsonSchemaEditor/whoops.tsx +79 -0
- package/src/jsonschema/index.d.ts.map +1 -0
- package/src/jsonschema/index.ts +2 -0
- package/src/list/ArchbaseList.context.d.ts.map +1 -0
- package/src/list/ArchbaseList.context.ts +28 -0
- package/src/list/ArchbaseList.d.ts.map +1 -0
- package/src/list/ArchbaseList.tsx +533 -0
- package/src/list/ArchbaseListItem.d.ts.map +1 -0
- package/src/list/ArchbaseListItem.tsx +161 -0
- package/src/list/index.d.ts.map +1 -0
- package/src/list/index.ts +9 -0
- package/src/list/treeview/ArchbaseTreeView.d.ts.map +1 -0
- package/src/list/treeview/ArchbaseTreeView.module.css +66 -0
- package/src/list/treeview/ArchbaseTreeView.tsx +657 -0
- package/src/list/treeview/ArchbaseTreeView.types.d.ts.map +1 -0
- package/src/list/treeview/ArchbaseTreeView.types.tsx +42 -0
- package/src/list/treeview/ArchbaseTreeViewItem.d.ts.map +1 -0
- package/src/list/treeview/ArchbaseTreeViewItem.tsx +210 -0
- package/src/list/treeview/index.d.ts.map +1 -0
- package/src/list/treeview/index.ts +5 -0
- package/src/list-view/ArchbaseListViewTable.tsx +150 -0
- package/src/list-view/index.ts +2 -0
- package/src/markdown/ArchbaseMarkdown.tsx +463 -0
- package/src/markdown/ArchbaseMarkdown.types.ts +213 -0
- package/src/markdown/components/CodeBlock.tsx +197 -0
- package/src/markdown/components/LinkRenderer.tsx +98 -0
- package/src/markdown/index.ts +29 -0
- package/src/masonry/ArchbaseMasonry.context.d.ts.map +1 -0
- package/src/masonry/ArchbaseMasonry.context.ts +24 -0
- package/src/masonry/ArchbaseMasonry.d.ts.map +1 -0
- package/src/masonry/ArchbaseMasonry.tsx +156 -0
- package/src/masonry/index.d.ts.map +1 -0
- package/src/masonry/index.ts +5 -0
- package/src/navigation/index.d.ts.map +1 -0
- package/src/navigation/index.ts +4 -0
- package/src/notification/ArchbaseAlert.d.ts.map +1 -0
- package/src/notification/ArchbaseAlert.tsx +77 -0
- package/src/notification/ArchbaseDialog.d.ts.map +1 -0
- package/src/notification/ArchbaseDialog.tsx +212 -0
- package/src/notification/ArchbaseNotifications.d.ts.map +1 -0
- package/src/notification/ArchbaseNotifications.tsx +64 -0
- package/src/notification/index.d.ts.map +1 -0
- package/src/notification/index.ts +4 -0
- package/src/notification/intro.mdx +4 -0
- package/src/onboarding/ArchbaseOnboardingTour.tsx +147 -0
- package/src/onboarding/index.ts +2 -0
- package/src/printer/ArchbaseThermalPrinter.tsx +465 -0
- package/src/printer/ArchbaseThermalPrinter.types.ts +221 -0
- package/src/printer/index.ts +54 -0
- package/src/printer/utils/escpos.ts +531 -0
- package/src/spreadsheet/ArchbaseSpreadsheetImport.tsx +223 -0
- package/src/spreadsheet/ArchbaseSpreadsheetImport.types.ts +66 -0
- package/src/spreadsheet/index.ts +10 -0
- package/src/theme-editor/ArchbaseThemeEditor.tsx +728 -0
- package/src/theme-editor/ArchbaseThemeEditor.types.ts +207 -0
- package/src/theme-editor/index.ts +45 -0
- package/src/theme-editor/utils/themeExport.ts +351 -0
- package/src/themes/.placeholder +0 -0
- package/src/themes/ArchbaseThemeEditor.d.ts.map +1 -0
- package/src/themes/ArchbaseThemeEditor.tsx +110 -0
- package/src/treeviews.scss +80 -0
- package/src/types/index.d.ts.map +1 -0
- package/src/types/index.ts +115 -0
- package/src/video/ArchbaseVideoPlayer.tsx +706 -0
- package/src/video/ArchbaseVideoPlayer.types.ts +221 -0
- package/src/video/hooks/useVideoPlayer.ts +362 -0
- package/src/video/index.ts +28 -0
- package/src/viewers/ArchbasePDFViewer.annotations.tsx +423 -0
- package/src/viewers/ArchbasePDFViewer.toolbar.tsx +218 -0
- package/src/viewers/ArchbasePDFViewer.tsx +317 -0
- package/src/viewers/ArchbasePDFViewer.types.ts +85 -0
- package/src/viewers/file-preview/ArchbaseFilePreviewer.tsx +756 -0
- package/src/viewers/file-preview/ArchbaseFilePreviewer.types.ts +186 -0
- package/src/viewers/file-preview/index.ts +43 -0
- package/src/viewers/file-preview/utils/fileTypeDetector.ts +317 -0
- 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
|