UNPKG

9.43 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.DataTablePagination = exports.default = void 0;
7
8var React = _interopRequireWildcard(require("react"));
9
10var _reactNative = require("react-native");
11
12var _color = _interopRequireDefault(require("color"));
13
14var _IconButton = _interopRequireDefault(require("../IconButton"));
15
16var _Text = _interopRequireDefault(require("../Typography/Text"));
17
18var _theming = require("../../core/theming");
19
20var _MaterialCommunityIcon = _interopRequireDefault(require("../MaterialCommunityIcon"));
21
22var _Menu = _interopRequireDefault(require("../Menu/Menu"));
23
24var _Button = _interopRequireDefault(require("../Button"));
25
26function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
28function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
29
30function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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; }
31
32function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
33
34const PaginationControls = ({
35 page,
36 numberOfPages,
37 onPageChange,
38 showFastPaginationControls
39}) => {
40 const {
41 colors
42 } = (0, _theming.useTheme)();
43 return /*#__PURE__*/React.createElement(React.Fragment, null, showFastPaginationControls ? /*#__PURE__*/React.createElement(_IconButton.default, {
44 icon: ({
45 size,
46 color
47 }) => /*#__PURE__*/React.createElement(_MaterialCommunityIcon.default, {
48 name: "page-first",
49 color: color,
50 size: size,
51 direction: _reactNative.I18nManager.isRTL ? 'rtl' : 'ltr'
52 }),
53 color: colors.text,
54 disabled: page === 0,
55 onPress: () => onPageChange(0),
56 accessibilityLabel: "page-first"
57 }) : null, /*#__PURE__*/React.createElement(_IconButton.default, {
58 icon: ({
59 size,
60 color
61 }) => /*#__PURE__*/React.createElement(_MaterialCommunityIcon.default, {
62 name: "chevron-left",
63 color: color,
64 size: size,
65 direction: _reactNative.I18nManager.isRTL ? 'rtl' : 'ltr'
66 }),
67 color: colors.text,
68 disabled: page === 0,
69 onPress: () => onPageChange(page - 1),
70 accessibilityLabel: "chevron-left"
71 }), /*#__PURE__*/React.createElement(_IconButton.default, {
72 icon: ({
73 size,
74 color
75 }) => /*#__PURE__*/React.createElement(_MaterialCommunityIcon.default, {
76 name: "chevron-right",
77 color: color,
78 size: size,
79 direction: _reactNative.I18nManager.isRTL ? 'rtl' : 'ltr'
80 }),
81 color: colors.text,
82 disabled: numberOfPages === 0 || page === numberOfPages - 1,
83 onPress: () => onPageChange(page + 1),
84 accessibilityLabel: "chevron-right"
85 }), showFastPaginationControls ? /*#__PURE__*/React.createElement(_IconButton.default, {
86 icon: ({
87 size,
88 color
89 }) => /*#__PURE__*/React.createElement(_MaterialCommunityIcon.default, {
90 name: "page-last",
91 color: color,
92 size: size,
93 direction: _reactNative.I18nManager.isRTL ? 'rtl' : 'ltr'
94 }),
95 color: colors.text,
96 disabled: numberOfPages === 0 || page === numberOfPages - 1,
97 onPress: () => onPageChange(numberOfPages - 1),
98 accessibilityLabel: "page-last"
99 }) : null);
100};
101
102const PaginationDropdown = ({
103 numberOfItemsPerPageList,
104 numberOfItemsPerPage,
105 onItemsPerPageChange
106}) => {
107 const {
108 colors
109 } = (0, _theming.useTheme)();
110 const [showSelect, toggleSelect] = React.useState(false);
111 return /*#__PURE__*/React.createElement(_Menu.default, {
112 visible: showSelect,
113 onDismiss: () => toggleSelect(!showSelect),
114 anchor: /*#__PURE__*/React.createElement(_Button.default, {
115 mode: "outlined",
116 onPress: () => toggleSelect(true),
117 style: styles.button,
118 icon: "menu-down",
119 contentStyle: styles.contentStyle
120 }, "".concat(numberOfItemsPerPage))
121 }, numberOfItemsPerPageList === null || numberOfItemsPerPageList === void 0 ? void 0 : numberOfItemsPerPageList.map(option => /*#__PURE__*/React.createElement(_Menu.default.Item, {
122 key: option,
123 titleStyle: option === numberOfItemsPerPage && {
124 color: colors.primary
125 },
126 onPress: () => {
127 onItemsPerPageChange === null || onItemsPerPageChange === void 0 ? void 0 : onItemsPerPageChange(option);
128 toggleSelect(false);
129 },
130 title: option
131 })));
132};
133/**
134 * A component to show pagination for data table.
135 *
136 * <div class="screenshots">
137 * <figure>
138 * <img class="medium" src="screenshots/data-table-pagination.png" />
139 * </figure>
140 * </div>
141 *
142 *
143 * ## Usage
144 * ```js
145 * import * as React from 'react';
146 * import { DataTable } from 'react-native-paper';
147 *
148 * const numberOfItemsPerPageList = [2, 3, 4];
149 *
150 * const items = [
151 * {
152 * key: 1,
153 * name: 'Page 1',
154 * },
155 * {
156 * key: 2,
157 * name: 'Page 2',
158 * },
159 * {
160 * key: 3,
161 * name: 'Page 3',
162 * },
163 * ];
164 *
165 * const MyComponent = () => {
166 * const [page, setPage] = React.useState(0);
167 * const [numberOfItemsPerPage, onItemsPerPageChange] = React.useState(numberOfItemsPerPageList[0]);
168 * const from = page * numberOfItemsPerPage;
169 * const to = Math.min((page + 1) * numberOfItemsPerPage, items.length);
170 *
171 * React.useEffect(() => {
172 * setPage(0);
173 * }, [numberOfItemsPerPage]);
174 *
175 * return (
176 * <DataTable>
177 * <DataTable.Pagination
178 * page={page}
179 * numberOfPages={Math.ceil(items.length / numberOfItemsPerPage)}
180 * onPageChange={page => setPage(page)}
181 * label={`${from + 1}-${to} of ${items.length}`}
182 * showFastPaginationControls
183 * numberOfItemsPerPageList={numberOfItemsPerPageList}
184 * numberOfItemsPerPage={numberOfItemsPerPage}
185 * onItemsPerPageChange={onItemsPerPageChange}
186 * selectPageDropdownLabel={'Rows per page'}
187 * />
188 * </DataTable>
189 * );
190 * };
191 *
192 * export default MyComponent;
193 * ```
194 */
195
196
197const DataTablePagination = ({
198 label,
199 accessibilityLabel,
200 page,
201 numberOfPages,
202 onPageChange,
203 style,
204 theme,
205 showFastPaginationControls = false,
206 numberOfItemsPerPageList,
207 numberOfItemsPerPage,
208 onItemsPerPageChange,
209 selectPageDropdownLabel,
210 selectPageDropdownAccessibilityLabel,
211 ...rest
212}) => {
213 const labelColor = (0, _color.default)(theme.colors.text).alpha(0.6).rgb().string();
214 return /*#__PURE__*/React.createElement(_reactNative.View, _extends({}, rest, {
215 style: [styles.container, style],
216 accessibilityLabel: "pagination-container"
217 }), numberOfItemsPerPageList && numberOfItemsPerPage && onItemsPerPageChange && /*#__PURE__*/React.createElement(_reactNative.View, {
218 accessibilityLabel: "Options Select",
219 style: styles.optionsContainer
220 }, /*#__PURE__*/React.createElement(_Text.default, {
221 style: [styles.label, {
222 color: labelColor
223 }],
224 numberOfLines: 3,
225 accessibilityLabel: selectPageDropdownAccessibilityLabel || 'selectPageDropdownLabel'
226 }, selectPageDropdownLabel), /*#__PURE__*/React.createElement(PaginationDropdown, {
227 numberOfItemsPerPageList: numberOfItemsPerPageList,
228 numberOfItemsPerPage: numberOfItemsPerPage,
229 onItemsPerPageChange: onItemsPerPageChange
230 })), /*#__PURE__*/React.createElement(_Text.default, {
231 style: [styles.label, {
232 color: labelColor
233 }],
234 numberOfLines: 3,
235 accessibilityLabel: accessibilityLabel || 'label'
236 }, label), /*#__PURE__*/React.createElement(_reactNative.View, {
237 style: styles.iconsContainer
238 }, /*#__PURE__*/React.createElement(PaginationControls, {
239 showFastPaginationControls: showFastPaginationControls,
240 onPageChange: onPageChange,
241 page: page,
242 numberOfPages: numberOfPages
243 })));
244};
245
246exports.DataTablePagination = DataTablePagination;
247DataTablePagination.displayName = 'DataTable.Pagination';
248
249const styles = _reactNative.StyleSheet.create({
250 container: {
251 justifyContent: 'flex-end',
252 flexDirection: 'row',
253 alignItems: 'center',
254 paddingLeft: 16,
255 flexWrap: 'wrap'
256 },
257 optionsContainer: {
258 flexDirection: 'row',
259 alignItems: 'center',
260 marginVertical: 6
261 },
262 label: {
263 fontSize: 12,
264 marginRight: 16
265 },
266 button: {
267 textAlign: 'center',
268 marginRight: 16
269 },
270 iconsContainer: {
271 flexDirection: 'row'
272 },
273 contentStyle: {
274 flexDirection: 'row-reverse'
275 }
276});
277
278var _default = (0, _theming.withTheme)(DataTablePagination); // @component-docs ignore-next-line
279
280
281exports.default = _default;
282//# sourceMappingURL=DataTablePagination.js.map
\No newline at end of file