334 lines
12 KiB
JavaScript
334 lines
12 KiB
JavaScript
"use strict";
|
|
|
|
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports["default"] = void 0;
|
|
|
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
|
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
|
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
|
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
|
|
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
|
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
|
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
|
|
var _immutable = _interopRequireDefault(require("immutable"));
|
|
|
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
|
var React = _interopRequireWildcard(require("react"));
|
|
|
|
var _ContentBox = require("../demo/ContentBox");
|
|
|
|
var _LabeledInput = require("../demo/LabeledInput");
|
|
|
|
var _CellMeasurer = require("../CellMeasurer");
|
|
|
|
var _AutoSizer = _interopRequireDefault(require("../AutoSizer"));
|
|
|
|
var _WindowScroller = _interopRequireDefault(require("../WindowScroller"));
|
|
|
|
var _createCellPositioner = _interopRequireDefault(require("./createCellPositioner"));
|
|
|
|
var _Masonry = _interopRequireDefault(require("./Masonry"));
|
|
|
|
var _MasonryExample = _interopRequireDefault(require("./Masonry.example.css"));
|
|
|
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
|
|
var GridExample =
|
|
/*#__PURE__*/
|
|
function (_React$PureComponent) {
|
|
(0, _inherits2["default"])(GridExample, _React$PureComponent);
|
|
|
|
function GridExample(props, context) {
|
|
var _this;
|
|
|
|
(0, _classCallCheck2["default"])(this, GridExample);
|
|
_this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(GridExample).call(this, props, context));
|
|
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_resetList", function () {
|
|
var ROW_HEIGHTS = [25, 50, 75, 100];
|
|
var list = _this.context.list;
|
|
list.forEach(function (datum) {
|
|
datum.size = ROW_HEIGHTS[Math.floor(Math.random() * ROW_HEIGHTS.length)];
|
|
});
|
|
|
|
_this._cache.clearAll();
|
|
|
|
_this._resetCellPositioner();
|
|
|
|
_this._masonry.clearCellPositions();
|
|
});
|
|
_this._columnCount = 0;
|
|
_this._cache = new _CellMeasurer.CellMeasurerCache({
|
|
defaultHeight: 250,
|
|
defaultWidth: 200,
|
|
fixedWidth: true
|
|
});
|
|
_this.state = {
|
|
columnWidth: 200,
|
|
height: 300,
|
|
gutterSize: 10,
|
|
overscanByPixels: 0,
|
|
windowScrollerEnabled: false
|
|
};
|
|
_this._cellRenderer = _this._cellRenderer.bind((0, _assertThisInitialized2["default"])(_this));
|
|
_this._onResize = _this._onResize.bind((0, _assertThisInitialized2["default"])(_this));
|
|
_this._renderAutoSizer = _this._renderAutoSizer.bind((0, _assertThisInitialized2["default"])(_this));
|
|
_this._renderMasonry = _this._renderMasonry.bind((0, _assertThisInitialized2["default"])(_this));
|
|
_this._setMasonryRef = _this._setMasonryRef.bind((0, _assertThisInitialized2["default"])(_this));
|
|
return _this;
|
|
}
|
|
|
|
(0, _createClass2["default"])(GridExample, [{
|
|
key: "render",
|
|
value: function render() {
|
|
var _this2 = this;
|
|
|
|
var _this$state = this.state,
|
|
columnWidth = _this$state.columnWidth,
|
|
height = _this$state.height,
|
|
gutterSize = _this$state.gutterSize,
|
|
overscanByPixels = _this$state.overscanByPixels,
|
|
windowScrollerEnabled = _this$state.windowScrollerEnabled;
|
|
var child;
|
|
|
|
if (windowScrollerEnabled) {
|
|
child = React.createElement(_WindowScroller["default"], {
|
|
overscanByPixels: overscanByPixels
|
|
}, this._renderAutoSizer);
|
|
} else {
|
|
child = this._renderAutoSizer({
|
|
height: height
|
|
});
|
|
}
|
|
|
|
return React.createElement(_ContentBox.ContentBox, null, React.createElement(_ContentBox.ContentBoxHeader, {
|
|
text: "Masonry",
|
|
sourceLink: "https://github.com/bvaughn/react-virtualized/blob/master/source/Masonry/Masonry.example.js",
|
|
docsLink: "https://github.com/bvaughn/react-virtualized/blob/master/docs/Masonry.md"
|
|
}), React.createElement(_ContentBox.ContentBoxParagraph, null, "Optimized for masonry layouts. Cells are j.i.t. measured and layed out as a user scrolls. Sizes are cached so that resize/reflow is fast and does not require re-measuring."), React.createElement(_ContentBox.ContentBoxParagraph, null, React.createElement("label", {
|
|
className: _MasonryExample["default"].checkboxLabel
|
|
}, React.createElement("input", {
|
|
"aria-label": "Use WindowScroller?",
|
|
checked: windowScrollerEnabled,
|
|
className: _MasonryExample["default"].checkbox,
|
|
type: "checkbox",
|
|
onChange: function onChange(event) {
|
|
// HACK Because this demo switches between using WindowScroller and not,
|
|
// It's easier to clear the cache when toggling modes to avoid a partially stale state.
|
|
_this2._cache.clearAll();
|
|
|
|
_this2.setState({
|
|
windowScrollerEnabled: event.target.checked
|
|
});
|
|
}
|
|
}), "Use ", React.createElement("code", null, "WindowScroller"), "?"), React.createElement("label", {
|
|
className: _MasonryExample["default"].checkboxLabel
|
|
}, React.createElement("button", {
|
|
onClick: this._resetList
|
|
}, "Reset List Data"))), React.createElement(_LabeledInput.InputRow, null, React.createElement(_LabeledInput.LabeledInput, {
|
|
label: "Height",
|
|
name: "height",
|
|
onChange: function onChange(event) {
|
|
_this2.setState({
|
|
height: parseInt(event.target.value, 10) || 300
|
|
});
|
|
},
|
|
value: height
|
|
}), React.createElement(_LabeledInput.LabeledInput, {
|
|
label: "Column Width",
|
|
name: "columnWidth",
|
|
onChange: function onChange(event) {
|
|
_this2._cache.clearAll();
|
|
|
|
_this2.setState({
|
|
columnWidth: parseInt(event.target.value, 10) || 200
|
|
}, function () {
|
|
_this2._calculateColumnCount();
|
|
|
|
_this2._resetCellPositioner();
|
|
|
|
_this2._masonry.clearCellPositions();
|
|
});
|
|
},
|
|
value: columnWidth
|
|
}), React.createElement(_LabeledInput.LabeledInput, {
|
|
label: "Gutter Size",
|
|
name: "gutterSize",
|
|
onChange: function onChange(event) {
|
|
_this2.setState({
|
|
gutterSize: parseInt(event.target.value, 10) || 10
|
|
}, function () {
|
|
_this2._calculateColumnCount();
|
|
|
|
_this2._resetCellPositioner();
|
|
|
|
_this2._masonry.recomputeCellPositions();
|
|
});
|
|
},
|
|
value: gutterSize
|
|
}), React.createElement(_LabeledInput.LabeledInput, {
|
|
label: "Overscan (px)",
|
|
name: "overscanByPixels",
|
|
onChange: function onChange(event) {
|
|
_this2.setState({
|
|
overscanByPixels: parseInt(event.target.value, 10) || 0
|
|
});
|
|
},
|
|
value: overscanByPixels
|
|
})), child);
|
|
}
|
|
}, {
|
|
key: "_calculateColumnCount",
|
|
value: function _calculateColumnCount() {
|
|
var _this$state2 = this.state,
|
|
columnWidth = _this$state2.columnWidth,
|
|
gutterSize = _this$state2.gutterSize;
|
|
this._columnCount = Math.floor(this._width / (columnWidth + gutterSize));
|
|
}
|
|
}, {
|
|
key: "_cellRenderer",
|
|
value: function _cellRenderer(_ref) {
|
|
var index = _ref.index,
|
|
key = _ref.key,
|
|
parent = _ref.parent,
|
|
style = _ref.style;
|
|
var list = this.context.list;
|
|
var columnWidth = this.state.columnWidth;
|
|
var datum = list.get(index % list.size);
|
|
return React.createElement(_CellMeasurer.CellMeasurer, {
|
|
cache: this._cache,
|
|
index: index,
|
|
key: key,
|
|
parent: parent
|
|
}, React.createElement("div", {
|
|
className: _MasonryExample["default"].Cell,
|
|
style: _objectSpread({}, style, {
|
|
width: columnWidth
|
|
})
|
|
}, React.createElement("div", {
|
|
style: {
|
|
backgroundColor: datum.color,
|
|
borderRadius: '0.5rem',
|
|
height: datum.size * 3,
|
|
marginBottom: '0.5rem',
|
|
width: '100%',
|
|
fontSize: 20,
|
|
color: 'white',
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
justifyContent: 'center'
|
|
}
|
|
}, index), datum.random));
|
|
}
|
|
}, {
|
|
key: "_initCellPositioner",
|
|
value: function _initCellPositioner() {
|
|
if (typeof this._cellPositioner === 'undefined') {
|
|
var _this$state3 = this.state,
|
|
columnWidth = _this$state3.columnWidth,
|
|
gutterSize = _this$state3.gutterSize;
|
|
this._cellPositioner = (0, _createCellPositioner["default"])({
|
|
cellMeasurerCache: this._cache,
|
|
columnCount: this._columnCount,
|
|
columnWidth: columnWidth,
|
|
spacer: gutterSize
|
|
});
|
|
}
|
|
}
|
|
}, {
|
|
key: "_onResize",
|
|
value: function _onResize(_ref2) {
|
|
var width = _ref2.width;
|
|
this._width = width;
|
|
|
|
this._calculateColumnCount();
|
|
|
|
this._resetCellPositioner();
|
|
|
|
this._masonry.recomputeCellPositions();
|
|
}
|
|
}, {
|
|
key: "_renderAutoSizer",
|
|
value: function _renderAutoSizer(_ref3) {
|
|
var height = _ref3.height,
|
|
scrollTop = _ref3.scrollTop;
|
|
this._height = height;
|
|
this._scrollTop = scrollTop;
|
|
var overscanByPixels = this.state.overscanByPixels;
|
|
return React.createElement(_AutoSizer["default"], {
|
|
disableHeight: true,
|
|
height: height,
|
|
onResize: this._onResize,
|
|
overscanByPixels: overscanByPixels,
|
|
scrollTop: this._scrollTop
|
|
}, this._renderMasonry);
|
|
}
|
|
}, {
|
|
key: "_renderMasonry",
|
|
value: function _renderMasonry(_ref4) {
|
|
var width = _ref4.width;
|
|
this._width = width;
|
|
|
|
this._calculateColumnCount();
|
|
|
|
this._initCellPositioner();
|
|
|
|
var _this$state4 = this.state,
|
|
height = _this$state4.height,
|
|
overscanByPixels = _this$state4.overscanByPixels,
|
|
windowScrollerEnabled = _this$state4.windowScrollerEnabled;
|
|
return React.createElement(_Masonry["default"], {
|
|
autoHeight: windowScrollerEnabled,
|
|
cellCount: 1000,
|
|
cellMeasurerCache: this._cache,
|
|
cellPositioner: this._cellPositioner,
|
|
cellRenderer: this._cellRenderer,
|
|
height: windowScrollerEnabled ? this._height : height,
|
|
overscanByPixels: overscanByPixels,
|
|
ref: this._setMasonryRef,
|
|
scrollTop: this._scrollTop,
|
|
width: width
|
|
});
|
|
} // This is a bit of a hack to simulate newly loaded cells
|
|
|
|
}, {
|
|
key: "_resetCellPositioner",
|
|
value: function _resetCellPositioner() {
|
|
var _this$state5 = this.state,
|
|
columnWidth = _this$state5.columnWidth,
|
|
gutterSize = _this$state5.gutterSize;
|
|
|
|
this._cellPositioner.reset({
|
|
columnCount: this._columnCount,
|
|
columnWidth: columnWidth,
|
|
spacer: gutterSize
|
|
});
|
|
}
|
|
}, {
|
|
key: "_setMasonryRef",
|
|
value: function _setMasonryRef(ref) {
|
|
this._masonry = ref;
|
|
}
|
|
}]);
|
|
return GridExample;
|
|
}(React.PureComponent);
|
|
|
|
exports["default"] = GridExample;
|
|
(0, _defineProperty2["default"])(GridExample, "contextTypes", {
|
|
list: _propTypes["default"].instanceOf(_immutable["default"].List).isRequired
|
|
}); |