@k-int/stripes-kint-components 2.3.3 → 2.4.0

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,15 +1,19 @@
1
- ## 2.3.3 2022-04-04
2
- * Fixed inconsistent `retiredName` labelOverride function behaviour, where in `filters` the function accepted the name, and in `view` the function accepted the entire object. The behaviour has been standardised to be the name alone in both scenarios.
3
- * Fixed improper custom property count behaviour in view mode, now only _set_ primary properties are included in the count.
4
-
5
- ## 2.3.2 2022-04-01
1
+ ## 2.4.0 2022-04-21
2
+ * Custom Property component fixes
6
3
  * Fix to actionAssigner callback pattern
7
4
  * Tweak to remove marginBottom0 warning
8
5
  * FormModal buttons have marginBottom0 prop on them now
9
6
  * Fixed issue where cusotm property updates would not be reflected on the open view pane in settings
10
-
11
- ## 2.3.1 2022-03-28
12
- * Custom Property component fixes
7
+ * Fixed inconsistent `retiredName` labelOverride function behaviour, where in `filters` the function accepted the name, and in `view` the function accepted the entire object. The behaviour has been standardised to be the name alone in both scenarios.
8
+ * Fixed improper custom property count behaviour in view mode, now only _set_ primary properties are included in the count.
9
+ * ActionListFieldArray changed autofocus to autoFocus to avoid react console noise
10
+ * Refactored SASQ Components to fix various bugs/oddities
11
+ * TableBody default now exported as SASQTableBody from module
12
+ * Table now no longer redraws on row click
13
+ * Formatting tweaks to fix horizontal scroll issue
14
+ * Manually clearing the search field now has the same effect as clicking the "x" button to clear, ensuring the items are refetched without a search term.
15
+ * Implementor can pass props to the filter pane via "filterPaneProps" on SASQRoute/SASQLookupComponent
16
+ * boldString, highlightString, matchString util functions
13
17
 
14
18
  ## 2.3.0 2022-03-25
15
19
  * FormModal
