@teselagen/ui 0.6.6 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/DataTable/ColumnFilterMenu.d.ts +2 -1
  2. package/DataTable/Columns.d.ts +51 -0
  3. package/DataTable/DisplayOptions.d.ts +14 -14
  4. package/DataTable/EditabelCell.d.ts +2 -5
  5. package/DataTable/EditableCell.d.ts +7 -0
  6. package/DataTable/FilterAndSortMenu.d.ts +9 -9
  7. package/DataTable/PagingTool.d.ts +25 -2
  8. package/DataTable/RenderCell.d.ts +18 -0
  9. package/DataTable/SearchBar.d.ts +4 -3
  10. package/DataTable/SortableColumns.d.ts +6 -9
  11. package/DataTable/ThComponent.d.ts +9 -0
  12. package/DataTable/index.d.ts +0 -5
  13. package/DataTable/utils/getIdOrCodeOrIndex.d.ts +1 -2
  14. package/DataTable/utils/handleCopyTable.d.ts +1 -0
  15. package/DataTable/utils/index.d.ts +4 -2
  16. package/DataTable/utils/primarySelectedValue.d.ts +1 -0
  17. package/DataTable/utils/queryParams.d.ts +13 -8
  18. package/DataTable/utils/removeCleanRows.d.ts +1 -1
  19. package/DataTable/utils/rowClick.d.ts +24 -3
  20. package/DataTable/utils/useDeepEqualMemo.d.ts +1 -0
  21. package/DataTable/utils/useTableEntities.d.ts +5 -0
  22. package/DataTable/utils/useTableParams.d.ts +49 -0
  23. package/DataTable/utils/withTableParams.d.ts +3 -16
  24. package/DataTable/viewColumn.d.ts +11 -4
  25. package/FormComponents/AbstractField.d.ts +1 -0
  26. package/FormComponents/Uploader.d.ts +34 -1
  27. package/FormComponents/index.d.ts +111 -60
  28. package/MatchHeaders.d.ts +9 -10
  29. package/SimpleStepViz.d.ts +2 -1
  30. package/TgSuggest/index.d.ts +1 -21
  31. package/UploadCsvWizard.d.ts +1 -1
  32. package/index.cjs.js +47861 -49125
  33. package/index.d.ts +6 -3
  34. package/index.es.js +47959 -49223
  35. package/package.json +6 -5
  36. package/src/DataTable/CellDragHandle.js +70 -69
  37. package/src/DataTable/ColumnFilterMenu.js +23 -21
  38. package/src/DataTable/Columns.js +948 -0
  39. package/src/DataTable/Columns.jsx +945 -0
  40. package/src/DataTable/DisplayOptions.js +173 -192
  41. package/src/DataTable/EditabelCell.js +7 -18
  42. package/src/DataTable/EditabelCell.jsx +44 -0
  43. package/src/DataTable/EditableCell.js +44 -0
  44. package/src/DataTable/FilterAndSortMenu.js +215 -234
  45. package/src/DataTable/PagingTool.js +47 -56
  46. package/src/DataTable/RenderCell.js +191 -0
  47. package/src/DataTable/RenderCell.jsx +191 -0
  48. package/src/DataTable/SearchBar.js +12 -5
  49. package/src/DataTable/SortableColumns.js +44 -39
  50. package/src/DataTable/ThComponent.js +44 -0
  51. package/src/DataTable/dataTableEnhancer.js +32 -295
  52. package/src/DataTable/index.js +2945 -3596
  53. package/src/DataTable/utils/getIdOrCodeOrIndex.js +1 -1
  54. package/src/DataTable/utils/handleCopyTable.js +16 -0
  55. package/src/DataTable/utils/index.js +7 -3
  56. package/src/DataTable/utils/primarySelectedValue.js +1 -0
  57. package/src/DataTable/utils/queryParams.js +110 -85
  58. package/src/DataTable/utils/removeCleanRows.js +3 -3
  59. package/src/DataTable/utils/rowClick.js +34 -9
  60. package/src/DataTable/utils/selection.js +1 -1
  61. package/src/DataTable/utils/useDeepEqualMemo.js +10 -0
  62. package/src/DataTable/utils/useTableEntities.js +38 -0
  63. package/src/DataTable/utils/useTableParams.js +362 -0
  64. package/src/DataTable/utils/withTableParams.js +244 -274
  65. package/src/DataTable/validateTableWideErrors.js +1 -1
  66. package/src/DataTable/viewColumn.js +5 -9
  67. package/src/DialogFooter/index.js +3 -3
  68. package/src/FillWindow.js +2 -3
  69. package/src/FormComponents/AbstractField.js +388 -0
  70. package/src/FormComponents/Uploader.js +674 -649
  71. package/src/FormComponents/index.js +505 -654
  72. package/src/FormComponents/tryToMatchSchemas.js +1 -6
  73. package/src/MatchHeaders.js +27 -22
  74. package/src/SimpleStepViz.js +19 -23
  75. package/src/TgSelect/index.js +1 -1
  76. package/src/TgSuggest/index.js +94 -106
  77. package/src/UploadCsvWizard.js +571 -577
  78. package/src/enhancers/withDialog/tg_modalState.js +1 -0
  79. package/src/index.js +10 -4
  80. package/src/showDialogOnDocBody.js +5 -9
  81. package/src/useDialog.js +25 -26
  82. package/src/utils/commandControls.js +2 -2
  83. package/src/utils/handlerHelpers.js +19 -25
  84. package/src/utils/hooks/index.js +1 -0
  85. package/src/utils/hooks/useDeepEqualMemo.js +10 -0
  86. package/src/utils/hooks/useStableReference.js +9 -0
  87. package/src/utils/renderOnDoc.js +8 -5
  88. package/src/utils/tagUtils.js +3 -3
  89. package/src/utils/useTraceUpdate.js +19 -0
  90. package/src/wrapDialog.js +0 -2
  91. package/style.css +251 -251
  92. package/useDialog.d.ts +2 -6
  93. package/utils/hooks/index.d.ts +1 -0
  94. package/utils/hooks/useDeepEqualMemo.d.ts +1 -0
  95. package/utils/hooks/useStableReference.d.ts +1 -0
  96. package/utils/renderOnDoc.d.ts +1 -1
  97. package/utils/tagUtils.d.ts +5 -1
  98. package/utils/useTraceUpdate.d.ts +1 -0
