UNPKG

19.8 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
7var slicedToArray = require('./slicedToArray-0711941d.js');
8require('./unsupportedIterableToArray-68db1d3b.js');
9var React = require('react');
10var React__default = _interopDefault(React);
11require('./_commonjsHelpers-72d386ba.js');
12var index = require('./index-b0606964.js');
13var defineProperty = require('./defineProperty-0921a47c.js');
14var toConsumableArray = require('./toConsumableArray-d8a4a2c3.js');
15var _styled = require('styled-components');
16var _styled__default = _interopDefault(_styled);
17require('./getPrototypeOf-2a661a20.js');
18require('./color.js');
19require('./components.js');
20require('./contains-component.js');
21require('./css.js');
22require('./dayjs.min-e07657bf.js');
23require('./date.js');
24var miscellaneous = require('./miscellaneous.js');
25var environment = require('./environment.js');
26require('./font.js');
27require('./math-f4029164.js');
28require('./characters.js');
29require('./format.js');
30require('./keycodes.js');
31require('./url.js');
32require('./web3.js');
33var constants = require('./constants.js');
34require('./breakpoints.js');
35require('./springs.js');
36var textStyles = require('./text-styles.js');
37require('./theme-dark.js');
38require('./theme-light.js');
39var Theme = require('./Theme.js');
40require('./extends-40571110.js');
41require('./objectWithoutProperties-35db8ab0.js');
42require('./index-ecc57c9f.js');
43require('./isObject-ec755c87.js');
44require('./Viewport-15101437.js');
45var Layout = require('./Layout.js');
46var Box = require('./Box.js');
47require('./FocusVisible.js');
48require('./ButtonBase.js');
49require('./PaginationItem.js');
50require('./IconPropTypes-56de5759.js');
51require('./IconAddUser.js');
52require('./IconAlert.js');
53require('./IconAlignCenter.js');
54require('./IconAlignJustify.js');
55require('./IconAlignLeft.js');
56require('./IconAlignRight.js');
57require('./IconAragon.js');
58require('./IconArrowDown.js');
59require('./IconArrowLeft.js');
60require('./IconArrowRight.js');
61require('./IconArrowUp.js');
62require('./IconAtSign.js');
63require('./IconBlock.js');
64require('./IconBookmark.js');
65require('./IconCalendar.js');
66require('./IconCanvas.js');
67require('./IconCaution.js');
68require('./IconCenter.js');
69require('./IconChart.js');
70require('./IconChat.js');
71require('./IconCheck.js');
72require('./IconChip.js');
73require('./IconCircleCheck.js');
74require('./IconCircleMinus.js');
75require('./IconCirclePlus.js');
76require('./IconClock.js');
77require('./IconCloudDownload.js');
78require('./IconCloudUpload.js');
79require('./IconCoin.js');
80require('./IconConfiguration.js');
81require('./IconConnect.js');
82require('./IconConnection.js');
83require('./IconConsole.js');
84require('./IconCopy.js');
85require('./IconCross.js');
86require('./IconDashedSquare.js');
87require('./IconDown.js');
88require('./IconDownload.js');
89require('./IconEdit.js');
90require('./IconEllipsis.js');
91require('./IconEnter.js');
92require('./IconEthereum.js');
93require('./IconExternal.js');
94require('./IconFile.js');
95require('./IconFilter.js');
96require('./IconFlag.js');
97require('./IconFolder.js');
98require('./IconGraph2.js');
99require('./IconGraph.js');
100require('./IconGrid.js');
101require('./IconGroup.js');
102require('./IconHash.js');
103require('./IconHeart.js');
104require('./IconHide.js');
105require('./IconHome.js');
106require('./IconImage.js');
107require('./IconInfo.js');
108require('./IconLabel.js');
109require('./IconLayers.js');
110require('./IconLeft.js');
111require('./IconLink.js');
112require('./IconLocation.js');
113require('./IconLock.js');
114require('./IconMail.js');
115require('./IconMaximize.js');
116require('./IconMenu.js');
117require('./IconMinimize.js');
118require('./IconMinus.js');
119require('./IconMove.js');
120require('./IconNoPicture.js');
121require('./IconPicture.js');
122require('./IconPlus.js');
123require('./IconPower.js');
124require('./IconPrint.js');
125require('./IconProhibited.js');
126require('./IconQuestion.js');
127require('./IconRefresh.js');
128require('./IconRemoveUser.js');
129require('./IconRight.js');
130require('./IconRotateLeft.js');
131require('./IconRotateRight.js');
132require('./IconSearch.js');
133require('./IconSettings.js');
134require('./IconShare.js');
135require('./IconSquareMinus.js');
136require('./IconSquarePlus.js');
137require('./IconSquare.js');
138require('./IconStarFilled.js');
139require('./IconStar.js');
140require('./IconSwap.js');
141require('./IconTarget.js');
142require('./IconToken.js');
143require('./IconTrash.js');
144require('./IconUnlock.js');
145require('./IconUp.js');
146require('./IconUpload.js');
147require('./IconUser.js');
148require('./IconView.js');
149require('./IconVote.js');
150require('./IconWallet.js');
151require('./IconWarning.js');
152require('./IconWorld.js');
153require('./IconWrite.js');
154require('./IconZoomIn.js');
155require('./IconZoomOut.js');
156require('./PaginationSeparator.js');
157var Pagination = require('./Pagination.js');
158require('./objectWithoutPropertiesLoose-1af20ad0.js');
159require('react-dom');
160require('./web-d0294535.js');
161require('./Checkbox.js');
162require('./Button.js');
163require('./ButtonIcon.js');
164require('./ToggleButton.js');
165require('./OpenedSurfaceBorder.js');
166var TableView = require('./TableView.js');
167var ListView = require('./ListView.js');
168require('./getDisplayName-7ab6d318.js');
169require('./index-bc84a358.js');
170require('./LoadingRing.js');
171require('./Link.js');
172var EmptyState = require('./EmptyState.js');
173
174function 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; }
175
176function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { defineProperty._defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
177
178function prepareEntries(entries, from, to, selectedIndexes) {
179 return entries.slice(from, to).map(function (entry, index) {
180 var entryIndex = from + index;
181 var selected = selectedIndexes.includes(entryIndex);
182 return {
183 value: entry || null,
184 index: entryIndex,
185 selected: selected
186 };
187 });
188}
189
190function prepareFields(fields) {
191 return fields.map(function (fieldFromProps, index, fields) {
192 // Convert non-object fields (e.g. a simple string) into objects
193 var field = fieldFromProps && fieldFromProps.label ? fieldFromProps : {
194 label: fieldFromProps
195 }; // Auto align the last column to the end (right)
196
197 if (!field.align) {
198 field.align = index === fields.length - 1 && fields.length > 1 ? 'end' : 'start';
199 }
200
201 return field;
202 });
203}
204
205function entryExpansion(content) {
206 // Rows
207 if (Array.isArray(content) && content.length > 0) {
208 return {
209 content: content,
210 freeLayout: false
211 };
212 } // Free layout
213
214
215 if (content && !Array.isArray(content)) {
216 return {
217 content: [content],
218 freeLayout: true
219 };
220 } // No expansion
221
222
223 return {
224 content: [],
225 freeLayout: false
226 };
227}
228
229function renderEntries(entries, _ref) {
230 var fields = _ref.fields,
231 renderEntry = _ref.renderEntry,
232 renderEntryActions = _ref.renderEntryActions,
233 renderEntryExpansion = _ref.renderEntryExpansion,
234 mode = _ref.mode;
235 return entries.map(function (entry) {
236 var value = entry.value,
237 index = entry.index,
238 selected = entry.selected;
239 var entryNodes = renderEntry(value, index, {
240 selected: selected,
241 mode: mode
242 });
243
244 if (!Array.isArray(entryNodes)) {
245 entryNodes = [];
246 } // Create undefined cells too
247
248
249 while (entryNodes.length < fields.length) {
250 entryNodes.push(null);
251 }
252
253 var expansion = entryExpansion(renderEntryExpansion ? renderEntryExpansion(value, index, {
254 selected: selected,
255 mode: mode
256 }) : null);
257 var actions = renderEntryActions ? renderEntryActions(value, index, {
258 selected: selected,
259 mode: mode
260 }) : null;
261 return {
262 actions: actions,
263 entryNodes: entryNodes,
264 expansion: expansion,
265 index: index,
266 selected: selected
267 };
268 });
269}
270
271function useSelection(entries, selection, onSelectEntries) {
272 // Only used if `selection` is not passed via props. The selection supports
273 // both a managed and a controlled mode, to provide a better developer
274 // experience out of the box.
275 var _useState = React.useState([]),
276 _useState2 = slicedToArray._slicedToArray(_useState, 2),
277 selectionManaged = _useState2[0],
278 setSelectionManaged = _useState2[1];
279
280 var currentSelection = selection === undefined ? selectionManaged : selection;
281 var updateSelection = React.useCallback(function (newSelection) {
282 // Managed state
283 if (selection === undefined) {
284 setSelectionManaged(newSelection);
285 } // Useful to notify, even in managed mode
286
287
288 onSelectEntries(toConsumableArray._toConsumableArray(newSelection).sort().map(function (index) {
289 return entries[index];
290 }), newSelection);
291 }, [selection, onSelectEntries, entries]);
292 var allSelected = React.useMemo(function () {
293 // none selected
294 if (currentSelection.length === 0) {
295 return -1;
296 } // all selected
297
298
299 if (currentSelection.length === entries.length) {
300 return 1;
301 } // some selected
302
303
304 return 0;
305 }, [entries, currentSelection]);
306 var toggleEntrySelect = React.useCallback(function (entryIndex) {
307 updateSelection(currentSelection.includes(entryIndex) ? currentSelection.filter(function (index) {
308 return index !== entryIndex;
309 }) : [].concat(toConsumableArray._toConsumableArray(currentSelection), [entryIndex]));
310 }, [updateSelection, currentSelection]);
311 var selectAll = React.useCallback(function () {
312 updateSelection(currentSelection.length === 0 ? entries.map(function (_, index) {
313 return index;
314 }) : []);
315 }, [entries, currentSelection, updateSelection]);
316 return {
317 allSelected: allSelected,
318 selectAll: selectAll,
319 toggleEntrySelect: toggleEntrySelect,
320 selectedIndexes: currentSelection
321 };
322}
323
324function deprecatedEmptyStatePropsCompat(_ref2) {
325 var emptyState = _ref2.emptyState,
326 statusEmpty = _ref2.statusEmpty,
327 statusLoading = _ref2.statusLoading,
328 statusEmptyFilters = _ref2.statusEmptyFilters,
329 statusEmptySearch = _ref2.statusEmptySearch;
330
331 for (var _i = 0, _arr = [['statusEmpty', statusEmpty, 'default', 'title'], ['statusEmptyFilters', statusEmptyFilters, 'empty-filters', 'subtitle'], ['statusEmptySearch', statusEmptySearch, 'empty-search', 'subtitle'], ['statusLoading', statusLoading, 'loading', 'title']]; _i < _arr.length; _i++) {
332 var _arr$_i = slicedToArray._slicedToArray(_arr[_i], 4),
333 propName = _arr$_i[0],
334 propValue = _arr$_i[1],
335 emptyStateName = _arr$_i[2],
336 partName = _arr$_i[3];
337
338 if (!propValue) {
339 continue;
340 }
341
342 environment.warnOnce("DataView:".concat(propName), "DataView: the ".concat(propName, " prop is now deprecated, please use emptyState instead.")); // Only set the default state title if not set already
343
344 if (!emptyState[emptyStateName] || !emptyState[emptyStateName][partName]) {
345 emptyState[emptyStateName] = _objectSpread({}, emptyState[emptyStateName], defineProperty._defineProperty({}, partName, propValue));
346 }
347 }
348
349 return emptyState;
350}
351
352var _StyledDiv = _styled__default("div").withConfig({
353 displayName: "DataView___StyledDiv",
354 componentId: "sc-49otbs-0"
355})(["padding:", "px ", "px;"], function (p) {
356 return p._css;
357}, function (p) {
358 return p._css2;
359});
360
361var _StyledH = _styled__default("h1").withConfig({
362 displayName: "DataView___StyledH",
363 componentId: "sc-49otbs-1"
364})(["margin-bottom:", "px;", ";"], function (p) {
365 return p._css3;
366}, function (p) {
367 return p._css4;
368});
369
370var _StyledDiv2 = _styled__default("div").withConfig({
371 displayName: "DataView___StyledDiv2",
372 componentId: "sc-49otbs-2"
373})(["border-top:1px solid ", ";"], function (p) {
374 return p._css5;
375});
376
377var DataView = React__default.memo(function DataView(_ref3) {
378 var emptyState = _ref3.emptyState,
379 entries = _ref3.entries,
380 entriesPerPage = _ref3.entriesPerPage,
381 fields = _ref3.fields,
382 heading = _ref3.heading,
383 mode = _ref3.mode,
384 onPageChange = _ref3.onPageChange,
385 onSelectEntries = _ref3.onSelectEntries,
386 onStatusEmptyClear = _ref3.onStatusEmptyClear,
387 page = _ref3.page,
388 renderEntry = _ref3.renderEntry,
389 renderEntryActions = _ref3.renderEntryActions,
390 renderEntryExpansion = _ref3.renderEntryExpansion,
391 renderSelectionCount = _ref3.renderSelectionCount,
392 selection = _ref3.selection,
393 status = _ref3.status,
394 tableRowHeight = _ref3.tableRowHeight,
395 renderEntryChild = _ref3.renderEntryChild,
396 statusEmpty = _ref3.statusEmpty,
397 statusEmptyFilters = _ref3.statusEmptyFilters,
398 statusEmptySearch = _ref3.statusEmptySearch,
399 statusLoading = _ref3.statusLoading;
400
401 if (renderEntryChild && !renderEntryExpansion) {
402 environment.warnOnce('DataView:renderEntryChild', 'DataView: the renderEntryChild prop has been renamed ' + 'renderEntryExpansion and will be removed in a future version. ' + 'Please use the new name.');
403 renderEntryExpansion = renderEntryChild;
404 }
405
406 if (renderEntryExpansion && onSelectEntries) {
407 environment.warnOnce('DataView: renderEntryExpansion + onSelectEntries', 'A DataView cannot be made selectable with some of its entries ' + 'expandable. Please use only one of renderEntryExpansion or ' + 'onSelectEntries at a time. Ignoring renderEntryExpansion.');
408 renderEntryExpansion = undefined;
409 }
410
411 emptyState = deprecatedEmptyStatePropsCompat({
412 emptyState: emptyState,
413 statusEmpty: statusEmpty,
414 statusEmptyFilters: statusEmptyFilters,
415 statusEmptySearch: statusEmptySearch,
416 statusLoading: statusLoading
417 }); // Only used if `page` is not passed. The pagination supports both a
418 // managed and a controlled mode, to provide a better developer experience
419 // out of the box.
420
421 var _useState3 = React.useState(0),
422 _useState4 = slicedToArray._slicedToArray(_useState3, 2),
423 pageManaged = _useState4[0],
424 setPageManaged = _useState4[1];
425
426 var handlePageChange = React.useCallback(function (newPage) {
427 // Managed state
428 if (page === undefined) {
429 setPageManaged(newPage);
430 } // Useful to notify, even in managed mode
431
432
433 onPageChange(newPage);
434 }, [onPageChange, page]); // Reset managed pagination if the entries or the pagination changes.
435
436 React.useEffect(function () {
437 setPageManaged(0);
438 }, [entries]);
439 var selectedPage = page === undefined ? pageManaged : page;
440 var theme = Theme.useTheme();
441
442 var _useLayout = Layout.useLayout(),
443 layoutName = _useLayout.layoutName;
444
445 var listMode = mode === 'list' || mode !== 'table' && layoutName === 'small';
446
447 var _useSelection = useSelection(entries, selection, onSelectEntries),
448 allSelected = _useSelection.allSelected,
449 selectAll = _useSelection.selectAll,
450 toggleEntrySelect = _useSelection.toggleEntrySelect,
451 selectedIndexes = _useSelection.selectedIndexes;
452
453 var hasAnyActions = Boolean(renderEntryActions);
454 var hasAnyExpansion = Boolean(renderEntryExpansion);
455 var canSelect = Boolean(onSelectEntries); // If entriesPerPage is -1 (or 0): no pagination
456
457 if (entriesPerPage < 1) {
458 entriesPerPage = entries.length;
459 }
460
461 var pages = Math.ceil(entries.length / entriesPerPage);
462 var displayFrom = entriesPerPage * selectedPage;
463 var displayTo = displayFrom + entriesPerPage;
464 var displayedEntries = prepareEntries(entries, displayFrom, displayTo, selectedIndexes);
465 var preparedFields = prepareFields(fields);
466 var renderedEntries = renderEntries(displayedEntries, {
467 fields: fields,
468 renderEntry: renderEntry,
469 renderEntryActions: renderEntryActions,
470 renderEntryExpansion: renderEntryExpansion,
471 mode: listMode ? 'list' : 'table'
472 });
473 var alignChildOnField = fields.findIndex(function (field) {
474 return field && field.childStart;
475 });
476 var emptyEntries = renderedEntries.length === 0;
477 return /*#__PURE__*/React__default.createElement(Box.default, {
478 padding: 0
479 }, heading && /*#__PURE__*/React__default.createElement(_StyledDiv, {
480 _css: 2 * constants.GU,
481 _css2: layoutName === 'small' ? 2 * constants.GU : 3 * constants.GU
482 }, typeof heading === 'string' ? /*#__PURE__*/React__default.createElement(_StyledH, {
483 _css3: 2 * constants.GU,
484 _css4: textStyles.textStyle('body2')
485 }, heading) : heading), !emptyEntries && (listMode ? /*#__PURE__*/React__default.createElement(ListView.ListView, {
486 allSelected: allSelected,
487 entries: renderedEntries,
488 fields: preparedFields,
489 hasAnyExpansion: hasAnyExpansion,
490 onSelect: toggleEntrySelect,
491 onSelectAll: selectAll,
492 renderSelectionCount: renderSelectionCount,
493 rowHeight: tableRowHeight,
494 selectable: canSelect
495 }) : /*#__PURE__*/React__default.createElement(TableView.TableView, {
496 alignChildOnField: Math.min(Math.max(-1, alignChildOnField), fields.length - 1),
497 allSelected: allSelected,
498 entries: renderedEntries,
499 fields: preparedFields,
500 hasAnyActions: hasAnyActions,
501 hasAnyExpansion: hasAnyExpansion,
502 onSelect: toggleEntrySelect,
503 onSelectAll: selectAll,
504 renderSelectionCount: renderSelectionCount,
505 rowHeight: tableRowHeight,
506 selectable: canSelect,
507 selectedCount: selectedIndexes.length
508 })), emptyEntries && /*#__PURE__*/React__default.createElement(EmptyState.default, {
509 status: status,
510 configurator: emptyState,
511 onStatusEmptyClear: onStatusEmptyClear
512 }), pages > 1 && /*#__PURE__*/React__default.createElement(_StyledDiv2, {
513 _css5: theme.border
514 }, /*#__PURE__*/React__default.createElement(Pagination.default, {
515 pages: pages,
516 selected: selectedPage,
517 onChange: handlePageChange,
518 touchMode: layoutName === 'small'
519 })));
520});
521DataView.propTypes = {
522 page: index.PropTypes.number,
523 entries: index.PropTypes.array.isRequired,
524 entriesPerPage: index.PropTypes.number,
525 fields: index.PropTypes.array.isRequired,
526 heading: index.PropTypes.node,
527 mode: index.PropTypes.oneOf(['adaptive', 'table', 'list']),
528 onPageChange: index.PropTypes.func,
529 onSelectEntries: index.PropTypes.func,
530 renderEntry: index.PropTypes.func.isRequired,
531 renderEntryActions: index.PropTypes.func,
532 renderEntryExpansion: index.PropTypes.func,
533 renderSelectionCount: index.PropTypes.func,
534 selection: index.PropTypes.array,
535 tableRowHeight: index.PropTypes.number,
536 status: index.PropTypes.oneOf(['default', 'empty-filters', 'empty-search', 'loading']),
537 onStatusEmptyClear: index.PropTypes.func,
538 emptyState: index.PropTypes.oneOfType([index.PropTypes.func, index.PropTypes.object]),
539 // deprecated
540 renderEntryChild: index.PropTypes.func,
541 statusEmpty: index.PropTypes.node,
542 statusLoading: index.PropTypes.node,
543 statusEmptyFilters: index.PropTypes.node,
544 statusEmptySearch: index.PropTypes.node
545};
546DataView.defaultProps = {
547 emptyState: {},
548 entriesPerPage: 10,
549 mode: 'adaptive',
550 onPageChange: miscellaneous.noop,
551 renderSelectionCount: function renderSelectionCount(count) {
552 return "".concat(count, " items selected");
553 },
554 status: 'default',
555 tableRowHeight: 8 * constants.GU
556};
557
558exports.default = DataView;
559//# sourceMappingURL=DataView.js.map