@k-int/stripes-kint-components 5.15.0 → 5.16.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,3 +1,12 @@
1
+ # [5.16.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.15.0...v5.16.0) (2025-03-14)
2
+
3
+
4
+ ### Features
5
+
6
+ * Added ability for SASQLookupComponent to accept sasqProps.syncToLocation/query(Getter/Setter) and have that impact on results ([351b503](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/351b50313e0a320191b24fa1df6227103021f106))
7
+ * SASQRoute allow tweaking of SASQLookupComponent and SASQViewComponent component directly in SASQRoute ([6c812b2](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/6c812b2c4c10a049b8a9e56e624cc3dceee3a8fe))
8
+ * SASQRoute override paths for lookup/view ([994b976](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/994b976cbec3af6382066bc6bf6dd945d4a3e239))
9
+
1
10
  # [5.15.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.14.0...v5.15.0) (2025-02-21)
2
11
 
3
12
 
@@ -34,25 +34,26 @@ const NoResultsMessage = _ref => {
34
34
  searchTerm
35
35
  }
36
36
  });
37
-
38
- // No search term but no results
39
- if (!searchTerm) {
37
+ if (!isLoading && !searchTerm) {
38
+ // No search term and not loading
39
+ icon = filterPaneIsVisible ? 'arrow-left' : null;
40
+ label = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactIntl.FormattedMessage, {
41
+ id: "stripes-smart-components.sas.noResults.noTerms"
42
+ });
43
+ } else if (!isLoading) {
44
+ // Search term but not loading
40
45
  icon = 'search';
41
46
  label = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactIntl.FormattedMessage, {
42
47
  id: "stripes-smart-components.sas.noResults.noResults"
43
48
  });
44
- }
45
-
46
- // Loading results
47
- if (isLoading) {
49
+ } else if (isLoading) {
50
+ // Loading
48
51
  icon = 'spinner-ellipsis';
49
52
  label = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactIntl.FormattedMessage, {
50
53
  id: "stripes-smart-components.sas.noResults.loading"
51
54
  });
52
- }
53
-
54
- // Request failure
55
- if (isError) {
55
+ } else if (isError) {
56
+ // Request failure
56
57
  icon = 'exclamation-circle';
57
58
  label = error?.message;
58
59
  }
@@ -27,10 +27,12 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
27
27
  intlKey: passedIntlKey,
28
28
  intlNS: passedIntlNS,
29
29
  labelOverrides = {},
30
- mainPaneProps,
30
+ mainPaneProps = {},
31
31
  mclProps = {},
32
32
  noSearchField,
33
33
  persistedPanesetProps = {},
34
+ queryParameterGenerator = _utils.generateKiwtQuery,
35
+ // Expects a function which accepts SASQ_MAP and nsValues
34
36
  RenderBody,
35
37
  rowNavigation = true,
36
38
  // Default navigation onRowClick
@@ -40,28 +42,41 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
40
42
  } = props;
41
43
  const kintIntl = (0, _hooks.useKintIntl)(passedIntlKey, passedIntlNS);
42
44
  const [count, setCount] = (0, _react.useState)(0);
45
+
46
+ // Grab things we might need from sasqProps if passed
47
+ const {
48
+ query: sasqPropsQuery,
49
+ // If these are overriden we need to make use of them
50
+ queryGetter: sasqPropsQueryGetter,
51
+ querySetter: sasqPropsQuerySetter,
52
+ syncToLocation = true
53
+ } = sasqProps ?? {};
43
54
  const {
44
55
  currentPage,
45
56
  paginationMCLProps,
46
57
  paginationSASQProps
47
58
  } = (0, _hooks.usePrevNextPagination)({
48
59
  count,
49
- pageSize: fetchParameters.SASQ_MAP?.perPage
60
+ pageSize: fetchParameters.SASQ_MAP?.perPage,
61
+ syncToLocation
50
62
  });
51
63
  const {
52
- query,
53
- queryGetter,
54
- querySetter
64
+ query: kintSASQQuery,
65
+ queryGetter: kintSASQQueryGetter,
66
+ querySetter: kintSASQQuerySetter
55
67
  } = (0, _hooks.useKiwtSASQuery)();
