@dhis2/analytics 23.13.3 → 23.13.4

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [23.13.4](https://github.com/dhis2/analytics/compare/v23.13.3...v23.13.4) (2022-08-05)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * request first page when sorting/filtering ([#1301](https://github.com/dhis2/analytics/issues/1301)) ([125e2af](https://github.com/dhis2/analytics/commit/125e2af84c19c81a9f8665d3e0cf2a88aaffdbda))
7
+
1
8
  ## [23.13.3](https://github.com/dhis2/analytics/compare/v23.13.2...v23.13.3) (2022-08-02)
2
9
 
3
10
 
@@ -79,25 +79,28 @@ const OpenFileDialog = _ref2 => {
79
79
  onNew,
80
80
  currentUser
81
81
  } = _ref2;
82
- const filesQuery = (0, _react.useMemo)(() => getQuery(type), []);
82
+ const filesQuery = (0, _react.useMemo)(() => getQuery(type), [type]);
83
83
  const defaultFilters = {
84
84
  searchTerm: '',
85
85
  createdBy: _CreatedByFilter.CREATED_BY_ALL,
86
86
  visType: defaultFilterVisType
87
87
  };
88
88
  const [{
89
+ page,
89
90
  sortField,
90
- sortDirection
91
- }, setSorting] = (0, _react.useState)({
91
+ sortDirection,
92
+ filters
93
+ }, setState] = (0, _react.useReducer)((state, newState) => ({ ...state,
94
+ ...newState
95
+ }), {
96
+ page: 1,
92
97
  sortField: 'displayName',
93
- sortDirection: 'asc'
98
+ sortDirection: 'asc',
99
+ filters: defaultFilters
94
100
  });
95
- const [page, setPage] = (0, _react.useState)(1);
96
101
  const [nameFilterValue, setNameFilterValue] = (0, _react.useState)(defaultFilters.searchTerm);
97
102
  const [searchTimeout, setSearchTimeout] = (0, _react.useState)(null);
98
- const [filters, setFilters] = (0, _react.useState)(defaultFilters);
99
-
100
- const formatFilters = () => {
103
+ const formatFilters = (0, _react.useCallback)(() => {
101
104
  const queryFilters = [];
102
105
 
103
106
  switch (filters.createdBy) {
@@ -134,8 +137,7 @@ const OpenFileDialog = _ref2 => {
134
137
  }
135
138
 
136
139
  return queryFilters;
137
- };
138
-
140
+ }, [currentUser, filters]);
139
141
  const {
140
142
  loading,
141
143
  error,
@@ -146,10 +148,29 @@ const OpenFileDialog = _ref2 => {
146
148
  });
147
149
 
148
150
  const resetFilters = () => {
149
- setFilters(defaultFilters);
151
+ setState({
152
+ filters: defaultFilters,
153
+ page: 1
154
+ });
150
155
  setNameFilterValue(defaultFilters.searchTerm);
151
156
  };
152
157
 
158
+ const setPage = pageNum => setState({
159
+ page: pageNum
160
+ });
161
+
162
+ const sortData = _ref3 => {
163
+ let {
164
+ name,
165
+ direction
166
+ } = _ref3;
167
+ return setState({
168
+ sortField: name,
169
+ sortDirection: direction,
170
+ page: 1
171
+ });
172
+ };
173
+
153
174
  (0, _react.useEffect)(() => {
154
175
  // only fetch data when the dialog is open
155
176
  if (open) {
@@ -160,19 +181,7 @@ const OpenFileDialog = _ref2 => {
160
181
  filters: formatFilters()
161
182
  });
162
183
  }
163
- }, [open, page, sortField, sortDirection]);
164
- (0, _react.useEffect)(() => {
165
- // avoid fetching data when the dialog is first rendered (hidden)
166
- if (open) {
167
- // reset pagination when filters are applied/changed
168
- setPage(1);
169
- refetch({
170
- sortField,
171
- sortDirection,
172
- filters: formatFilters()
173
- });
174
- }
175
- }, [filters]);
184
+ }, [open, page, sortField, sortDirection, filters, refetch, formatFilters]);
176
185
  const headers = [{
177
186
  field: 'displayName',
178
187
  label: _d2I18n.default.t('Name'),
@@ -216,8 +225,11 @@ const OpenFileDialog = _ref2 => {
216
225
  onChange: value => {
217
226
  setNameFilterValue(value);
218
227
  clearTimeout(searchTimeout);
219
- setSearchTimeout(setTimeout(() => setFilters({ ...filters,
220
- searchTerm: value
228
+ setSearchTimeout(setTimeout(() => setState({
229
+ page: 1,
230
+ filters: { ...filters,
231
+ searchTerm: value
232
+ }
221
233
  }), 200));
222
234
  }
223
235
  })), (filterVisTypes === null || filterVisTypes === void 0 ? void 0 : filterVisTypes.length) && /*#__PURE__*/_react.default.createElement("div", {
@@ -225,15 +237,21 @@ const OpenFileDialog = _ref2 => {
225
237
  }, /*#__PURE__*/_react.default.createElement(_VisTypeFilter.VisTypeFilter, {
226
238
  visTypes: filterVisTypes,
227
239
  selected: filters.visType,
228
- onChange: value => setFilters({ ...filters,
229
- visType: value
240
+ onChange: value => setState({
241
+ page: 1,
242
+ filters: { ...filters,
243
+ visType: value
244
+ }
230
245
  })
231
246
  })), /*#__PURE__*/_react.default.createElement("div", {
232
247
  className: "jsx-".concat(_OpenFileDialogStyles.styles.__hash) + " " + "created-by-field-container"
233
248
  }, /*#__PURE__*/_react.default.createElement(_CreatedByFilter.CreatedByFilter, {
234
249
  selected: filters.createdBy,
235
- onChange: value => setFilters({ ...filters,
236
- createdBy: value
250
+ onChange: value => setState({
251
+ page: 1,
252
+ filters: { ...filters,
253
+ createdBy: value
254
+ }
237
255
  })
238
256
  })), !(0, _isEqual.default)(filters, defaultFilters) && /*#__PURE__*/_react.default.createElement(_ui.Button, {
239
257
  onClick: resetFilters,
@@ -246,26 +264,17 @@ const OpenFileDialog = _ref2 => {
246
264
  className: "jsx-".concat(_OpenFileDialogStyles.styles.__hash) + " " + "data-table-wrapper"
247
265
  }, /*#__PURE__*/_react.default.createElement(_ui.DataTable, {
248
266
  layout: "fixed"
249
- }, /*#__PURE__*/_react.default.createElement(_ui.DataTableHead, null, /*#__PURE__*/_react.default.createElement(_ui.DataTableRow, null, data !== null && data !== void 0 && data.files[_utils.AOTypeMap[type].apiEndpoint].length ? headers.map(_ref3 => {
267
+ }, /*#__PURE__*/_react.default.createElement(_ui.DataTableHead, null, /*#__PURE__*/_react.default.createElement(_ui.DataTableRow, null, data !== null && data !== void 0 && data.files[_utils.AOTypeMap[type].apiEndpoint].length ? headers.map(_ref4 => {
250
268
  let {
251
269
  field,
252
270
  label,
253
271
  width
254
- } = _ref3;
272
+ } = _ref4;
255
273
  return /*#__PURE__*/_react.default.createElement(_ui.DataTableColumnHeader, {
256
274
  width: width,
257
275
  key: field,
258
276
  name: field,
259
- onSortIconClick: _ref4 => {
260
- let {
261
- name,
262
- direction
263
- } = _ref4;
264
- return setSorting({
265
- sortField: name,
266
- sortDirection: direction
267
- });
268
- },
277
+ onSortIconClick: sortData,
269
278
  sortDirection: getSortDirection(field)
270
279
  }, label);
271
280
  }) : /*#__PURE__*/_react.default.createElement(_ui.DataTableColumnHeader, null))), /*#__PURE__*/_react.default.createElement(_ui.DataTableBody, {
@@ -4,7 +4,7 @@ import i18n from '@dhis2/d2-i18n';
4
4
  import { Box, Modal, ModalTitle, ModalContent, DataTable, DataTableHead, DataTableBody, DataTableRow, DataTableCell, DataTableColumnHeader, NoticeBox, CircularLoader, Button } from '@dhis2/ui';
5
5
  import isEqual from 'lodash/isEqual';
6
6
  import PropTypes from 'prop-types';
7
- import React, { useEffect, useMemo, useState } from 'react';
7
+ import React, { useCallback, useEffect, useMemo, useReducer, useState } from 'react';
8
8
  import { VIS_TYPE_GROUP_ALL, VIS_TYPE_GROUP_CHARTS } from '../../modules/visTypes.js';
9
9
  import { CreatedByFilter, CREATED_BY_ALL, CREATED_BY_ALL_BUT_CURRENT_USER, CREATED_BY_CURRENT_USER } from './CreatedByFilter.js';
10
10
  import { FileList } from './FileList.js';
@@ -52,25 +52,28 @@ export const OpenFileDialog = _ref2 => {
52
52
  onNew,
53
53
  currentUser
54
54
  } = _ref2;
55
- const filesQuery = useMemo(() => getQuery(type), []);
55
+ const filesQuery = useMemo(() => getQuery(type), [type]);
56
56
  const defaultFilters = {
57
57
  searchTerm: '',
58
58
  createdBy: CREATED_BY_ALL,
59
59
  visType: defaultFilterVisType
60
60
  };
61
61
  const [{
62
+ page,
62
63
  sortField,
63
- sortDirection
64
- }, setSorting] = useState({
64
+ sortDirection,
65
+ filters
66
+ }, setState] = useReducer((state, newState) => ({ ...state,
67
+ ...newState
68
+ }), {
69
+ page: 1,
65
70
  sortField: 'displayName',
66
- sortDirection: 'asc'
71
+ sortDirection: 'asc',
72
+ filters: defaultFilters
67
73
  });
68
- const [page, setPage] = useState(1);
69
74
  const [nameFilterValue, setNameFilterValue] = useState(defaultFilters.searchTerm);
70
75
  const [searchTimeout, setSearchTimeout] = useState(null);
71
- const [filters, setFilters] = useState(defaultFilters);
72
-
73
- const formatFilters = () => {
76
+ const formatFilters = useCallback(() => {
74
77
  const queryFilters = [];
75
78
 
76
79
  switch (filters.createdBy) {
@@ -107,8 +110,7 @@ export const OpenFileDialog = _ref2 => {
107
110
  }
108
111
 
109
112
  return queryFilters;
110
- };
111
-
113
+ }, [currentUser, filters]);
112
114
  const {
113
115
  loading,
114
116
  error,
@@ -119,10 +121,29 @@ export const OpenFileDialog = _ref2 => {
119
121
  });
120
122
 
121
123
  const resetFilters = () => {
122
- setFilters(defaultFilters);
124
+ setState({
125
+ filters: defaultFilters,
126
+ page: 1
127
+ });
123
128
  setNameFilterValue(defaultFilters.searchTerm);
124
129
  };
125
130
 
131
+ const setPage = pageNum => setState({
132
+ page: pageNum
133
+ });
134
+
135
+ const sortData = _ref3 => {
136
+ let {
137
+ name,
138
+ direction
139
+ } = _ref3;
140
+ return setState({
141
+ sortField: name,
142
+ sortDirection: direction,
143
+ page: 1
144
+ });
145
+ };
146
+
126
147
  useEffect(() => {
127
148
  // only fetch data when the dialog is open
128
149
  if (open) {
@@ -133,19 +154,7 @@ export const OpenFileDialog = _ref2 => {
133
154
  filters: formatFilters()
134
155
  });
135
156
  }
136
- }, [open, page, sortField, sortDirection]);
137
- useEffect(() => {
138
- // avoid fetching data when the dialog is first rendered (hidden)
139
- if (open) {
140
- // reset pagination when filters are applied/changed
141
- setPage(1);
142
- refetch({
143
- sortField,
144
- sortDirection,
145
- filters: formatFilters()
146
- });
147
- }
148
- }, [filters]);
157
+ }, [open, page, sortField, sortDirection, filters, refetch, formatFilters]);
149
158
  const headers = [{
150
159
  field: 'displayName',
151
160
  label: i18n.t('Name'),
@@ -189,8 +198,11 @@ export const OpenFileDialog = _ref2 => {
189
198
  onChange: value => {
190
199
  setNameFilterValue(value);
191
200
  clearTimeout(searchTimeout);
192
- setSearchTimeout(setTimeout(() => setFilters({ ...filters,
193
- searchTerm: value
201
+ setSearchTimeout(setTimeout(() => setState({
202
+ page: 1,
203
+ filters: { ...filters,
204
+ searchTerm: value
205
+ }
194
206
  }), 200));
195
207
  }
196
208
  })), (filterVisTypes === null || filterVisTypes === void 0 ? void 0 : filterVisTypes.length) && /*#__PURE__*/React.createElement("div", {
@@ -198,15 +210,21 @@ export const OpenFileDialog = _ref2 => {
198
210
  }, /*#__PURE__*/React.createElement(VisTypeFilter, {
199
211
  visTypes: filterVisTypes,
200
212
  selected: filters.visType,
201
- onChange: value => setFilters({ ...filters,
202
- visType: value
213
+ onChange: value => setState({
214
+ page: 1,
215
+ filters: { ...filters,
216
+ visType: value
217
+ }
203
218
  })
204
219
  })), /*#__PURE__*/React.createElement("div", {
205
220
  className: "jsx-".concat(styles.__hash) + " " + "created-by-field-container"
206
221
  }, /*#__PURE__*/React.createElement(CreatedByFilter, {
207
222
  selected: filters.createdBy,
208
- onChange: value => setFilters({ ...filters,
209
- createdBy: value
223
+ onChange: value => setState({
224
+ page: 1,
225
+ filters: { ...filters,
226
+ createdBy: value
227
+ }
210
228
  })
211
229
  })), !isEqual(filters, defaultFilters) && /*#__PURE__*/React.createElement(Button, {
212
230
  onClick: resetFilters,
@@ -219,26 +237,17 @@ export const OpenFileDialog = _ref2 => {
219
237
  className: "jsx-".concat(styles.__hash) + " " + "data-table-wrapper"
220
238
  }, /*#__PURE__*/React.createElement(DataTable, {
221
239
  layout: "fixed"
222
- }, /*#__PURE__*/React.createElement(DataTableHead, null, /*#__PURE__*/React.createElement(DataTableRow, null, data !== null && data !== void 0 && data.files[AOTypeMap[type].apiEndpoint].length ? headers.map(_ref3 => {
240
+ }, /*#__PURE__*/React.createElement(DataTableHead, null, /*#__PURE__*/React.createElement(DataTableRow, null, data !== null && data !== void 0 && data.files[AOTypeMap[type].apiEndpoint].length ? headers.map(_ref4 => {
223
241
  let {
224
242
  field,
225
243
  label,
226
244
  width
227
- } = _ref3;
245
+ } = _ref4;
228
246
  return /*#__PURE__*/React.createElement(DataTableColumnHeader, {
229
247
  width: width,
230
248
  key: field,
231
249
  name: field,
232
- onSortIconClick: _ref4 => {
233
- let {
234
- name,
235
- direction
236
- } = _ref4;
237
- return setSorting({
238
- sortField: name,
239
- sortDirection: direction
240
- });
241
- },
250
+ onSortIconClick: sortData,
242
251
  sortDirection: getSortDirection(field)
243
252
  }, label);
244
253
  }) : /*#__PURE__*/React.createElement(DataTableColumnHeader, null))), /*#__PURE__*/React.createElement(DataTableBody, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dhis2/analytics",
3
- "version": "23.13.3",
3
+ "version": "23.13.4",
4
4
  "main": "./build/cjs/index.js",
5
5
  "module": "./build/es/index.js",
6
6
  "exports": {