package/es/index.js CHANGED
@@ -140,7 +140,7 @@ Object.defineProperty(exports, "RefdataButtons", {
140
140
  Object.defineProperty(exports, "SASQLookupComponent", {
141
141
  enumerable: true,
142
142
  get: function get() {
143
- return _SASQLookupComponent.default;
143
+ return _SASQLookupComponent.SASQLookupComponent;
144
144
  }
145
145
  });
146
146
  Object.defineProperty(exports, "SASQRoute", {
@@ -149,6 +149,12 @@ Object.defineProperty(exports, "SASQRoute", {
149
149
  return _SASQRoute.default;
150
150
  }
151
151
  });
152
+ Object.defineProperty(exports, "SASQTableBody", {
153
+ enumerable: true,
154
+ get: function get() {
155
+ return _SASQLookupComponent.TableBody;
156
+ }
157
+ });
152
158
  Object.defineProperty(exports, "SASQViewComponent", {
153
159
  enumerable: true,
154
160
  get: function get() {
@@ -185,6 +191,12 @@ Object.defineProperty(exports, "Typedown", {
185
191
  return _Typedown.default;
186
192
  }
187
193
  });
194
+ Object.defineProperty(exports, "boldString", {
195
+ enumerable: true,
196
+ get: function get() {
197
+ return _utils.boldString;
198
+ }
199
+ });
188
200
  Object.defineProperty(exports, "composeValidators", {
189
201
  enumerable: true,
190
202
  get: function get() {
@@ -210,12 +222,24 @@ Object.defineProperty(exports, "groupCustomPropertiesByCtx", {
210
222
  return _utils.groupCustomPropertiesByCtx;
211
223
  }
212
224
  });
225
+ Object.defineProperty(exports, "highlightString", {
226
+ enumerable: true,
227
+ get: function get() {
228
+ return _utils.highlightString;
229
+ }
230
+ });
213
231
  Object.defineProperty(exports, "invalidNumber", {
214
232
  enumerable: true,
215
233
  get: function get() {
216
234
  return _validators.invalidNumber;
217
235
  }
218
236
  });
237
+ Object.defineProperty(exports, "matchString", {
238
+ enumerable: true,
239
+ get: function get() {
240
+ return _utils.matchString;
241
+ }
242
+ });
219
243
  Object.defineProperty(exports, "refdataOptions", {
220
244
  enumerable: true,
221
245
  get: function get() {
@@ -371,7 +395,7 @@ var _SearchField = _interopRequireDefault(require("./lib/SearchField"));
371
395
 
372
396
  var _SASQRoute = _interopRequireDefault(require("./lib/SASQRoute"));
373
397
 
374
- var _SASQLookupComponent = _interopRequireDefault(require("./lib/SASQLookupComponent"));
398
+ var _SASQLookupComponent = require("./lib/SASQLookupComponent");
375
399
 
376
400
  var _SASQViewComponent = _interopRequireDefault(require("./lib/SASQViewComponent"));
377
401
 
@@ -322,7 +322,7 @@ var ActionListFieldArray = function ActionListFieldArray(_ref) {
322
322
  returnObj[key] = fieldComponents[key] ? fieldComponents[key]({
323
323
  name: "".concat(fieldName, ".").concat(key)
324
324
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFinalForm.Field, {
325
- autofocus: fieldIndex === 0,
325
+ autoFocus: fieldIndex === 0,
326
326
  component: _components.TextField,
327
327
  marginBottom0: true,
328
328
  name: "".concat(fieldName, ".").concat(key),
@@ -5,8 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _react = _interopRequireDefault(require("react"));
9
-
10
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
9
 
12
10
  var _reactIntl = require("react-intl");
@@ -19,14 +17,16 @@ var _smartComponents = require("@folio/stripes/smart-components");
19
17
 
20
18
  var _components = require("@folio/stripes/components");
21
19
 
22
- var _NoResultsMessage = _interopRequireDefault(require("../NoResultsMessage"));
23
-
24
20
  var _utils = require("../utils");
25
21
 
26
22
  var _hooks = require("../hooks");
27
23
 
24
+ var _TableBody = _interopRequireDefault(require("./TableBody"));
25
+
28
26
  var _jsxRuntime = require("react/jsx-runtime");
29
27
 
28
+ var _excluded = ["data"];
29
+
30
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
31
 
32
32
  (function () {
@@ -48,6 +48,10 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
48
48
 
49
49
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
50
50
 
51
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
52
+
53
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
54
+
51
55
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
52
56
 
53
57
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -64,32 +68,26 @@ var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoader
64
68
  return a;
65
69
  };
66
70
 
67
- var SASQLookupComponent = function SASQLookupComponent(_ref) {
71
+ var SASQLookupComponent = function SASQLookupComponent(props) {
68
72
  var _totalData$pages$redu, _totalData$pages;
69
73
 
70
- var _children = _ref.children,
71
- _ref$fetchParameters = _ref.fetchParameters,
72
- fetchParameters = _ref$fetchParameters === void 0 ? {} : _ref$fetchParameters,
73
- _ref$FilterPaneHeader = _ref.FilterPaneHeaderComponent,
74
- FilterPaneHeaderComponent = _ref$FilterPaneHeader === void 0 ? function () {
74
+ var _children = props.children,
75
+ _props$fetchParameter = props.fetchParameters,
76
+ fetchParameters = _props$fetchParameter === void 0 ? {} : _props$fetchParameter,
77
+ _props$FilterComponen = props.FilterComponent,
78
+ FilterComponent = _props$FilterComponen === void 0 ? function () {
75
79
  return null;
76
- } : _ref$FilterPaneHeader,
77
- _ref$FilterComponent = _ref.FilterComponent,
78
- FilterComponent = _ref$FilterComponent === void 0 ? function () {
80
+ } : _props$FilterComponen,
81
+ _props$FilterPaneHead = props.FilterPaneHeaderComponent,
82
+ FilterPaneHeaderComponent = _props$FilterPaneHead === void 0 ? function () {
79
83
  return null;
80
- } : _ref$FilterComponent,
81
- history = _ref.history,
82
- id = _ref.id,
83
- location = _ref.location,
84
- mainPaneProps = _ref.mainPaneProps,
85
- match = _ref.match,
86
- mclProps = _ref.mclProps,
87
- noSearchField = _ref.noSearchField,
88
- path = _ref.path,
89
- _ref$resultColumns = _ref.resultColumns,
90
- resultColumns = _ref$resultColumns === void 0 ? [] : _ref$resultColumns,
91
- RenderBody = _ref.RenderBody,
92
- sasqProps = _ref.sasqProps;
84
+ } : _props$FilterPaneHead,
85
+ filterPaneProps = props.filterPaneProps,
86
+ id = props.id,
87
+ mainPaneProps = props.mainPaneProps,
88
+ noSearchField = props.noSearchField,
89
+ RenderBody = props.RenderBody,
90
+ sasqProps = props.sasqProps;
93
91
 
94
92
  var _useKiwtSASQuery = (0, _hooks.useKiwtSASQuery)(),
95
93
  query = _useKiwtSASQuery.query,
@@ -102,9 +100,9 @@ var SASQLookupComponent = function SASQLookupComponent(_ref) {
102
100
  var ky = (0, _core.useOkapiKy)();
103
101
  var filterPaneVisibileKey = "".concat(namespace, "-").concat(id, "-filterPaneVisibility");
104
102
 
105
- var fetchPageData = function fetchPageData(_ref2) {
106
- var _ref2$pageParam = _ref2.pageParam,
107
- pageParam = _ref2$pageParam === void 0 ? 0 : _ref2$pageParam;
103
+ var fetchPageData = function fetchPageData(_ref) {
104
+ var _ref$pageParam = _ref.pageParam,
105
+ pageParam = _ref$pageParam === void 0 ? 0 : _ref$pageParam;
108
106
  var queryMap = fetchParameters.SASQ_MAP;
109
107
  queryMap.offset = pageParam;
110
108
  return ky("".concat(fetchParameters.endpoint).concat((0, _utils.generateKiwtQuery)(queryMap, query))).json();
@@ -122,10 +120,7 @@ var SASQLookupComponent = function SASQLookupComponent(_ref) {
122
120
  var _useInfiniteQuery = (0, _reactQuery.useInfiniteQuery)([namespace, id, 'data', query], fetchPageData),
123
121
  _useInfiniteQuery$dat = _useInfiniteQuery.data,
124
122
  totalData = _useInfiniteQuery$dat === void 0 ? {} : _useInfiniteQuery$dat,
125
- error = _useInfiniteQuery.error,
126
- isError = _useInfiniteQuery.isError,
127
- isLoading = _useInfiniteQuery.isLoading,
128
- fetchNextPage = _useInfiniteQuery.fetchNextPage;
123
+ restOfInfiniteQueryProps = _objectWithoutProperties(_useInfiniteQuery, _excluded);
129
124
 
130
125
  var data = (_totalData$pages$redu = (_totalData$pages = totalData.pages) === null || _totalData$pages === void 0 ? void 0 : _totalData$pages.reduce(function (acc, curr) {
131
126
  var _acc$results, _curr$results;
@@ -147,22 +142,7 @@ var SASQLookupComponent = function SASQLookupComponent(_ref) {
147
142
  newResults.push.apply(newResults, _toConsumableArray((_curr$results = curr.results) !== null && _curr$results !== void 0 ? _curr$results : []));
148
143
  newAcc.results = newResults;
149
144
  return newAcc;
150
- }, {})) !== null && _totalData$pages$redu !== void 0 ? _totalData$pages$redu : {}; // TODO focus handling to stop redraw movin to top
151
-
152
- var onNeedMoreData = function onNeedMoreData(_askAmount, index) {
153
- fetchNextPage({
154
- pageParam: index
155
- });
156
- }; // Build the map of column definitions
157
-
158
-
159
- var columnMapping = Object.fromEntries(resultColumns.map(function (e) {
160
- return [e.propertyPath, e.label];
161
- })); // Build the list of visible columns
162
-
163
- var visibleColumns = resultColumns.map(function (e) {
164
- return e.propertyPath;
165
- });
145
+ }, {})) !== null && _totalData$pages$redu !== void 0 ? _totalData$pages$redu : {};
166
146
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_smartComponents.SearchAndSortQuery, _objectSpread(_objectSpread({
167
147
  initialSearchState: {
168
148
  query: ''
@@ -170,61 +150,23 @@ var SASQLookupComponent = function SASQLookupComponent(_ref) {
170
150
  queryGetter: queryGetter,
171
151
  querySetter: querySetter
172
152
  }, sasqProps), {}, {
173
- children: function children(_ref3) {
174
- var _query$sort;
175
-
176
- var activeFilters = _ref3.activeFilters,
177
- filterChanged = _ref3.filterChanged,
178
- getFilterHandlers = _ref3.getFilterHandlers,
179
- getSearchHandlers = _ref3.getSearchHandlers,
180
- onSort = _ref3.onSort,
181
- onSubmitSearch = _ref3.onSubmitSearch,
182
- resetAll = _ref3.resetAll,
183
- searchChanged = _ref3.searchChanged,
184
- searchValue = _ref3.searchValue;
153
+ children: function children(sasqRenderProps) {
154
+ var activeFilters = sasqRenderProps.activeFilters,
155
+ filterChanged = sasqRenderProps.filterChanged,
156
+ getFilterHandlers = sasqRenderProps.getFilterHandlers,
157
+ getSearchHandlers = sasqRenderProps.getSearchHandlers,
158
+ onSubmitSearch = sasqRenderProps.onSubmitSearch,
159
+ resetAll = sasqRenderProps.resetAll,
160
+ searchChanged = sasqRenderProps.searchChanged,
161
+ searchValue = sasqRenderProps.searchValue;
185
162
  var searchHandlers = getSearchHandlers();
186
- var sortOrder = (_query$sort = query.sort) !== null && _query$sort !== void 0 ? _query$sort : '';
187
163
  var disableReset = !filterChanged && !searchChanged;
188
164
  var filterCount = activeFilters.string ? activeFilters.string.split(',').length : 0;
189
-
190
- var TableBody = function TableBody() {
191
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.MultiColumnList, _objectSpread({
192
- autosize: true,
193
- columnMapping: columnMapping,
194
- contentData: data === null || data === void 0 ? void 0 : data.results,
195
- isEmptyMessage: /*#__PURE__*/(0, _jsxRuntime.jsx)(_NoResultsMessage.default, {
196
- error: error,
197
- isError: isError,
198
- isLoading: isLoading,
199
- filterPaneIsVisible: filterPaneVisible,
200
- searchTerm: query.query,
201
- toggleFilterPane: toggleFilterPane
202
- }),
203
- isSelected: function isSelected(_ref4) {
204
- var _match$params;
205
-
206
- var item = _ref4.item;
207
- return item.id === (match === null || match === void 0 ? void 0 : (_match$params = match.params) === null || _match$params === void 0 ? void 0 : _match$params.id);
208
- },
209
- onHeaderClick: onSort,
210
- onNeedMoreData: onNeedMoreData,
211
- onRowClick: function onRowClick(_e, rowData) {
212
- history.push("".concat(path, "/").concat(rowData === null || rowData === void 0 ? void 0 : rowData.id).concat(location === null || location === void 0 ? void 0 : location.search));
213
- },
214
- pagingType: "click",
215
- sortDirection: sortOrder.startsWith('-') ? 'descending' : 'ascending',
216
- sortOrder: sortOrder.replace(/^-/, '').replace(/,.*/, ''),
217
- totalCount: data.totalRecords,
218
- virtualize: true,
219
- visibleColumns: visibleColumns
220
- }, mclProps));
221
- };
222
-
223
- var Body = RenderBody !== null && RenderBody !== void 0 ? RenderBody : TableBody;
165
+ var Body = RenderBody !== null && RenderBody !== void 0 ? RenderBody : _TableBody.default;
224
166
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_smartComponents.PersistedPaneset, {
225
167
  appId: namespace,
226
168
  id: "".concat(id, "-paneset"),
227
- children: [filterPaneVisible && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Pane, {
169
+ children: [filterPaneVisible && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Pane, _objectSpread(_objectSpread({
228
170
  defaultWidth: "20%",
229
171
  lastMenu: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.PaneMenu, {
230
172
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.IconButton, {
@@ -236,14 +178,23 @@ var SASQLookupComponent = function SASQLookupComponent(_ref) {
236
178
  }),
237
179
  paneTitle: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactIntl.FormattedMessage, {
238
180
  id: "stripes-smart-components.searchAndFilter"
239
- }),
181
+ })
182
+ }, filterPaneProps), {}, {
240
183
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("form", {
241
184
  onSubmit: onSubmitSearch,
242
185
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(FilterPaneHeaderComponent, {}), !noSearchField && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
243
186
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_components.SearchField, {
244
187
  autoFocus: true,
245
188
  name: "query",
246
- onChange: searchHandlers.query,
189
+ onChange: function onChange(e) {
190
+ var _e$target;
191
+
192
+ if ((_e$target = e.target) !== null && _e$target !== void 0 && _e$target.value) {
193
+ searchHandlers.query(e); // SASQ needs the whole event here
194
+ } else {
195
+ searchHandlers.reset();
196
+ }
197
+ },
247
198
  onClear: searchHandlers.reset,
248
199
  value: searchValue.query
249
200
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Button, {
@@ -276,7 +227,7 @@ var SASQLookupComponent = function SASQLookupComponent(_ref) {
276
227
  searchValue: searchValue
277
228
  })]
278
229
  })
279
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Pane, _objectSpread(_objectSpread({
230
+ })), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Pane, _objectSpread(_objectSpread({
280
231
  defaultWidth: "fill",
281
232
  firstMenu: !filterPaneVisible ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.PaneMenu, {
282
233
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.IconButton, {
@@ -287,6 +238,8 @@ var SASQLookupComponent = function SASQLookupComponent(_ref) {
287
238
  }
288
239
  })
289
240
  }) : null,
241
+ noOverflow: true,
242
+ padContent: false,
290
243
  paneSub: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactIntl.FormattedMessage, {
291
244
  id: "stripes-kint-components.sasqLookupComponent.mainPane.found",
292
245
  values: {
@@ -294,22 +247,25 @@ var SASQLookupComponent = function SASQLookupComponent(_ref) {
294
247
  }
295
248
  })
296
249
  }, mainPaneProps), {}, {
297
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Body, {
298
- data: data
299
- })
250
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Body, _objectSpread(_objectSpread(_objectSpread({
251
+ data: data,
252
+ query: query,
253
+ toggleFilterPane: toggleFilterPane
254
+ }, restOfInfiniteQueryProps), sasqProps), props))
300
255
  })), _children]
301
256
  });
302
257
  }
303
258
  }));
304
259
  };
305
260
 
306
- __signature__(SASQLookupComponent, "useKiwtSASQuery{{ query, queryGetter, querySetter }}\nuseNamespace{{ 0: namespace }}\nuseOkapiKy{ky}\nuseLocalStorageState{[filterPaneVisible, setFilterPaneVisible]}\nuseInfiniteQuery{{\n data: totalData = {},\n error,\n isError,\n isLoading,\n fetchNextPage,\n }}", function () {
261
+ __signature__(SASQLookupComponent, "useKiwtSASQuery{{ query, queryGetter, querySetter }}\nuseNamespace{{ 0: namespace }}\nuseOkapiKy{ky}\nuseLocalStorageState{[filterPaneVisible, setFilterPaneVisible]}\nuseInfiniteQuery{{\n data: totalData = {},\n ...restOfInfiniteQueryProps\n }}", function () {
307
262
  return [_hooks.useKiwtSASQuery, _core.useNamespace, _core.useOkapiKy, _hooks.useLocalStorageState, _reactQuery.useInfiniteQuery];
308
263
  });
309
264
 
310
265
  SASQLookupComponent.propTypes = {
311
266
  children: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
312
267
  fetchParameters: _propTypes.default.object,
268
+ filterPaneProps: _propTypes.default.object,
313
269
  FilterComponent: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
314
270
  FilterPaneHeaderComponent: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
315
271
  history: _propTypes.default.object,
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+
10
+ var _reactRouterDom = require("react-router-dom");
11
+
12
+ var _components = require("@folio/stripes/components");
13
+
14
+ var _NoResultsMessage = _interopRequireDefault(require("../../NoResultsMessage"));
15
+
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ (function () {
21
+ var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;
22
+ enterModule && enterModule(module);
23
+ })();
24
+
25
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
26
+
27
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
28
+
29
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
30
+
31
+ var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
32
+ return a;
33
+ };
34
+
35
+ var TableBody = function TableBody(_ref) {
36
+ var _query$sort;
37
+
38
+ var data = _ref.data,
39
+ error = _ref.error,
40
+ fetchNextPage = _ref.fetchNextPage,
41
+ filterPaneVisible = _ref.filterPaneVisible,
42
+ isError = _ref.isError,
43
+ isLoading = _ref.isLoading,
44
+ match = _ref.match,
45
+ mclProps = _ref.mclProps,
46
+ onSort = _ref.onSort,
47
+ path = _ref.path,
48
+ resultColumns = _ref.resultColumns,
49
+ toggleFilterPane = _ref.toggleFilterPane,
50
+ query = _ref.query;
51
+ var sortOrder = (_query$sort = query.sort) !== null && _query$sort !== void 0 ? _query$sort : '';
52
+ var history = (0, _reactRouterDom.useHistory)();
53
+ var location = (0, _reactRouterDom.useLocation)();
54
+
55
+ var onNeedMoreData = function onNeedMoreData(_askAmount, index) {
56
+ fetchNextPage({
57
+ pageParam: index
58
+ });
59
+ }; // Build the map of column definitions
60
+
61
+
62
+ var columnMapping = Object.fromEntries(resultColumns.map(function (e) {
63
+ return [e.propertyPath, e.label];
64
+ })); // Build the list of visible columns
65
+
66
+ var visibleColumns = resultColumns.map(function (e) {
67
+ return e.propertyPath;
68
+ });
69
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.MultiColumnList, _objectSpread({
70
+ autosize: true,
71
+ columnMapping: columnMapping,
72
+ contentData: data === null || data === void 0 ? void 0 : data.results,
73
+ hasMargin: true,
74
+ isEmptyMessage: /*#__PURE__*/(0, _jsxRuntime.jsx)(_NoResultsMessage.default, {
75
+ error: error,
76
+ isError: isError,
77
+ isLoading: isLoading,
78
+ filterPaneIsVisible: filterPaneVisible,
79
+ searchTerm: query.query,
80
+ toggleFilterPane: toggleFilterPane
81
+ }),
82
+ isSelected: function isSelected(_ref2) {
83
+ var _match$params;
84
+
85
+ var item = _ref2.item;
86
+ return item.id === (match === null || match === void 0 ? void 0 : (_match$params = match.params) === null || _match$params === void 0 ? void 0 : _match$params.id);
87
+ },
88
+ onHeaderClick: onSort,
89
+ onNeedMoreData: onNeedMoreData,
90
+ onRowClick: function onRowClick(_e, rowData) {
91
+ history.push("".concat(path, "/").concat(rowData === null || rowData === void 0 ? void 0 : rowData.id).concat(location === null || location === void 0 ? void 0 : location.search));
92
+ },
93
+ pagingType: "click",
94
+ sortDirection: sortOrder.startsWith('-') ? 'descending' : 'ascending',
95
+ sortOrder: sortOrder.replace(/^-/, '').replace(/,.*/, ''),
96
+ totalCount: data.totalRecords,
97
+ visibleColumns: visibleColumns
98
+ }, mclProps));
99
+ };
100
+
101
+ __signature__(TableBody, "useHistory{history}\nuseLocation{location}", function () {
102
+ return [_reactRouterDom.useHistory, _reactRouterDom.useLocation];
103
+ });
104
+
105
+ TableBody.propTypes = {
106
+ data: _propTypes.default.shape({
107
+ totalRecords: _propTypes.default.number,
108
+ results: _propTypes.default.arrayOf(_propTypes.default.object)
109
+ }),
110
+ error: _propTypes.default.object,
111
+ fetchNextPage: _propTypes.default.func,
112
+ filterPaneVisible: _propTypes.default.bool,
113
+ history: _propTypes.default.object,
114
+ isError: _propTypes.default.bool,
115
+ isLoading: _propTypes.default.bool,
116
+ location: _propTypes.default.object,
117
+ match: _propTypes.default.object,
118
+ mclProps: _propTypes.default.object,
119
+ onSort: _propTypes.default.func,
120
+ path: _propTypes.default.string.isRequired,
121
+ query: _propTypes.default.object,
122
+ resultColumns: _propTypes.default.arrayOf(_propTypes.default.object),
123
+ toggleFilterPane: _propTypes.default.func
124
+ };
125
+ var _default = TableBody;
126
+ var _default2 = _default;
127
+ exports.default = _default2;
128
+ ;
129
+
130
+ (function () {
131
+ var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;
132
+
133
+ if (!reactHotLoader) {
134
+ return;
135
+ }
136
+
137
+ reactHotLoader.register(TableBody, "TableBody", "/home/ethan/FolioModules/stripes-kint-components/src/lib/SASQLookupComponent/TableBody/TableBody.js");
138
+ reactHotLoader.register(_default, "default", "/home/ethan/FolioModules/stripes-kint-components/src/lib/SASQLookupComponent/TableBody/TableBody.js");
139
+ })();
140
+
141
+ ;
142
+
143
+ (function () {
144
+ var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;
145
+ leaveModule && leaveModule(module);
146
+ })();
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _TableBody.default;
10
+ }
11
+ });
12
+
13
+ var _TableBody = _interopRequireDefault(require("./TableBody"));
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+
17
+ var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
18
+ return a;
19
+ };
@@ -3,15 +3,23 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- Object.defineProperty(exports, "default", {
6
+ Object.defineProperty(exports, "SASQLookupComponent", {
7
7
  enumerable: true,
8
8
  get: function get() {
9
9
  return _SASQLookupComponent.default;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "TableBody", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _TableBody.default;
16
+ }
17
+ });
12
18
 
13
19
  var _SASQLookupComponent = _interopRequireDefault(require("./SASQLookupComponent"));
14
20
 
21
+ var _TableBody = _interopRequireDefault(require("./TableBody"));
22
+
15
23
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
24
 
17
25
  var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
@@ -11,7 +11,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
12
12
  var _reactRouterDom = require("react-router-dom");
13
13
 
14
- var _SASQLookupComponent = _interopRequireDefault(require("../SASQLookupComponent"));
14
+ var _SASQLookupComponent = require("../SASQLookupComponent");
15
15
 
16
16
  var _SASQViewComponent = _interopRequireDefault(require("../SASQViewComponent"));
17
17
 
@@ -60,7 +60,7 @@ var SASQRoute = function SASQRoute(_ref) {
60
60
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Route, {
61
61
  path: "".concat(path, "/:id?"),
62
62
  render: function render(routeProps) {
63
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SASQLookupComponent.default, _objectSpread(_objectSpread(_objectSpread({}, routeProps), {}, {
63
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SASQLookupComponent.SASQLookupComponent, _objectSpread(_objectSpread(_objectSpread({}, routeProps), {}, {
64
64
  fetchParameters: fetchParameters,
65
65
  path: path
66
66
  }, props), {}, {
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.highlightString = exports.boldString = void 0;
7
+
8
+ var _matchString5 = _interopRequireDefault(require("./matchString"));
9
+
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ (function () {
15
+ var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;
16
+ enterModule && enterModule(module);
17
+ })();
18
+
19
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
20
+
21
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
22
+
23
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
24
+
25
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
26
+
27
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
28
+
29
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
30
+
31
+ var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
32
+ return a;
33
+ };
34
+
35
+ var highlightString = function highlightString(match, str) {
36
+ var ignoreNull = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
37
+
38
+ var _matchString = (0, _matchString5.default)(match, str, ignoreNull),
39
+ _matchString2 = _slicedToArray(_matchString, 2),
40
+ parts = _matchString2[0],
41
+ regex = _matchString2[1];
42
+
43
+ return parts.filter(function (part) {
44
+ return part;
45
+ }).map(function (part, i) {
46
+ return regex.test(part) ? /*#__PURE__*/(0, _jsxRuntime.jsx)("mark", {
47
+ children: part
48
+ }, i) : /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
49
+ children: part
50
+ }, i);
51
+ });
52
+ };
53
+
54
+ exports.highlightString = highlightString;
55
+
56
+ var boldString = function boldString(match, str) {
57
+ var ignoreNull = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
58
+
59
+ var _matchString3 = (0, _matchString5.default)(match, str, ignoreNull),
60
+ _matchString4 = _slicedToArray(_matchString3, 2),
61
+ parts = _matchString4[0],
62
+ regex = _matchString4[1];
63
+
64
+ return parts.filter(function (part) {
65
+ return part;
66
+ }).map(function (part, i) {
67
+ return regex.test(part) ? /*#__PURE__*/(0, _jsxRuntime.jsx)("strong", {
68
+ children: part
69
+ }, i) : /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
70
+ children: part
71
+ }, i);
72
+ });
73
+ };
74
+
75
+ exports.boldString = boldString;
76
+ ;
77
+
78
+ (function () {
79
+ var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;
80
+
81
+ if (!reactHotLoader) {
82
+ return;
83
+ }
84
+
85
+ reactHotLoader.register(highlightString, "highlightString", "/home/ethan/FolioModules/stripes-kint-components/src/lib/utils/highlightString.js");
86
+ reactHotLoader.register(boldString, "boldString", "/home/ethan/FolioModules/stripes-kint-components/src/lib/utils/highlightString.js");
87
+ })();
88
+
89
+ ;
90
+
91
+ (function () {
92
+ var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;
93
+ leaveModule && leaveModule(module);
94
+ })();
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "boldString", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _highlightString.boldString;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "buildUrl", {
7
13
  enumerable: true,
8
14
  get: function get() {
@@ -27,6 +33,18 @@ Object.defineProperty(exports, "groupCustomPropertiesByCtx", {
27
33
  return _groupCustomPropertiesByCtx.default;
28
34
  }
29
35
  });
36
+ Object.defineProperty(exports, "highlightString", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _highlightString.highlightString;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "matchString", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _matchString.default;
46
+ }
47
+ });
30
48
  Object.defineProperty(exports, "refdataOptions", {
31
49
  enumerable: true,
32
50
  get: function get() {
@@ -92,8 +110,12 @@ var _sortByLabel = _interopRequireDefault(require("./sortByLabel"));
92
110
 
93
111
  var _toCamelCase = _interopRequireDefault(require("./toCamelCase"));
94
112
 
113
+ var _matchString = _interopRequireDefault(require("./matchString"));
114
+
115
+ var _highlightString = require("./highlightString");
116
+
95
117
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
96
118
 
97
119
  var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
98
120
  return a;
99
- }; // I hate that this exists
121
+ };
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _escapeRegExp = _interopRequireDefault(require("lodash/escapeRegExp"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ (function () {
13
+ var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;
14
+ enterModule && enterModule(module);
15
+ })();
16
+
17
+ var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
18
+ return a;
19
+ };
20
+
21
+ var matchString = function matchString(match, str) {
22
+ var ignoreNull = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
23
+ var regex = new RegExp("".concat(match.split(/(\s+)/).filter(function (h) {
24
+ return h.trim();
25
+ }).map(function (hl) {
26
+ return '(' + (0, _escapeRegExp.default)(hl) + ')';
27
+ }).join('|')), 'gi');
28
+
29
+ if (ignoreNull && !match) {
30
+ var nullRegex = /a^/gi; // Should match nothing
31
+
32
+ return [[str], nullRegex];
33
+ }
34
+
35
+ return [str.split(regex), regex];
36
+ };
37
+
38
+ var _default = matchString;
39
+ var _default2 = _default;
40
+ exports.default = _default2;
41
+ ;
42
+
43
+ (function () {
44
+ var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;
45
+
46
+ if (!reactHotLoader) {
47
+ return;
48
+ }
49
+
50
+ reactHotLoader.register(matchString, "matchString", "/home/ethan/FolioModules/stripes-kint-components/src/lib/utils/matchString.js");
51
+ reactHotLoader.register(_default, "default", "/home/ethan/FolioModules/stripes-kint-components/src/lib/utils/matchString.js");
52
+ })();
53
+
54
+ ;
55
+
56
+ (function () {
57
+ var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;
58
+ leaveModule && leaveModule(module);
59
+ })();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k-int/stripes-kint-components",
3
- "version": "2.3.3",
3
+ "version": "2.4.0",
4
4
  "description": "Stripes Component library for K-Int specific applications",
5
5
  "sideEffects": [
6
6
  "*.css"
package/src/index.js CHANGED
@@ -18,9 +18,12 @@ export {
18
18
 
19
19
  // Useful utility functions
20
20
  export {
21
+ boldString,
21
22
  generateKiwtQuery,
22
23
  generateKiwtQueryParams,
23
24
  groupCustomPropertiesByCtx,
25
+ highlightString,
26
+ matchString,
24
27
  refdataOptions,
25
28
  refdataQueryKey,
26
29
  selectorSafe,
@@ -59,6 +62,7 @@ export {
59
62
  default as QueryTypedown
60
63
  } from './lib/QueryTypedown';
61
64
 
65
+ /* SASQ Stuff */
62
66
  // SearchField
63
67
  export {
64
68
  default as SearchField
@@ -71,7 +75,8 @@ export {
71
75
 
72
76
  // SASQLookupComponent
73
77
  export {
74
- default as SASQLookupComponent
78
+ SASQLookupComponent,
79
+ TableBody as SASQTableBody
75
80
  } from './lib/SASQLookupComponent';
76
81
 
77
82
  // SASQViewComponent
@@ -228,7 +228,7 @@ const ActionListFieldArray = ({
228
228
  name: `${fieldName}.${key}`
229
229
  }) :
230
230
  <Field
231
- autofocus={fieldIndex === 0}
231
+ autoFocus={fieldIndex === 0}
232
232
  component={TextField}
233
233
  marginBottom0
234
234
  name={`${fieldName}.${key}`}
@@ -1,4 +1,3 @@
1
- import React from 'react';
2
1
  import PropTypes from 'prop-types';
3
2
  import { FormattedMessage } from 'react-intl';
4
3
  import { useInfiniteQuery } from 'react-query';
@@ -17,34 +16,30 @@ import {
17
16
  Button,
18
17
  IconButton,
19
18
  Icon,
20
- MultiColumnList,
21
19
  Pane,
22
20
  PaneMenu,
23
21
  SearchField,
24
22
  } from '@folio/stripes/components';
25
- import NoResultsMessage from '../NoResultsMessage';
26
23
 
27
24
  import { generateKiwtQuery } from '../utils';
28
25
  import { useKiwtSASQuery, useLocalStorageState } from '../hooks';
29
26
 
27
+ import TableBody from './TableBody';
28
+
29
+ const SASQLookupComponent = (props) => {
30
+ const {
31
+ children,
32
+ fetchParameters = {},
33
+ FilterComponent = () => null,
34
+ FilterPaneHeaderComponent = () => null,
35
+ filterPaneProps,
36
+ id,
37
+ mainPaneProps,
38
+ noSearchField,
39
+ RenderBody,
40
+ sasqProps,
41
+ } = props;
30
42
 
31
- const SASQLookupComponent = ({
32
- children,
33
- fetchParameters = {},
34
- FilterPaneHeaderComponent = () => null,
35
- FilterComponent = () => null,
36
- history,
37
- id,
38
- location,
39
- mainPaneProps,
40
- match,
41
- mclProps,
42
- noSearchField,
43
- path,
44
- resultColumns = [],
45
- RenderBody,
46
- sasqProps,
47
- }) => {
48
43
  const { query, queryGetter, querySetter } = useKiwtSASQuery();
49
44
  const { 0: namespace } = useNamespace();
50
45
  const ky = useOkapiKy();
@@ -62,10 +57,7 @@ const SASQLookupComponent = ({
62
57
 
63
58
  const {
64
59
  data: totalData = {},
65
- error,
66
- isError,
67
- isLoading,
68
- fetchNextPage,
60
+ ...restOfInfiniteQueryProps
69
61
  } = useInfiniteQuery(
70
62
  [namespace, id, 'data', query],
71
63
  fetchPageData
@@ -93,20 +85,6 @@ const SASQLookupComponent = ({
93
85
  {}
94
86
  ) ?? {};
95
87
 
96
- // TODO focus handling to stop redraw movin to top
97
-
98
- const onNeedMoreData = (_askAmount, index) => {
99
- fetchNextPage({ pageParam: index });
100
- };
101
-
102
- // Build the map of column definitions
103
- const columnMapping = Object.fromEntries(
104
- resultColumns.map(e => [e.propertyPath, e.label])
105
- );
106
-
107
- // Build the list of visible columns
108
- const visibleColumns = resultColumns.map(e => e.propertyPath);
109
-
110
88
  return (
111
89
  <SearchAndSortQuery
112
90
  initialSearchState={{ query: '' }}
@@ -115,56 +93,23 @@ const SASQLookupComponent = ({
115
93
  {...sasqProps}
116
94
  >
117
95
  {
118
- ({
96
+ (sasqRenderProps) => {
97
+ const {
119
98
  activeFilters,
120
99
  filterChanged,
121
100
  getFilterHandlers,
122
101
  getSearchHandlers,
123
- onSort,
124
102
  onSubmitSearch,
125
103
  resetAll,
126
104
  searchChanged,
127
105
  searchValue
128
- }) => {
106
+ } = sasqRenderProps;
107
+
129
108
  const searchHandlers = getSearchHandlers();
130
- const sortOrder = query.sort ?? '';
131
109
  const disableReset = !filterChanged && !searchChanged;
132
110
 
133
111
  const filterCount = activeFilters.string ? activeFilters.string.split(',').length : 0;
134
112
 
135
- const TableBody = () => (
136
- <MultiColumnList
137
- autosize
138
- columnMapping={columnMapping}
139
- contentData={data?.results}
140
- isEmptyMessage={
141
- <NoResultsMessage
142
- {...{
143
- error,
144
- isError,
145
- isLoading,
146
- filterPaneIsVisible: filterPaneVisible,
147
- searchTerm: query.query,
148
- toggleFilterPane
149
- }}
150
- />
151
- }
152
- isSelected={({ item }) => item.id === match?.params?.id}
153
- onHeaderClick={onSort}
154
- onNeedMoreData={onNeedMoreData}
155
- onRowClick={(_e, rowData) => {
156
- history.push(`${path}/${rowData?.id}${location?.search}`);
157
- }}
158
- pagingType="click"
159
- sortDirection={sortOrder.startsWith('-') ? 'descending' : 'ascending'}
160
- sortOrder={sortOrder.replace(/^-/, '').replace(/,.*/, '')}
161
- totalCount={data.totalRecords}
162
- virtualize
163
- visibleColumns={visibleColumns}
164
- {...mclProps}
165
- />
166
- );
167
-
168
113
  const Body = RenderBody ?? TableBody;
169
114
 
170
115
  return (
@@ -184,6 +129,7 @@ const SASQLookupComponent = ({
184
129
  </PaneMenu>
185
130
  }
186
131
  paneTitle={<FormattedMessage id="stripes-smart-components.searchAndFilter" />}
132
+ {...filterPaneProps}
187
133
  >
188
134
  <form onSubmit={onSubmitSearch}>
189
135
  <FilterPaneHeaderComponent />
@@ -192,7 +138,13 @@ const SASQLookupComponent = ({
192
138
  <SearchField
193
139
  autoFocus
194
140
  name="query"
195
- onChange={searchHandlers.query}
141
+ onChange={e => {
142
+ if (e.target?.value) {
143
+ searchHandlers.query(e); // SASQ needs the whole event here
144
+ } else {
145
+ searchHandlers.reset();
146
+ }
147
+ }}
196
148
  onClear={searchHandlers.reset}
197
149
  value={searchValue.query}
198
150
  />
@@ -240,10 +192,19 @@ const SASQLookupComponent = ({
240
192
  </PaneMenu>
241
193
  :
242
194
  null}
195
+ noOverflow
196
+ padContent={false}
243
197
  paneSub={<FormattedMessage id="stripes-kint-components.sasqLookupComponent.mainPane.found" values={{ total: data?.total }} />}
244
198
  {...mainPaneProps}
245
199
  >
246
- <Body data={data} />
200
+ <Body
201
+ data={data}
202
+ query={query}
203
+ toggleFilterPane={toggleFilterPane}
204
+ {...restOfInfiniteQueryProps}
205
+ {...sasqProps}
206
+ {...props}
207
+ />
247
208
  </Pane>
248
209
  {children}
249
210
  </PersistedPaneset>
@@ -260,6 +221,7 @@ SASQLookupComponent.propTypes = {
260
221
  PropTypes.node
261
222
  ]),
262
223
  fetchParameters: PropTypes.object,
224
+ filterPaneProps: PropTypes.object,
263
225
  FilterComponent: PropTypes.oneOfType([
264
226
  PropTypes.func,
265
227
  PropTypes.node
@@ -0,0 +1,96 @@
1
+ import PropTypes from 'prop-types';
2
+
3
+ import { useHistory, useLocation } from 'react-router-dom';
4
+
5
+ import {
6
+ MultiColumnList,
7
+ } from '@folio/stripes/components';
8
+ import NoResultsMessage from '../../NoResultsMessage';
9
+
10
+ const TableBody = ({
11
+ data,
12
+ error,
13
+ fetchNextPage,
14
+ filterPaneVisible,
15
+ isError,
16
+ isLoading,
17
+ match,
18
+ mclProps,
19
+ onSort,
20
+ path,
21
+ resultColumns,
22
+ toggleFilterPane,
23
+ query,
24
+ }) => {
25
+ const sortOrder = query.sort ?? '';
26
+ const history = useHistory();
27
+ const location = useLocation();
28
+
29
+ const onNeedMoreData = (_askAmount, index) => {
30
+ fetchNextPage({ pageParam: index });
31
+ };
32
+
33
+ // Build the map of column definitions
34
+ const columnMapping = Object.fromEntries(
35
+ resultColumns.map(e => [e.propertyPath, e.label])
36
+ );
37
+
38
+ // Build the list of visible columns
39
+ const visibleColumns = resultColumns.map(e => e.propertyPath);
40
+
41
+ return (
42
+ <MultiColumnList
43
+ autosize
44
+ columnMapping={columnMapping}
45
+ contentData={data?.results}
46
+ hasMargin
47
+ isEmptyMessage={
48
+ <NoResultsMessage
49
+ {...{
50
+ error,
51
+ isError,
52
+ isLoading,
53
+ filterPaneIsVisible: filterPaneVisible,
54
+ searchTerm: query.query,
55
+ toggleFilterPane
56
+ }}
57
+ />
58
+ }
59
+ isSelected={({ item }) => item.id === match?.params?.id}
60
+ onHeaderClick={onSort}
61
+ onNeedMoreData={onNeedMoreData}
62
+ onRowClick={(_e, rowData) => {
63
+ history.push(`${path}/${rowData?.id}${location?.search}`);
64
+ }}
65
+ pagingType="click"
66
+ sortDirection={sortOrder.startsWith('-') ? 'descending' : 'ascending'}
67
+ sortOrder={sortOrder.replace(/^-/, '').replace(/,.*/, '')}
68
+ totalCount={data.totalRecords}
69
+ visibleColumns={visibleColumns}
70
+ {...mclProps}
71
+ />
72
+ );
73
+ };
74
+
75
+ TableBody.propTypes = {
76
+ data: PropTypes.shape({
77
+ totalRecords: PropTypes.number,
78
+ results: PropTypes.arrayOf(PropTypes.object)
79
+ }),
80
+ error: PropTypes.object,
81
+ fetchNextPage: PropTypes.func,
82
+ filterPaneVisible: PropTypes.bool,
83
+ history: PropTypes.object,
84
+ isError: PropTypes.bool,
85
+ isLoading: PropTypes.bool,
86
+ location: PropTypes.object,
87
+ match: PropTypes.object,
88
+ mclProps: PropTypes.object,
89
+ onSort: PropTypes.func,
90
+ path: PropTypes.string.isRequired,
91
+ query: PropTypes.object,
92
+ resultColumns: PropTypes.arrayOf(PropTypes.object),
93
+ toggleFilterPane: PropTypes.func
94
+ };
95
+
96
+ export default TableBody;
@@ -0,0 +1 @@
1
+ export { default } from './TableBody';
@@ -1 +1,2 @@
1
- export { default } from './SASQLookupComponent';
1
+ export { default as SASQLookupComponent } from './SASQLookupComponent';
2
+ export { default as TableBody } from './TableBody';
@@ -6,7 +6,7 @@ import {
6
6
  Switch
7
7
  } from 'react-router-dom';
8
8
 
9
- import SASQLookupComponent from '../SASQLookupComponent';
9
+ import { SASQLookupComponent } from '../SASQLookupComponent';
10
10
  import SASQViewComponent from '../SASQViewComponent';
11
11
 
12
12
  const SASQRoute = ({ children, path, fetchParameters, ...props }) => {
@@ -0,0 +1,42 @@
1
+ import matchString from './matchString';
2
+
3
+ const highlightString = (match, str, ignoreNull = true) => {
4
+ const [parts, regex] = matchString(match, str, ignoreNull);
5
+
6
+ return (
7
+ parts.filter(part => part).map((part, i) => (
8
+ regex.test(part) ?
9
+ <mark
10
+ key={i}
11
+ >
12
+ {part}
13
+ </mark> :
14
+ <span key={i}>
15
+ {part}
16
+ </span>
17
+ ))
18
+ );
19
+ };
20
+
21
+ const boldString = (match, str, ignoreNull = true) => {
22
+ const [parts, regex] = matchString(match, str, ignoreNull);
23
+
24
+ return (
25
+ parts.filter(part => part).map((part, i) => (
26
+ regex.test(part) ?
27
+ <strong
28
+ key={i}
29
+ >
30
+ {part}
31
+ </strong> :
32
+ <span key={i}>
33
+ {part}
34
+ </span>
35
+ ))
36
+ );
37
+ };
38
+
39
+ export {
40
+ boldString,
41
+ highlightString
42
+ };
@@ -15,3 +15,7 @@ export { default as groupCustomPropertiesByCtx } from './groupCustomPropertiesBy
15
15
  export { default as renderHelpText } from './renderHelpText';
16
16
  export { default as sortByLabel } from './sortByLabel';
17
17
  export { default as toCamelCase } from './toCamelCase'; // I hate that this exists
18
+
19
+
20
+ export { default as matchString } from './matchString';
21
+ export { boldString, highlightString } from './highlightString';
@@ -0,0 +1,14 @@
1
+ import escapeRegExp from 'lodash/escapeRegExp';
2
+
3
+ const matchString = (match, str, ignoreNull = true) => {
4
+ const regex = new RegExp(`${match.split(/(\s+)/).filter(h => h.trim()).map(hl => '(' + escapeRegExp(hl) + ')').join('|')}`, 'gi')
5
+ if (ignoreNull && !match) {
6
+ const nullRegex = /a^/gi; // Should match nothing
7
+
8
+ return [[str], nullRegex];
9
+ }
10
+
11
+ return [str.split(regex), regex];
12
+ };
13
+
14
+ export default matchString;