@mui/x-data-grid
Version:
The community edition of the data grid component (MUI X).
170 lines (141 loc) • 6.72 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.GridAutoSizer = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var React = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _utils = require("@mui/material/utils");
var _createDetectElementResize = _interopRequireDefault(require("../lib/createDetectElementResize"));
var _jsxRuntime = require("react/jsx-runtime");
const _excluded = ["children", "defaultHeight", "defaultWidth", "disableHeight", "disableWidth", "nonce", "onResize", "style"];
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
const GridAutoSizer = /*#__PURE__*/React.forwardRef(function AutoSizer(props, ref) {
const {
children,
defaultHeight = null,
defaultWidth = null,
disableHeight = false,
disableWidth = false,
nonce,
onResize,
style
} = props,
other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
const [state, setState] = React.useState({
height: defaultHeight,
width: defaultWidth
});
const rootRef = React.useRef(null);
const parentElement = React.useRef(null);
const handleResize = (0, _utils.useEventCallback)(() => {
// Guard against AutoSizer component being removed from the DOM immediately after being added.
// This can result in invalid style values which can result in NaN values if we don't handle them.
// See issue #150 for more context.
if (parentElement.current) {
const height = parentElement.current.offsetHeight || 0;
const width = parentElement.current.offsetWidth || 0;
const win = (0, _utils.ownerWindow)(parentElement.current);
const computedStyle = win.getComputedStyle(parentElement.current);
const paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
const paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
const paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
const paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
const newHeight = height - paddingTop - paddingBottom;
const newWidth = width - paddingLeft - paddingRight;
if (!disableHeight && state.height !== newHeight || !disableWidth && state.width !== newWidth) {
setState({
height: newHeight,
width: newWidth
});
if (onResize) {
onResize({
height: newHeight,
width: newWidth
});
}
}
}
});
(0, _utils.unstable_useEnhancedEffect)(() => {
var _parentElement$curren;
parentElement.current = rootRef.current.parentElement;
if (!parentElement) {
return undefined;
}
const win = (0, _utils.ownerWindow)((_parentElement$curren = parentElement.current) != null ? _parentElement$curren : undefined);
const detectElementResize = (0, _createDetectElementResize.default)(nonce, win);
detectElementResize.addResizeListener(parentElement.current, handleResize);
handleResize();
return () => {
detectElementResize.removeResizeListener(parentElement.current, handleResize);
};
}, [nonce, handleResize]); // Outer div should not force width/height since that may prevent containers from shrinking.
// Inner component should overflow and use calculated width/height.
// See issue #68 for more information.
const outerStyle = {
overflow: 'visible'
};
const childParams = {};
if (!disableHeight) {
outerStyle.height = 0;
childParams.height = state.height;
}
if (!disableWidth) {
outerStyle.width = 0;
childParams.width = state.width;
}
const handleRef = (0, _utils.useForkRef)(rootRef, ref);
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({
ref: handleRef,
style: (0, _extends2.default)({}, outerStyle, style)
}, other, {
children: state.height === null && state.width === null ? null : children(childParams)
}));
});
exports.GridAutoSizer = GridAutoSizer;
process.env.NODE_ENV !== "production" ? GridAutoSizer.propTypes = {
// ----------------------------- Warning --------------------------------
// | These PropTypes are generated from the TypeScript type definitions |
// | To update them edit the TypeScript types and run "yarn proptypes" |
// ----------------------------------------------------------------------
/**
* Function responsible for rendering children.
* @param {AutoSizerSize} size The grid's size.
* @returns {React.ReactNode} The children to render.
*/
children: _propTypes.default.func.isRequired,
/**
* Default height to use for initial render; useful for SSR.
* @default null
*/
defaultHeight: _propTypes.default.number,
/**
* Default width to use for initial render; useful for SSR.
* @default null
*/
defaultWidth: _propTypes.default.number,
/**
* If `true`, disable dynamic :height property.
* @default false
*/
disableHeight: _propTypes.default.bool,
/**
* If `true`, disable dynamic :width property.
* @default false
*/
disableWidth: _propTypes.default.bool,
/**
* Nonce of the inlined stylesheet for Content Security Policy.
*/
nonce: _propTypes.default.string,
/**
* Callback to be invoked on-resize.
* @param {AutoSizerSize} size The grid's size.
*/
onResize: _propTypes.default.func
} : void 0;