UNPKG

@mui/x-data-grid-premium

Version:

The Premium plan edition of the MUI X Data Grid Components.

380 lines (377 loc) 17.7 kB
"use strict"; 'use client'; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.GridChartsPanelDataBody = GridChartsPanelDataBody; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _styles = require("@mui/material/styles"); var _internals = require("@mui/x-data-grid-pro/internals"); var _xDataGridPro = require("@mui/x-data-grid-pro"); var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses")); var _useGridRootProps = require("../../../hooks/utils/useGridRootProps"); var _collapsible = require("../../collapsible"); var _resizablePanel = require("../../resizablePanel"); var _GridChartsPanelDataField = require("./GridChartsPanelDataField"); var _gridChartsIntegrationSelectors = require("../../../hooks/features/chartsIntegration/gridChartsIntegrationSelectors"); var _useGridPrivateApiContext = require("../../../hooks/utils/useGridPrivateApiContext"); var _useGridChartIntegration = require("../../../hooks/utils/useGridChartIntegration"); var _utils = require("../../../hooks/features/chartsIntegration/utils"); var _gridRowGroupingSelector = require("../../../hooks/features/rowGrouping/gridRowGroupingSelector"); var _gridPivotingSelectors = require("../../../hooks/features/pivoting/gridPivotingSelectors"); var _jsxRuntime = require("react/jsx-runtime"); const useUtilityClasses = ownerState => { const { classes } = ownerState; const slots = { root: ['chartsPanelDataBody'], availableFields: ['chartsPanelDataAvailableFields'], sections: ['chartsPanelDataSections'], scrollArea: ['chartsPanelDataScrollArea'], section: ['chartsPanelDataSection'], sectionTitle: ['chartsPanelDataSectionTitle'], fieldList: ['chartsPanelDataFieldList'], placeholder: ['chartsPanelDataPlaceholder'] }; return (0, _composeClasses.default)(slots, _xDataGridPro.getDataGridUtilityClass, classes); }; const GridChartsPanelDataBodyRoot = (0, _styles.styled)('div', { name: 'MuiDataGrid', slot: 'ChartsPanelDataBody' })({ flex: 1, display: 'flex', flexDirection: 'column', overflow: 'hidden' }); const GridChartsPanelDataAvailableFields = (0, _styles.styled)(_xDataGridPro.GridShadowScrollArea, { name: 'MuiDataGrid', slot: 'ChartsPanelDataAvailableFields' })({ flex: 1, minHeight: 84, transition: _internals.vars.transition(['background-color'], { duration: _internals.vars.transitions.duration.short, easing: _internals.vars.transitions.easing.easeInOut }), '&[data-drag-over="true"]': { backgroundColor: _internals.vars.colors.interactive.hover } }); const GridChartsPanelDataSections = (0, _styles.styled)(_resizablePanel.ResizablePanel, { name: 'MuiDataGrid', slot: 'ChartsPanelDataSections' })({ position: 'relative', minHeight: 158, overflow: 'hidden', display: 'flex', flexDirection: 'column' }); const GridChartsPanelDataScrollArea = (0, _styles.styled)(_xDataGridPro.GridShadowScrollArea, { name: 'MuiDataGrid', slot: 'ChartsPanelDataScrollArea' })({ height: '100%' }); const GridChartsPanelDataSection = (0, _styles.styled)(_collapsible.Collapsible, { name: 'MuiDataGrid', slot: 'ChartsPanelDataSection', shouldForwardProp: prop => prop !== 'disabled' })(({ disabled }) => ({ opacity: disabled ? 0.5 : 1, margin: _internals.vars.spacing(0.5, 1), transition: _internals.vars.transition(['border-color', 'background-color'], { duration: _internals.vars.transitions.duration.short, easing: _internals.vars.transitions.easing.easeInOut }), '&[data-drag-over="true"]': { backgroundColor: _internals.vars.colors.interactive.hover, outline: `2px solid ${_internals.vars.colors.interactive.selected}` } })); const GridChartsPanelDataSectionTitle = (0, _styles.styled)('div', { name: 'MuiDataGrid', slot: 'ChartsPanelDataSectionTitle' })({ flex: 1, marginRight: _internals.vars.spacing(1.75), display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: _internals.vars.spacing(1), font: _internals.vars.typography.font.body, fontWeight: _internals.vars.typography.fontWeight.medium }); const GridChartsPanelDataFieldList = (0, _styles.styled)('div', { name: 'MuiDataGrid', slot: 'ChartsPanelDataFieldList' })({ flex: 1, display: 'flex', flexDirection: 'column', padding: _internals.vars.spacing(0.5, 0) }); const GridChartsPanelDataPlaceholder = (0, _styles.styled)('div', { name: 'MuiDataGrid', slot: 'ChartsPanelDataPlaceholder' })({ flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', textWrap: 'balance', textAlign: 'center', minHeight: 38, height: '100%', padding: _internals.vars.spacing(0, 1), color: _internals.vars.colors.foreground.muted, font: _internals.vars.typography.font.body }); const INITIAL_DRAG_STATE = { active: false, field: null, dropSection: null, initialSection: null }; // dimensions and values const SECTION_COUNT = 2; function GridChartsPanelDataBody(props) { const { searchValue } = props; const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)(); const rootProps = (0, _useGridRootProps.useGridRootProps)(); const rowGroupingModel = (0, _xDataGridPro.useGridSelector)(apiRef, _gridRowGroupingSelector.gridRowGroupingSanitizedModelSelector); const pivotActive = (0, _xDataGridPro.useGridSelector)(apiRef, _internals.gridPivotActiveSelector); const pivotModel = (0, _xDataGridPro.useGridSelector)(apiRef, _gridPivotingSelectors.gridPivotModelSelector); const activeChartId = (0, _xDataGridPro.useGridSelector)(apiRef, _gridChartsIntegrationSelectors.gridChartsIntegrationActiveChartIdSelector); const { chartStateLookup } = (0, _useGridChartIntegration.useGridChartsIntegrationContext)(); const dimensions = (0, _xDataGridPro.useGridSelector)(apiRef, _gridChartsIntegrationSelectors.gridChartsDimensionsSelector, activeChartId); const values = (0, _xDataGridPro.useGridSelector)(apiRef, _gridChartsIntegrationSelectors.gridChartsValuesSelector, activeChartId); const classes = useUtilityClasses(rootProps); const chartableColumns = (0, _xDataGridPro.useGridSelector)(apiRef, _gridChartsIntegrationSelectors.gridChartableColumnsSelector); const dimensionsLabel = React.useMemo(() => chartStateLookup[activeChartId]?.dimensionsLabel || apiRef.current.getLocaleText('chartsCategories'), [chartStateLookup, activeChartId, apiRef]); const valuesLabel = React.useMemo(() => chartStateLookup[activeChartId]?.valuesLabel || apiRef.current.getLocaleText('chartsSeries'), [chartStateLookup, activeChartId, apiRef]); const fullSections = React.useMemo(() => { const sections = []; if (chartStateLookup[activeChartId]?.maxDimensions && dimensions.length >= chartStateLookup[activeChartId]?.maxDimensions) { sections.push('dimensions'); } if (chartStateLookup[activeChartId]?.maxValues && values.length >= chartStateLookup[activeChartId]?.maxValues) { sections.push('values'); } return sections; }, [dimensions, values, chartStateLookup, activeChartId]); const blockedSectionsLookup = React.useMemo(() => new Map(Object.values(chartableColumns).map(column => [column.field, Array.from(new Set([...(0, _utils.getBlockedSections)(column, rowGroupingModel, pivotActive ? pivotModel : undefined), ...fullSections]))])), [rowGroupingModel, chartableColumns, pivotActive, pivotModel, fullSections]); const availableFields = React.useMemo(() => { const notUsedFields = Object.keys(chartableColumns).filter(field => !dimensions.some(dimension => dimension.field === field) && !values.some(value => value.field === field)); if (searchValue) { return notUsedFields.filter(field => { const fieldName = apiRef.current.chartsIntegration.getColumnName(field); return fieldName.toLowerCase().includes(searchValue.toLowerCase()); }); } // Fields with all sections blocked should be at the end return notUsedFields.sort((a, b) => { const aBlockedSections = blockedSectionsLookup.get(a).length; const bBlockedSections = blockedSectionsLookup.get(b).length; return (aBlockedSections >= SECTION_COUNT ? 1 : 0) - (bBlockedSections >= SECTION_COUNT ? 1 : 0); }); }, [apiRef, searchValue, chartableColumns, dimensions, values, blockedSectionsLookup]); const [drag, setDrag] = React.useState(INITIAL_DRAG_STATE); const disabledSections = React.useMemo(() => { if (!drag.field) { return new Set(); } return new Set(blockedSectionsLookup.get(drag.field)); }, [blockedSectionsLookup, drag.field]); const handleDragStart = (field, section) => { setDrag({ active: true, field, initialSection: section, dropSection: null }); }; const handleDragEnd = () => { setDrag(INITIAL_DRAG_STATE); }; const handleDrop = event => { setDrag(INITIAL_DRAG_STATE); // The drop event was already handled by a child if (event.defaultPrevented) { return; } event.preventDefault(); const { field, section: originSection } = JSON.parse(event.dataTransfer.getData('text/plain')); const targetSection = event.currentTarget.getAttribute('data-section'); if (originSection === targetSection) { return; } apiRef.current.chartsIntegration.updateDataReference(field, originSection, targetSection); }; const handleDragOver = React.useCallback(event => { event.preventDefault(); event.dataTransfer.dropEffect = 'move'; }, []); const handleDragEnter = React.useCallback(event => { if (!event.currentTarget.contains(event.relatedTarget)) { const dropSection = event.currentTarget.getAttribute('data-section'); setDrag(v => (0, _extends2.default)({}, v, { active: true, dropSection })); } }, []); const handleDragLeave = React.useCallback(event => { if (!event.currentTarget.contains(event.relatedTarget)) { setDrag(v => (0, _extends2.default)({}, v, { active: true, dropSection: v.initialSection })); } }, []); const handleChange = React.useCallback((field, section) => { const apiMethod = section === 'dimensions' ? apiRef.current.updateChartDimensionsData : apiRef.current.updateChartValuesData; apiMethod(activeChartId, currentItems => currentItems.map(item => item.field === field ? (0, _extends2.default)({}, item, { hidden: item.hidden !== true }) : item)); }, [apiRef, activeChartId]); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(GridChartsPanelDataBodyRoot, { ownerState: rootProps, className: classes.root, "data-dragging": drag.active, onDragLeave: handleDragLeave, children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(GridChartsPanelDataAvailableFields, { ownerState: rootProps, className: classes.availableFields, onDrop: handleDrop, onDragEnter: handleDragEnter, onDragOver: handleDragOver, "data-section": null, "data-drag-over": drag.active && drag.dropSection === null, children: [availableFields.length === 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(GridChartsPanelDataPlaceholder, { ownerState: rootProps, className: classes.placeholder, children: apiRef.current.getLocaleText('chartsNoFields') }), availableFields.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(GridChartsPanelDataFieldList, { ownerState: rootProps, className: classes.fieldList, children: availableFields.map(field => /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridChartsPanelDataField.GridChartsPanelDataField, { field: field, section: null, disabled: blockedSectionsLookup.get(field).length >= SECTION_COUNT, blockedSections: blockedSectionsLookup.get(field), dimensionsLabel: dimensionsLabel, valuesLabel: valuesLabel, onDragStart: handleDragStart, onDragEnd: handleDragEnd, children: apiRef.current.chartsIntegration.getColumnName(field) }, field)) })] }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(GridChartsPanelDataSections, { ownerState: rootProps, className: classes.sections, direction: "vertical", children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_resizablePanel.ResizablePanelHandle, {}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(GridChartsPanelDataScrollArea, { ownerState: rootProps, className: classes.scrollArea, children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(GridChartsPanelDataSection, { ownerState: rootProps, className: classes.section, onDrop: handleDrop, onDragEnter: handleDragEnter, onDragOver: handleDragOver, disabled: disabledSections.has('dimensions'), "data-section": "dimensions", "data-drag-over": !disabledSections.has('dimensions') && drag.dropSection === 'dimensions', children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_collapsible.CollapsibleTrigger, { "aria-label": dimensionsLabel, children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(GridChartsPanelDataSectionTitle, { ownerState: rootProps, className: classes.sectionTitle, children: [dimensionsLabel, (chartStateLookup[activeChartId]?.maxDimensions || dimensions.length > 0) && /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.baseBadge, { badgeContent: chartStateLookup[activeChartId]?.maxDimensions ? `${dimensions.length}/${chartStateLookup[activeChartId]?.maxDimensions}` : dimensions.length })] }) }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_collapsible.CollapsiblePanel, { children: [dimensions.length === 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(GridChartsPanelDataPlaceholder, { ownerState: rootProps, className: classes.placeholder, children: apiRef.current.getLocaleText('chartsDragToDimensions')(dimensionsLabel) }), dimensions.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(GridChartsPanelDataFieldList, { ownerState: rootProps, className: classes.fieldList, children: dimensions.map(dimension => /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridChartsPanelDataField.GridChartsPanelDataField, { field: dimension.field, selected: dimension.hidden !== true, onChange: handleChange, section: "dimensions", blockedSections: blockedSectionsLookup.get(dimension.field), dimensionsLabel: dimensionsLabel, valuesLabel: valuesLabel, disabled: disabledSections.has('dimensions'), onDragStart: handleDragStart, onDragEnd: handleDragEnd, children: apiRef.current.chartsIntegration.getColumnName(dimension.field) }, dimension.field)) })] })] }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(GridChartsPanelDataSection, { ownerState: rootProps, className: classes.section, onDrop: handleDrop, onDragEnter: handleDragEnter, onDragOver: handleDragOver, disabled: disabledSections.has('values'), "data-section": "values", "data-drag-over": !disabledSections.has('values') && drag.dropSection === 'values', children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_collapsible.CollapsibleTrigger, { "aria-label": valuesLabel, children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(GridChartsPanelDataSectionTitle, { ownerState: rootProps, className: classes.sectionTitle, children: [valuesLabel, (chartStateLookup[activeChartId]?.maxValues || values.length > 0) && /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.baseBadge, { badgeContent: chartStateLookup[activeChartId]?.maxValues ? `${values.length}/${chartStateLookup[activeChartId]?.maxValues}` : values.length })] }) }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_collapsible.CollapsiblePanel, { children: [values.length === 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(GridChartsPanelDataPlaceholder, { ownerState: rootProps, className: classes.placeholder, children: apiRef.current.getLocaleText('chartsDragToValues')(valuesLabel) }), values.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(GridChartsPanelDataFieldList, { ownerState: rootProps, className: classes.fieldList, children: values.map(value => /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridChartsPanelDataField.GridChartsPanelDataField, { field: value.field, selected: value.hidden !== true, onChange: handleChange, section: "values", blockedSections: blockedSectionsLookup.get(value.field), dimensionsLabel: dimensionsLabel, valuesLabel: valuesLabel, disabled: disabledSections.has('values'), onDragStart: handleDragStart, onDragEnd: handleDragEnd, children: apiRef.current.chartsIntegration.getColumnName(value.field) }, value.field)) })] })] })] })] })] }); }