UNPKG

9.46 kBJavaScriptView Raw
1import _defineProperty from 'babel-runtime/helpers/defineProperty';
2import _extends from 'babel-runtime/helpers/extends';
3import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
4import _createClass from 'babel-runtime/helpers/createClass';
5import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
6import _inherits from 'babel-runtime/helpers/inherits';
7var __rest = this && this.__rest || function (s, e) {
8 var t = {};
9 for (var p in s) {
10 if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
11 }if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
12 if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]];
13 }return t;
14};
15/* tslint:disable:jsx-no-multiline-js */
16import classnames from 'classnames';
17import React from 'react';
18import TouchFeedback from 'rmc-feedback';
19import Carousel from '../carousel';
20import Flex from '../flex';
21
22var Grid = function (_React$Component) {
23 _inherits(Grid, _React$Component);
24
25 function Grid() {
26 _classCallCheck(this, Grid);
27
28 var _this = _possibleConstructorReturn(this, (Grid.__proto__ || Object.getPrototypeOf(Grid)).apply(this, arguments));
29
30 _this.state = {
31 initialSlideWidth: 0
32 };
33 _this.renderCarousel = function (rowsArr, pageCount, rowCount) {
34 var prefixCls = _this.props.prefixCls;
35
36 var carouselMaxRow = _this.props.carouselMaxRow;
37 var pagesArr = [];
38 for (var pageIndex = 0; pageIndex < pageCount; pageIndex++) {
39 var pageRows = [];
40 for (var ii = 0; ii < carouselMaxRow; ii++) {
41 var rowIndex = pageIndex * carouselMaxRow + ii;
42 if (rowIndex < rowCount) {
43 pageRows.push(rowsArr[rowIndex]);
44 } else {
45 // 空节点为了确保末尾页的最后未到底的行有底线(样式中last-child会没线)
46 pageRows.push(React.createElement('div', { key: 'gridline-' + rowIndex }));
47 }
48 }
49 pagesArr.push(React.createElement(
50 'div',
51 { key: 'pageitem-' + pageIndex, className: prefixCls + '-carousel-page' },
52 pageRows
53 ));
54 }
55 return pagesArr;
56 };
57 _this.renderItem = function (dataItem, index, columnNum, renderItem) {
58 var prefixCls = _this.props.prefixCls;
59
60 var itemEl = null;
61 if (renderItem) {
62 itemEl = renderItem(dataItem, index);
63 } else {
64 if (dataItem) {
65 var icon = dataItem.icon,
66 text = dataItem.text;
67
68 itemEl = React.createElement(
69 'div',
70 { className: prefixCls + '-item-inner-content column-num-' + columnNum },
71 React.isValidElement(icon) ? icon : React.createElement('img', { className: prefixCls + '-icon', src: icon }),
72 React.createElement(
73 'div',
74 { className: prefixCls + '-text' },
75 text
76 )
77 );
78 }
79 }
80 return React.createElement(
81 'div',
82 { className: prefixCls + '-item-content' },
83 itemEl
84 );
85 };
86 _this.getRows = function (rowCount, dataLength) {
87 // tslint:disable:prefer-const
88 var _this$props = _this.props,
89 columnNum = _this$props.columnNum,
90 data = _this$props.data,
91 renderItem = _this$props.renderItem,
92 prefixCls = _this$props.prefixCls,
93 _onClick = _this$props.onClick,
94 activeStyle = _this$props.activeStyle,
95 activeClassName = _this$props.activeClassName,
96 itemStyle = _this$props.itemStyle;
97
98 var rowsArr = [];
99 columnNum = columnNum;
100 var rowWidth = 100 / columnNum + '%';
101 var colStyle = _extends({ width: rowWidth }, itemStyle);
102 for (var i = 0; i < rowCount; i++) {
103 var rowArr = [];
104
105 var _loop = function _loop(j) {
106 var dataIndex = i * columnNum + j;
107 var itemEl = void 0;
108 if (dataIndex < dataLength) {
109 var el = data && data[dataIndex];
110 itemEl = React.createElement(
111 TouchFeedback,
112 { key: 'griditem-' + dataIndex, activeClassName: activeClassName ? activeClassName : prefixCls + '-item-active', activeStyle: activeStyle },
113 React.createElement(
114 Flex.Item,
115 { className: prefixCls + '-item', onClick: function onClick() {
116 return _onClick && _onClick(el, dataIndex);
117 }, style: colStyle },
118 _this.renderItem(el, dataIndex, columnNum, renderItem)
119 )
120 );
121 } else {
122 itemEl = React.createElement(Flex.Item, { key: 'griditem-' + dataIndex, className: prefixCls + '-item ' + prefixCls + '-null-item', style: colStyle });
123 }
124 rowArr.push(itemEl);
125 };
126
127 for (var j = 0; j < columnNum; j++) {
128 _loop(j);
129 }
130 rowsArr.push(React.createElement(
131 Flex,
132 { justify: 'center', align: 'stretch', key: 'gridline-' + i },
133 rowArr
134 ));
135 }
136 return rowsArr;
137 };
138 return _this;
139 }
140
141 _createClass(Grid, [{
142 key: 'componentDidMount',
143 value: function componentDidMount() {
144 this.setState({
145 initialSlideWidth: document.documentElement.clientWidth
146 });
147 }
148 }, {
149 key: 'render',
150 value: function render() {
151 var _classnames;
152
153 var _a = this.props,
154 prefixCls = _a.prefixCls,
155 className = _a.className,
156 data = _a.data,
157 hasLine = _a.hasLine,
158 isCarousel = _a.isCarousel,
159 square = _a.square,
160 activeStyle = _a.activeStyle,
161 activeClassName = _a.activeClassName,
162 restProps = __rest(_a, ["prefixCls", "className", "data", "hasLine", "isCarousel", "square", "activeStyle", "activeClassName"]);
163 var columnNum = restProps.columnNum,
164 carouselMaxRow = restProps.carouselMaxRow,
165 onClick = restProps.onClick,
166 renderItem = restProps.renderItem,
167 restPropsForCarousel = __rest(restProps, ["columnNum", "carouselMaxRow", "onClick", "renderItem"]);
168
169 var initialSlideWidth = this.state.initialSlideWidth;
170
171 columnNum = columnNum;
172 carouselMaxRow = carouselMaxRow;
173 var dataLength = data && data.length || 0;
174 var rowCount = Math.ceil(dataLength / columnNum);
175 var rowsArr = void 0;
176 var renderEl = void 0;
177 if (isCarousel) {
178 if (initialSlideWidth < 0) {
179 // carousel server render. because carousel dependes on document
180 return null;
181 }
182 if (rowCount % carouselMaxRow !== 0) {
183 rowCount = rowCount + carouselMaxRow - rowCount % carouselMaxRow;
184 }
185 var pageCount = Math.ceil(rowCount / carouselMaxRow);
186 rowsArr = this.getRows(rowCount, dataLength);
187 var carouselProps = {};
188 if (pageCount <= 1) {
189 carouselProps = {
190 dots: false,
191 dragging: false,
192 swiping: false
193 };
194 }
195 renderEl = React.createElement(
196 Carousel,
197 _extends({ initialSlideWidth: initialSlideWidth }, restPropsForCarousel, carouselProps),
198 this.renderCarousel(rowsArr, pageCount, rowCount)
199 );
200 } else {
201 rowsArr = this.getRows(rowCount, dataLength);
202 renderEl = rowsArr;
203 }
204 var cls = classnames(prefixCls, className, (_classnames = {}, _defineProperty(_classnames, prefixCls + '-square', square), _defineProperty(_classnames, prefixCls + '-line', hasLine), _defineProperty(_classnames, prefixCls + '-carousel', isCarousel), _classnames));
205 return React.createElement(
206 'div',
207 { className: cls },
208 renderEl
209 );
210 }
211 }]);
212
213 return Grid;
214}(React.Component);
215
216export default Grid;
217
218Grid.defaultProps = {
219 data: [],
220 hasLine: true,
221 isCarousel: false,
222 columnNum: 4,
223 carouselMaxRow: 2,
224 prefixCls: 'am-grid',
225 square: true,
226 itemStyle: {}
227};
\No newline at end of file