@@ -1,7 +1,7 @@
1
+ import React, { useState } from "react";
1
2
  import { DateInput, DateRangeInput } from "@blueprintjs/datetime";
2
3
  import { camelCase } from "lodash-es";
3
4
  import classNames from "classnames";
4
- import React from "react";
5
5
  import {
6
6
  Menu,
7
7
  Intent,
@@ -54,42 +54,40 @@ const isInvalidFilterValue = value => {
54
54
  return value === "" || value === undefined || value.length === 0;
55
55
  };
56
56
 
57
- export default class FilterAndSortMenu extends React.Component {
58
- constructor(props) {
59
- super(props);
60
- const selectedFilter = camelCase(getFilterMenuItems(props.dataType)[0]);
61
- this.state = {
62
- selectedFilter,
63
- filterValue: "",
64
- ...this.props.currentFilter
65
- };
66
- }
67
- handleFilterChange = selectedFilter => {
68
- const { filterValue } = this.state;
57
+ const FilterAndSortMenu = ({
58
+ dataType,
59
+ togglePopover,
60
+ filterOn,
61
+ addFilters,
62
+ removeSingleFilter,
63
+ currentFilter
64
+ }) => {
65
+ const [selectedFilter, setSelectedFilter] = useState(
66
+ currentFilter?.selectedFilter ?? camelCase(getFilterMenuItems(dataType)[0])
67
+ );
68
+ const [filterValue, setFilterValue] = useState(
69
+ currentFilter?.filterValue ?? ""
70
+ );
71
+
72
+ const handleFilterChange = selectedFilter => {
69
73
  if (
70
74
  filterValue &&
71
75
  !Array.isArray(filterValue) &&
72
76
  filterTypesDictionary[selectedFilter] === "list"
73
77
  ) {
74
- this.setState({
75
- filterValue: filterValue?.split(" ") || []
76
- });
78
+ setFilterValue(filterValue?.split(" ") || []);
77
79
  } else if (
78
80
  filterTypesDictionary[selectedFilter] === "text" &&
79
81
  Array.isArray(filterValue)
80
82
  ) {
81
- this.setState({
82
- filterValue: filterValue.join(" ")
83
- });
83
+ setFilterValue(filterValue.join(" "));
84
84
  }
85
- this.setState({ selectedFilter: camelCase(selectedFilter) });
86
- };
87
- handleFilterValueChange = filterValue => {
88
- this.setState({ filterValue });
85
+ setSelectedFilter(camelCase(selectedFilter));
89
86
  };
90
- handleFilterSubmit = () => {
91
- const { filterValue, selectedFilter } = this.state;
92
- const { togglePopover, dataType } = this.props;
87
+
88
+ const handleFilterValueChange = filterValue => setFilterValue(filterValue);
89
+
90
+ const handleFilterSubmit = () => {
93
91
  const ccSelectedFilter = camelCase(selectedFilter);
94
92
  let filterValToUse = filterValue;
95
93
  if (ccSelectedFilter === "true" || ccSelectedFilter === "false") {
@@ -112,7 +110,6 @@ export default class FilterAndSortMenu extends React.Component {
112
110
  }
113
111
  }
114
112
 
115
- const { filterOn, addFilters, removeSingleFilter } = this.props;
116
113
  if (isInvalidFilterValue(filterValToUse)) {
117
114
  togglePopover();
118
115
  return removeSingleFilter(filterOn);
@@ -126,76 +123,68 @@ export default class FilterAndSortMenu extends React.Component {
126
123
  ]);
127
124
  togglePopover();
128
125
  };
129
- // handleSubmit(event) {
130
- // alert('A name was submitted: ' + this.state.value);
131
- // event.preventDefault();
132
- // }
133
126
 
134
- render() {
135
- const { selectedFilter, filterValue } = this.state;
136
- const { dataType, currentFilter, removeSingleFilter } = this.props;
137
- const { handleFilterChange, handleFilterValueChange, handleFilterSubmit } =
138
- this;
127
+ const filterMenuItems = getFilterMenuItems(dataType);
128
+ const ccSelectedFilter = camelCase(selectedFilter);
129
+ const requiresValue = ccSelectedFilter && ccSelectedFilter !== "none";
139
130
 
140
- const filterMenuItems = getFilterMenuItems(dataType);
141
- const ccSelectedFilter = camelCase(selectedFilter);
142
- const requiresValue = ccSelectedFilter && ccSelectedFilter !== "none";
143
-
144
- return (
145
- <Menu className="data-table-header-menu">
146
- <div className="custom-menu-item">
147
- <div className={classNames(Classes.SELECT, Classes.FILL)}>
148
- <select
149
- onChange={function (e) {
150
- const ccSelectedFilter = camelCase(e.target.value);
151
- handleFilterChange(ccSelectedFilter);
152
- }}
153
- value={ccSelectedFilter}
154
- >
155
- {filterMenuItems.map(function (menuItem, index) {
156
- return (
157
- <option key={index} value={camelCase(menuItem)}>
158
- {menuItem}
159
- </option>
160
- );
161
- })}
162
- </select>
163
- </div>
164
- </div>
165
- <div className="custom-menu-item">
166
- <FilterInput
167
- dataType={dataType}
168
- requiresValue={requiresValue}
169
- handleFilterSubmit={handleFilterSubmit}
170
- filterValue={filterValue}
171
- handleFilterValueChange={handleFilterValueChange}
172
- filterSubType={camelCase(selectedFilter)}
173
- filterType={filterTypesDictionary[camelCase(selectedFilter)]}
174
- />
131
+ return (
132
+ <Menu className="data-table-header-menu">
133
+ <div className="custom-menu-item">
134
+ <div className={classNames(Classes.SELECT, Classes.FILL)}>
135
+ <select
136
+ onChange={function (e) {
137
+ const ccSelectedFilter = camelCase(e.target.value);
138
+ handleFilterChange(ccSelectedFilter);
139
+ }}
140
+ value={ccSelectedFilter}
141
+ >
142
+ {filterMenuItems.map(function (menuItem, index) {
143
+ return (
144
+ <option key={index} value={camelCase(menuItem)}>
145
+ {menuItem}
146
+ </option>
147
+ );
148
+ })}
149
+ </select>
175
150
  </div>
176
- <MenuDivider />
177
- <DialogFooter
178
- secondaryClassName={Classes.POPOVER_DISMISS}
179
- onClick={() => {
180
- handleFilterSubmit();
181
- }}
182
- intent={Intent.SUCCESS}
183
- text="Filter"
184
- secondaryText="Clear"
185
- secondaryIntent={Intent.DANGER}
186
- secondaryAction={() => {
187
- currentFilter && removeSingleFilter(currentFilter.filterOn);
188
- }}
151
+ </div>
152
+ <div className="custom-menu-item">
153
+ <FilterInput
154
+ dataType={dataType}
155
+ requiresValue={requiresValue}
156
+ handleFilterSubmit={handleFilterSubmit}
157
+ filterValue={filterValue}
158
+ handleFilterValueChange={handleFilterValueChange}
159
+ filterSubType={camelCase(selectedFilter)}
160
+ filterType={filterTypesDictionary[camelCase(selectedFilter)]}
189
161
  />
190
- </Menu>
191
- );
192
- }
193
- }
162
+ </div>
163
+ <MenuDivider />
164
+ <DialogFooter
165
+ secondaryClassName={Classes.POPOVER_DISMISS}
166
+ onClick={() => {
167
+ handleFilterSubmit();
168
+ }}
169
+ intent={Intent.SUCCESS}
170
+ text="Filter"
171
+ secondaryText="Clear"
172
+ secondaryIntent={Intent.DANGER}
173
+ secondaryAction={() => {
174
+ if (currentFilter) removeSingleFilter(currentFilter.filterOn);
175
+ }}
176
+ />
177
+ </Menu>
178
+ );
179
+ };
180
+
181
+ export default FilterAndSortMenu;
194
182
 
195
183
  const dateMinMaxHelpers = {
196
184
  minDate: dayjs().subtract(25, "years").toDate(),
197
185
  maxDate: dayjs().add(25, "years").toDate()
198
186
  };
187
+
199
188
  const renderCreateNewOption = (query, active, handleClick) => (
200
189
  <MenuItem
201
190
  icon="add"
@@ -205,69 +194,28 @@ const renderCreateNewOption = (query, active, handleClick) => (
205
194
  shouldDismissPopover={false}
206
195
  />
207
196
  );
208
- class FilterInput extends React.Component {
209
- render() {
210
- const {
211
- handleFilterValueChange,
212
- handleFilterSubmit,
213
- filterValue,
214
- filterSubType,
215
- filterType
216
- } = this.props;
217
- //Options: Text, Single number (before, after, equals), 2 numbers (range),
218
- //Single Date (before, after, on), 2 dates (range)
219
- let inputGroup = <div />;
220
- switch (filterType) {
221
- case "text":
222
- inputGroup =
223
- filterSubType === "notEmpty" || filterSubType === "isEmpty" ? (
224
- <div />
225
- ) : (
226
- <div className="custom-menu-item">
227
- <InputGroup
228
- placeholder="Value"
229
- onChange={function (e) {
230
- handleFilterValueChange(e.target.value);
231
- }}
232
- autoFocus
233
- {...onEnterHelper(handleFilterSubmit)}
234
- value={filterValue}
235
- />
236
- </div>
237
- );
238
- break;
239
- case "list":
240
- inputGroup = (
241
- <div className="custom-menu-item">
242
- <TgSelect
243
- placeholder="Add item"
244
- renderCreateNewOption={renderCreateNewOption}
245
- noResults={null}
246
- multi={true}
247
- creatable={true}
248
- value={(filterValue || []).map(val => ({
249
- label: val,
250
- value: val
251
- }))}
252
- onChange={selectedOptions => {
253
- selectedOptions.some(opt => opt.value === "")
254
- ? handleFilterSubmit()
255
- : handleFilterValueChange(
256
- selectedOptions.map(opt => opt.value)
257
- );
258
- }}
259
- options={[]}
260
- />
261
- </div>
262
- );
263
- break;
264
- case "number":
265
- inputGroup = (
197
+
198
+ const FilterInput = ({
199
+ handleFilterValueChange,
200
+ handleFilterSubmit,
201
+ filterValue,
202
+ filterSubType,
203
+ filterType
204
+ }) => {
205
+ //Options: Text, Single number (before, after, equals), 2 numbers (range),
206
+ //Single Date (before, after, on), 2 dates (range)
207
+ let inputGroup = <div />;
208
+ switch (filterType) {
209
+ case "text":
210
+ inputGroup =
211
+ filterSubType === "notEmpty" || filterSubType === "isEmpty" ? (
212
+ <div />
213
+ ) : (
266
214
  <div className="custom-menu-item">
267
- <NumericInput
215
+ <InputGroup
268
216
  placeholder="Value"
269
- onValueChange={function (numVal) {
270
- handleFilterValueChange(isNaN(numVal) ? 0 : numVal);
217
+ onChange={function (e) {
218
+ handleFilterValueChange(e.target.value);
271
219
  }}
272
220
  autoFocus
273
221
  {...onEnterHelper(handleFilterSubmit)}
@@ -275,94 +223,127 @@ class FilterInput extends React.Component {
275
223
  />
276
224
  </div>
277
225
  );
278
- break;
279
- case "numberRange":
280
- inputGroup = (
281
- <div className="custom-menu-item">
282
- <NumericInput
283
- placeholder="Low"
284
- onValueChange={function (numVal) {
285
- handleFilterValueChange([
286
- isNaN(numVal) ? 0 : numVal,
287
- filterValue[1]
288
- ]);
289
- }}
290
- {...onEnterHelper(handleFilterSubmit)}
291
- value={filterValue && filterValue[0]}
292
- />
293
- <NumericInput
294
- placeholder="High"
295
- onValueChange={function (numVal) {
296
- handleFilterValueChange([
297
- filterValue[0],
298
- isNaN(numVal) ? 0 : numVal
299
- ]);
300
- }}
301
- {...onEnterHelper(handleFilterSubmit)}
302
- value={filterValue && filterValue[1]}
303
- />
304
- </div>
305
- );
306
- break;
307
- case "date":
308
- inputGroup = (
309
- <div className="custom-menu-item">
310
- <DateInput
311
- value={filterValue ? dayjs(filterValue).toDate() : undefined}
312
- {...getDayjsFormatter("L")}
313
- {...dateMinMaxHelpers}
314
- onChange={selectedDates => {
226
+ break;
227
+ case "list":
228
+ inputGroup = (
229
+ <div className="custom-menu-item">
230
+ <TgSelect
231
+ placeholder="Add item"
232
+ renderCreateNewOption={renderCreateNewOption}
233
+ noResults={null}
234
+ multi={true}
235
+ creatable={true}
236
+ value={(filterValue || []).map(val => ({
237
+ label: val,
238
+ value: val
239
+ }))}
240
+ onChange={selectedOptions => {
241
+ selectedOptions.some(opt => opt.value === "")
242
+ ? handleFilterSubmit()
243
+ : handleFilterValueChange(
244
+ selectedOptions.map(opt => opt.value)
245
+ );
246
+ }}
247
+ options={[]}
248
+ />
249
+ </div>
250
+ );
251
+ break;
252
+ case "number":
253
+ inputGroup = (
254
+ <div className="custom-menu-item">
255
+ <NumericInput
256
+ placeholder="Value"
257
+ onValueChange={function (numVal) {
258
+ handleFilterValueChange(isNaN(numVal) ? 0 : numVal);
259
+ }}
260
+ autoFocus
261
+ {...onEnterHelper(handleFilterSubmit)}
262
+ value={filterValue}
263
+ />
264
+ </div>
265
+ );
266
+ break;
267
+ case "numberRange":
268
+ inputGroup = (
269
+ <div className="custom-menu-item">
270
+ <NumericInput
271
+ placeholder="Low"
272
+ onValueChange={function (numVal) {
273
+ handleFilterValueChange([
274
+ isNaN(numVal) ? 0 : numVal,
275
+ filterValue[1]
276
+ ]);
277
+ }}
278
+ {...onEnterHelper(handleFilterSubmit)}
279
+ value={filterValue && filterValue[0]}
280
+ />
281
+ <NumericInput
282
+ placeholder="High"
283
+ onValueChange={function (numVal) {
284
+ handleFilterValueChange([
285
+ filterValue[0],
286
+ isNaN(numVal) ? 0 : numVal
287
+ ]);
288
+ }}
289
+ {...onEnterHelper(handleFilterSubmit)}
290
+ value={filterValue && filterValue[1]}
291
+ />
292
+ </div>
293
+ );
294
+ break;
295
+ case "date":
296
+ inputGroup = (
297
+ <div className="custom-menu-item">
298
+ <DateInput
299
+ value={filterValue ? dayjs(filterValue).toDate() : undefined}
300
+ {...getDayjsFormatter("L")}
301
+ {...dateMinMaxHelpers}
302
+ onChange={selectedDates => {
303
+ handleFilterValueChange(selectedDates);
304
+ }}
305
+ />
306
+ </div>
307
+ );
308
+ break;
309
+ case "dateRange":
310
+ // eslint-disable-next-line no-case-declarations
311
+ let filterValueToUse;
312
+ if (Array.isArray(filterValue)) {
313
+ filterValueToUse = filterValue;
314
+ } else {
315
+ filterValueToUse =
316
+ filterValue && filterValue.split && filterValue.split(";");
317
+ }
318
+ inputGroup = (
319
+ <div className="custom-menu-item">
320
+ <DateRangeInput
321
+ value={
322
+ filterValueToUse && filterValueToUse[0] && filterValueToUse[1]
323
+ ? [new Date(filterValueToUse[0]), new Date(filterValueToUse[1])]
324
+ : undefined
325
+ }
326
+ popoverProps={{
327
+ captureDismiss: true
328
+ }}
329
+ formatDate={date => (date == null ? "" : date.toLocaleDateString())}
330
+ parseDate={str => new Date(Date.parse(str))}
331
+ placeholder="JS Date"
332
+ {...dateMinMaxHelpers}
333
+ onChange={selectedDates => {
334
+ if (selectedDates[0] && selectedDates[1]) {
315
335
  handleFilterValueChange(selectedDates);
316
- }}
317
- />
318
- </div>
319
- );
320
- break;
321
- case "dateRange":
322
- // eslint-disable-next-line no-case-declarations
323
- let filterValueToUse;
324
- if (Array.isArray(filterValue)) {
325
- filterValueToUse = filterValue;
326
- } else {
327
- filterValueToUse =
328
- filterValue && filterValue.split && filterValue.split(";");
329
- }
330
- inputGroup = (
331
- <div className="custom-menu-item">
332
- <DateRangeInput
333
- value={
334
- filterValueToUse && filterValueToUse[0] && filterValueToUse[1]
335
- ? [
336
- new Date(filterValueToUse[0]),
337
- new Date(filterValueToUse[1])
338
- ]
339
- : undefined
340
336
  }
341
- popoverProps={{
342
- captureDismiss: true
343
- }}
344
- {...{
345
- formatDate: date =>
346
- date == null ? "" : date.toLocaleDateString(),
347
- parseDate: str => new Date(Date.parse(str)),
348
- placeholder: "JS Date"
349
- }}
350
- {...dateMinMaxHelpers}
351
- onChange={selectedDates => {
352
- if (selectedDates[0] && selectedDates[1]) {
353
- handleFilterValueChange(selectedDates);
354
- }
355
- }}
356
- />
357
- </div>
358
- );
359
- break;
360
- default:
361
- // to do
362
- }
363
- return inputGroup;
337
+ }}
338
+ />
339
+ </div>
340
+ );
341
+ break;
342
+ default:
343
+ // to do
364
344
  }
365
- }
345
+ return inputGroup;
346
+ };
366
347
 
367
348
  function getFilterMenuItems(dataType) {
368
349
  let filterMenuItems = [];
@@ -1,11 +1,10 @@
1
- import React, { useState, useEffect, useRef } from "react";
2
- import { withProps, withHandlers, compose } from "recompose";
1
+ import React, { useState, useEffect, useRef, useCallback } from "react";
3
2
  import classNames from "classnames";
4
3
  import { noop, get, toInteger } from "lodash-es";
5
4
  import { Button, Classes } from "@blueprintjs/core";
6
5
  import { onEnterOrBlurHelper } from "../utils/handlerHelpers";
7
6
  import { defaultPageSizes } from "./utils/queryParams";
8
- import getIdOrCodeOrIndex from "./utils/getIdOrCodeOrIndex";
7
+ import { getIdOrCodeOrIndex } from "./utils";
9
8
 
10
9
  function PagingInput({ disabled, onBlur, defaultPage }) {
11
10
  const [page, setPage] = useState(defaultPage);
@@ -20,6 +19,7 @@ function PagingInput({ disabled, onBlur, defaultPage }) {
20
19
 
21
20
  return (
22
21
  <input
22
+ name="page"
23
23
  style={{
24
24
  marginLeft: 5,
25
25
  width: page > 999 ? 65 : page > 99 ? 45 : 35,
@@ -38,18 +38,51 @@ function PagingInput({ disabled, onBlur, defaultPage }) {
38
38
 
39
39
  // Define the functional component and its props
40
40
  const PagingTool = ({
41
- onPageChange = noop,
42
- onRefresh,
43
- setPage,
44
- setPageSize,
45
- persistPageSize = noop,
46
- paging: { pageSize, page, total },
47
- hideTotalPages,
48
- disabled,
49
41
  controlled_hasNextPage,
42
+ controlled_onRefresh,
43
+ controlled_page,
44
+ controlled_setPage,
45
+ controlled_setPageSize,
46
+ controlled_total,
47
+ disabled: _disabled,
50
48
  disableSetPageSize,
51
- hideSetPageSize
49
+ entities,
50
+ entityCount,
51
+ hideSetPageSize,
52
+ hideTotalPages,
53
+ keepSelectionOnPageChange,
54
+ onRefresh: _onRefresh,
55
+ page: _page,
56
+ pageSize,
57
+ pagingDisabled,
58
+ persistPageSize = noop,
59
+ scrollToTop,
60
+ setPage: _setPage,
61
+ setPageSize: _setPageSize,
62
+ setSelectedEntityIdMap
52
63
  }) => {
64
+ const page = controlled_page || _page;
65
+ const total = controlled_total || entityCount;
66
+ const disabled = _disabled || pagingDisabled;
67
+ const onRefresh = controlled_onRefresh || _onRefresh;
68
+ const setPage = controlled_setPage || _setPage;
69
+ const setPageSize = controlled_setPageSize || _setPageSize;
70
+
71
+ const onPageChange = useCallback(() => {
72
+ const record = get(entities, "[0]");
73
+ if (
74
+ !keepSelectionOnPageChange &&
75
+ (!record || !getIdOrCodeOrIndex(record))
76
+ ) {
77
+ setSelectedEntityIdMap({});
78
+ }
79
+ scrollToTop();
80
+ }, [
81
+ entities,
82
+ keepSelectionOnPageChange,
83
+ scrollToTop,
84
+ setSelectedEntityIdMap
85
+ ]);
53
86
  // Define local state
54
87
  const [refetching, setRefetching] = useState(false);
55
88
 
@@ -128,6 +161,7 @@ const PagingTool = ({
128
161
  className={classNames(Classes.SELECT, Classes.MINIMAL)}
129
162
  >
130
163
  <select
164
+ name="page-size"
131
165
  className="paging-page-size"
132
166
  onChange={setPageSizeHandler}
133
167
  disabled={disabled || disableSetPageSize}
@@ -188,47 +222,4 @@ const PagingTool = ({
188
222
  );
189
223
  };
190
224
 
191
- export default compose(
192
- withProps(props => {
193
- const {
194
- entityCount,
195
- page,
196
- pageSize,
197
- disabled,
198
- pagingDisabled,
199
- onRefresh,
200
- controlled_setPage,
201
- controlled_setPageSize,
202
- controlled_page,
203
-
204
- controlled_total,
205
- controlled_onRefresh,
206
- setPage,
207
- setPageSize
208
- } = props;
209
- return {
210
- paging: {
211
- total: controlled_total || entityCount,
212
- page: controlled_page || page,
213
- pageSize
214
- },
215
- disabled: disabled || pagingDisabled,
216
- onRefresh: controlled_onRefresh || onRefresh,
217
- setPage: controlled_setPage || setPage,
218
- setPageSize: controlled_setPageSize || setPageSize
219
- };
220
- }),
221
- withHandlers({
222
- onPageChange:
223
- ({ entities, keepSelectionOnPageChange, change }) =>
224
- () => {
225
- const record = get(entities, "[0]");
226
- if (
227
- !keepSelectionOnPageChange &&
228
- (!record || !getIdOrCodeOrIndex(record))
229
- ) {
230
- change("reduxFormSelectedEntityIdMap", {});
231
- }
232
- }
233
- })
234
- )(PagingTool);
225
+ export default PagingTool;