68
+ const query = (0, _react.useMemo)(() => sasqPropsQuery ?? kintSASQQuery, [sasqPropsQuery, kintSASQQuery]);
69
+ const queryGetter = (0, _react.useMemo)(() => sasqPropsQueryGetter ?? kintSASQQueryGetter, [sasqPropsQueryGetter, kintSASQQueryGetter]);
70
+ const querySetter = (0, _react.useMemo)(() => sasqPropsQuerySetter ?? kintSASQQuerySetter, [sasqPropsQuerySetter, kintSASQQuerySetter]);
56
71
  const {
57
72
  0: namespace
58
73
  } = (0, _core.useNamespace)();
59
74
  const ky = (0, _core.useOkapiKy)();
60
75
  const filterPaneVisibileKey = `${namespace}-${id}-filterPaneVisibility`;
61
- const queryParams = (0, _react.useMemo)(() => (0, _utils.generateKiwtQuery)({
76
+ const queryParams = (0, _react.useMemo)(() => queryParameterGenerator({
62
77
  ...fetchParameters.SASQ_MAP,
63
78
  page: currentPage
64
- }, query ?? {}), [currentPage, fetchParameters.SASQ_MAP, query]);
79
+ }, query ?? {}), [currentPage, fetchParameters.SASQ_MAP, query, queryParameterGenerator]);
65
80
  const [filterPaneVisible, setFilterPaneVisible] = (0, _hooks.useLocalStorageState)(filterPaneVisibileKey, true);
66
81
  const toggleFilterPane = () => setFilterPaneVisible(!filterPaneVisible);
67
82
  const queryNamespace = [namespace, 'SASQ'];
@@ -97,6 +112,7 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
97
112
  },
98
113
  queryGetter: queryGetter,
99
114
  querySetter: querySetter,
115
+ syncToLocation: syncToLocation,
100
116
  ...sasqProps,
101
117
  ...paginationSASQProps,
102
118
  children: sasqRenderProps => {
@@ -246,6 +262,7 @@ SASQLookupComponent.propTypes = {
246
262
  filterPaneProps: _propTypes.default.object,
247
263
  FilterComponent: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
248
264
  FilterPaneHeaderComponent: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
265
+ queryParameterGenerator: _propTypes.default.func,
249
266
  history: _propTypes.default.object,
250
267
  id: _propTypes.default.string.isRequired,
251
268
  intlKey: _propTypes.default.string,
@@ -15,7 +15,11 @@ const SASQRoute = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
15
15
  let {
16
16
  children,
17
17
  fetchParameters,
18
+ getPathLookup = path => `${path}/:id?`,
19
+ getPathView = path => `${path}/:id`,
20
+ SASQLookupComponent: RouteLookupComponent = _SASQLookupComponent.SASQLookupComponent,
18
21
  path,
22
+ SASQViewComponent: RouteViewComponent = _SASQViewComponent.default,
19
23
  ...props
20
24
  } = _ref;
21
25
  // Grab the SASQ_MAP and tweak it
@@ -36,9 +40,9 @@ const SASQRoute = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
36
40
  // Reinsert the SASQ_MAP
37
41
  fetchParameters.SASQ_MAP = SASQ_MAP;
38
42
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Route, {
39
- path: `${path}/:id?`,
43
+ path: getPathLookup(path),
40
44
  render: routeProps => {
41
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SASQLookupComponent.SASQLookupComponent, {
45
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(RouteLookupComponent, {
42
46
  ref: lookupRef,
43
47
  ...routeProps,
44
48
  fetchParameters: fetchParameters,
@@ -46,8 +50,8 @@ const SASQRoute = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
46
50
  ...props,
47
51
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactRouterDom.Switch, {
48
52
  children: [children, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Route, {
49
- path: `${path}/:id`,
50
- render: innerProps => /*#__PURE__*/(0, _jsxRuntime.jsx)(_SASQViewComponent.default, {
53
+ path: getPathView(path),
54
+ render: innerProps => /*#__PURE__*/(0, _jsxRuntime.jsx)(RouteViewComponent, {
51
55
  ref: viewRef,
52
56
  ...innerProps,
53
57
  fetchParameters: fetchParameters,
@@ -64,7 +68,11 @@ const SASQRoute = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
64
68
  SASQRoute.propTypes = {
65
69
  children: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.element, _propTypes.default.func]),
66
70
  fetchParameters: _propTypes.default.object,
71
+ getPathLookup: _propTypes.default.func,
72
+ getPathView: _propTypes.default.func,
67
73
  path: _propTypes.default.string,
74
+ SASQLookupComponent: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
75
+ SASQViewComponent: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
68
76
  ViewComponent: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node])
69
77
  };
70
78
  var _default = exports.default = SASQRoute;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k-int/stripes-kint-components",
3
- "version": "5.15.0",
3
+ "version": "5.16.0",
4
4
  "description": "Stripes Component library for K-Int specific applications",
5
5
  "sideEffects": [
6
6
  "*.css"
@@ -44,7 +44,7 @@
44
44
  "@folio/jest-config-stripes": "^2.0.0 || ^3.0.0",
45
45
  "@folio/stripes": "^9.0.0 || ^10.0.0",
46
46
  "@folio/stripes-cli": "^3.0.0 || ^4.0.0",
47
- "@folio/stripes-erm-testing": "^2.0.0",
47
+ "@folio/stripes-erm-testing": "^2.0.0 || ^3.0.0",
48
48
  "@formatjs/cli": "^6.6.0",
49
49
  "@semantic-release/changelog": "^6.0.3",
50
50
  "@semantic-release/git": "^10.0.1",
@@ -23,20 +23,20 @@ const NoResultsMessage = ({
23
23
  let icon = 'search';
24
24
  let label = <FormattedMessage id="stripes-smart-components.sas.noResults.default" values={{ searchTerm }} />;
25
25
 
26
- // No search term but no results
27
- if (!searchTerm) {
26
+ if (!isLoading && !searchTerm) {
27
+ // No search term and not loading
28
+ icon = filterPaneIsVisible ? 'arrow-left' : null;
29
+ label = <FormattedMessage id="stripes-smart-components.sas.noResults.noTerms" />;
30
+ } else if (!isLoading) {
31
+ // Search term but not loading
28
32
  icon = 'search';
29
33
  label = <FormattedMessage id="stripes-smart-components.sas.noResults.noResults" />;
30
- }
31
-
32
- // Loading results
33
- if (isLoading) {
34
+ } else if (isLoading) {
35
+ // Loading
34
36
  icon = 'spinner-ellipsis';
35
37
  label = <FormattedMessage id="stripes-smart-components.sas.noResults.loading" />;
36
- }
37
-
38
- // Request failure
39
- if (isError) {
38
+ } else if (isError) {
39
+ // Request failure
40
40
  icon = 'exclamation-circle';
41
41
  label = error?.message;
42
42
  }
@@ -40,10 +40,11 @@ const SASQLookupComponent = forwardRef((props, ref) => {
40
40
  intlKey: passedIntlKey,
41
41
  intlNS: passedIntlNS,
42
42
  labelOverrides = {},
43
- mainPaneProps,
43
+ mainPaneProps = {},
44
44
  mclProps = {},
45
45
  noSearchField,
46
46
  persistedPanesetProps = {},
47
+ queryParameterGenerator = generateKiwtQuery, // Expects a function which accepts SASQ_MAP and nsValues
47
48
  RenderBody,
48
49
  rowNavigation = true, // Default navigation onRowClick
49
50
  sasqProps,
@@ -53,25 +54,43 @@ const SASQLookupComponent = forwardRef((props, ref) => {
53
54
  const kintIntl = useKintIntl(passedIntlKey, passedIntlNS);
54
55
  const [count, setCount] = useState(0);
55
56
 
57
+ // Grab things we might need from sasqProps if passed
58
+ const {
59
+ query: sasqPropsQuery, // If these are overriden we need to make use of them
60
+ queryGetter: sasqPropsQueryGetter,
61
+ querySetter: sasqPropsQuerySetter,
62
+ syncToLocation = true
63
+ } = sasqProps ?? {};
64
+
56
65
  const { currentPage, paginationMCLProps, paginationSASQProps } = usePrevNextPagination({
57
66
  count,
58
- pageSize: fetchParameters.SASQ_MAP?.perPage
67
+ pageSize: fetchParameters.SASQ_MAP?.perPage,
68
+ syncToLocation
59
69
  });
60
70
 
61
- const { query, queryGetter, querySetter } = useKiwtSASQuery();
71
+ const {
72
+ query: kintSASQQuery,
73
+ queryGetter: kintSASQQueryGetter,
74
+ querySetter: kintSASQQuerySetter
75
+ } = useKiwtSASQuery();
76
+
77
+ const query = useMemo(() => sasqPropsQuery ?? kintSASQQuery, [sasqPropsQuery, kintSASQQuery]);
78
+ const queryGetter = useMemo(() => sasqPropsQueryGetter ?? kintSASQQueryGetter, [sasqPropsQueryGetter, kintSASQQueryGetter]);
79
+ const querySetter = useMemo(() => sasqPropsQuerySetter ?? kintSASQQuerySetter, [sasqPropsQuerySetter, kintSASQQuerySetter]);
80
+
62
81
  const { 0: namespace } = useNamespace();
63
82
  const ky = useOkapiKy();
64
83
 
65
84
  const filterPaneVisibileKey = `${namespace}-${id}-filterPaneVisibility`;
66
85
 
67
86
  const queryParams = useMemo(() => (
68
- generateKiwtQuery(
87
+ queryParameterGenerator(
69
88
  {
70
89
  ...fetchParameters.SASQ_MAP,
71
90
  page: currentPage,
72
91
  }, (query ?? {})
73
92
  )
74
- ), [currentPage, fetchParameters.SASQ_MAP, query]);
93
+ ), [currentPage, fetchParameters.SASQ_MAP, query, queryParameterGenerator]);
75
94
 
76
95
  const [filterPaneVisible, setFilterPaneVisible] = useLocalStorageState(filterPaneVisibileKey, true);
77
96
  const toggleFilterPane = () => setFilterPaneVisible(!filterPaneVisible);
@@ -118,6 +137,7 @@ const SASQLookupComponent = forwardRef((props, ref) => {
118
137
  initialSearchState={{ query: '' }}
119
138
  queryGetter={queryGetter}
120
139
  querySetter={querySetter}
140
+ syncToLocation={syncToLocation}
121
141
  {...sasqProps}
122
142
  {...paginationSASQProps}
123
143
  >
@@ -315,6 +335,7 @@ SASQLookupComponent.propTypes = {
315
335
  PropTypes.func,
316
336
  PropTypes.node
317
337
  ]),
338
+ queryParameterGenerator: PropTypes.func,
318
339
  history: PropTypes.object,
319
340
  id: PropTypes.string.isRequired,
320
341
  intlKey: PropTypes.string,
@@ -12,7 +12,11 @@ import SASQViewComponent from '../SASQViewComponent';
12
12
  const SASQRoute = forwardRef(({
13
13
  children,
14
14
  fetchParameters,
15
+ getPathLookup = (path) => `${path}/:id?`,
16
+ getPathView = (path) => `${path}/:id`,
17
+ SASQLookupComponent: RouteLookupComponent = SASQLookupComponent,
15
18
  path,
19
+ SASQViewComponent: RouteViewComponent = SASQViewComponent,
16
20
  ...props
17
21
  }, ref) => {
18
22
  // Grab the SASQ_MAP and tweak it
@@ -37,10 +41,10 @@ const SASQRoute = forwardRef(({
37
41
 
38
42
  return (
39
43
  <Route
40
- path={`${path}/:id?`}
44
+ path={getPathLookup(path)}
41
45
  render={routeProps => {
42
46
  return (
43
- <SASQLookupComponent
47
+ <RouteLookupComponent
44
48
  ref={lookupRef}
45
49
  {...routeProps}
46
50
  fetchParameters={fetchParameters}
@@ -50,9 +54,9 @@ const SASQRoute = forwardRef(({
50
54
  <Switch>
51
55
  {children}
52
56
  <Route
53
- path={`${path}/:id`}
57
+ path={getPathView(path)}
54
58
  render={innerProps => (
55
- <SASQViewComponent
59
+ <RouteViewComponent
56
60
  ref={viewRef}
57
61
  {...innerProps}
58
62
  fetchParameters={fetchParameters}
@@ -63,7 +67,7 @@ const SASQRoute = forwardRef(({
63
67
  )}
64
68
  />
65
69
  </Switch>
66
- </SASQLookupComponent>
70
+ </RouteLookupComponent>
67
71
  );
68
72
  }}
69
73
  />
@@ -77,7 +81,17 @@ SASQRoute.propTypes = {
77
81
  PropTypes.func
78
82
  ]),
79
83
  fetchParameters: PropTypes.object,
84
+ getPathLookup: PropTypes.func,
85
+ getPathView: PropTypes.func,
80
86
  path: PropTypes.string,
87
+ SASQLookupComponent: PropTypes.oneOfType([
88
+ PropTypes.func,
89
+ PropTypes.node
90
+ ]),
91
+ SASQViewComponent: PropTypes.oneOfType([
92
+ PropTypes.func,
93
+ PropTypes.node
94
+ ]),
81
95
  ViewComponent: PropTypes.oneOfType([
82
96
  PropTypes.func,
83
97
  PropTypes.node