@k-int/stripes-kint-components 5.12.0 → 5.14.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,17 @@
1
+ # [5.14.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.13.0...v5.14.0) (2025-02-19)
2
+
3
+
4
+ ### Features
5
+
6
+ * Added filterConfig options to generateKiwtQueryParams ([8502b91](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/8502b91beef93065a24c1b1ab6ed4b73759b851d))
7
+
8
+ # [5.13.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.12.0...v5.13.0) (2025-02-17)
9
+
10
+
11
+ ### Features
12
+
13
+ * On rendering SASQLookupComponent, do not fetch resources until a query is provided ([00c45a5](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/00c45a54307d1564d15e6d1268fc067c2c04994e))
14
+
1
15
  # [5.12.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.11.0...v5.12.0) (2025-02-13)
2
16
 
3
17
 
@@ -77,7 +77,7 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
77
77
  } = (0, _reactQuery.useQuery)(queryNamespace, () => {
78
78
  return ky.get(`${fetchParameters.endpoint}${queryParams}`).json();
79
79
  }, {
80
- enabled: !!currentPage
80
+ enabled: (!!query?.filters || !!query?.query) && !!currentPage
81
81
  });
82
82
  (0, _react.useEffect)(() => {
83
83
  if (count !== data?.totalRecords) {
@@ -4,11 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _generateKiwtQueryParams = _interopRequireDefault(require("./generateKiwtQueryParams"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ var _generateKiwtQueryParams = require("./generateKiwtQueryParams");
9
8
  const generateKiwtQuery = function (options, nsValues) {
10
9
  let encode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
11
- const paramsArray = (0, _generateKiwtQueryParams.default)(options, nsValues, encode);
10
+ const paramsArray = (0, _generateKiwtQueryParams.generateKiwtQueryParams)(options, nsValues, encode);
12
11
  return paramsArray.length ? '?' + paramsArray.join('&') : '';
13
12
  };
14
13
  var _default = exports.default = generateKiwtQuery;
@@ -134,8 +134,11 @@ const generateKiwtQueryParams = function (options, nsValues) {
134
134
  if (filterConfigEntry) {
135
135
  // We have a direct mapping instruction, use it
136
136
  const filterString = filterValues.map(v => {
137
- const fceValue = filterConfigEntry?.values?.find(fce => fce.name === v)?.value;
138
- return `${filterName}==${fceValue ?? v}`;
137
+ const fcValueEntry = filterConfigEntry?.values?.find(fce => fce.name === v) ?? {};
138
+ const fceValue = fcValueEntry.value ?? v;
139
+ // This is especially useful where comparator acts strangely for a single value, such as `filters=foo isNotSet`
140
+ const fceComparator = fcValueEntry.comparator ?? '==';
141
+ return `${filterKey ?? filterName}${fceComparator}${fceValue ?? v}`;
139
142
  }).join('||');
140
143
  paramsArray.push(`filters=${conditionalEncodeURIComponent(filterString, encode)}`);
141
144
  } else if (!filterKey) {
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "generateKiwtQueryParams", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _generateKiwtQueryParams.default;
10
+ }
11
+ });
12
+ var _generateKiwtQueryParams = _interopRequireDefault(require("./generateKiwtQueryParams"));
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -36,7 +36,7 @@ Object.defineProperty(exports, "generateKiwtQuery", {
36
36
  Object.defineProperty(exports, "generateKiwtQueryParams", {
37
37
  enumerable: true,
38
38
  get: function () {
39
- return _generateKiwtQueryParams.default;
39
+ return _generateKiwtQueryParams.generateKiwtQueryParams;
40
40
  }
41
41
  });
42
42
  Object.defineProperty(exports, "groupCustomPropertiesByCtx", {
@@ -136,7 +136,7 @@ Object.defineProperty(exports, "typedownQueryKey", {
136
136
  }
137
137
  });
138
138
  var _generateKiwtQuery = _interopRequireDefault(require("./generateKiwtQuery"));
139
- var _generateKiwtQueryParams = _interopRequireDefault(require("./generateKiwtQueryParams"));
139
+ var _generateKiwtQueryParams = require("./generateKiwtQueryParams");
140
140
  var _selectorSafe = _interopRequireDefault(require("./selectorSafe"));
141
141
  var _buildUrl = _interopRequireDefault(require("./buildUrl"));
142
142
  var _refdataOptions = _interopRequireDefault(require("./refdataOptions"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k-int/stripes-kint-components",
3
- "version": "5.12.0",
3
+ "version": "5.14.0",
4
4
  "description": "Stripes Component library for K-Int specific applications",
5
5
  "sideEffects": [
6
6
  "*.css"
@@ -93,7 +93,7 @@ const SASQLookupComponent = forwardRef((props, ref) => {
93
93
  return ky.get(`${fetchParameters.endpoint}${queryParams}`).json();
94
94
  },
95
95
  {
96
- enabled: !!currentPage,
96
+ enabled: (!!query?.filters || !!query?.query) && !!currentPage,
97
97
  }
98
98
  );
99
99
 
@@ -3,7 +3,7 @@
3
3
  ## generateKiwtQuery
4
4
 
5
5
  The `generateKiwtQuery` function generates a URL query string in "KIWT" (K-Int Web Toolkit) style from a SASQ (Search and Sort Query) object. It handles search terms, filters, sorting, and other parameters, making it easy to construct complex query strings for backend APIs.
6
-
6
+ This component calls and then joins the output of `generateKiwtQueryParams`. For more granular information on how this works, see the generateKiwtQueryParams README.
7
7
  ### Basic Usage
8
8
 
9
9
  ```javascript
@@ -39,105 +39,3 @@ const queryString = generateKiwtQuery(options, nsValues);
39
39
  | options | object | An object with keys: `searchKey`, `filterKeys`, `sortKeys`, and `stats`, which maps the incoming `nsValues` object to a KIWT query. You can also pass arbitrary `key`/`value` pairs to append `key==value` onto the query. | | ✓ |
40
40
  | nsValues | object | An object containing the query parameters. Can contain `query`, `filters`, and `sort`, as well as any other arbitrary parameters. | | ✓ |
41
41
  | encode | boolean | A boolean indicating whether to URL-encode the values. | `true` | ✕ |
42
-
43
- ## generateKiwtQueryParams
44
-
45
- The `generateKiwtQueryParams` function is similar to `generateKiwtQuery`, but instead of returning a string, it returns an array of query parameters. This can be useful for more advanced use cases where you need to manipulate the parameters before constructing the final query string.
46
-
47
- ### Basic Usage
48
-
49
- ```javascript
50
- import { generateKiwtQueryParams } from '@k-int/stripes-kint-components';
51
-
52
- const nsValues = {
53
- query: 'test',
54
- filters: 'requestStatus.completed,journalVolume.test1,startDate.startDate>=2021-10-28'
55
- };
56
-
57
- const options = {
58
- searchKey: 'request.name',
59
- filterKeys: {
60
- requestStatus: 'requestStatus.value',
61
- journalVolume: 'journalVolume'
62
- }
63
- };
64
-
65
- const queryArray = generateKiwtQueryParams(options, nsValues);
66
-
67
- // queryArray will be:
68
- // [
69
- // "match=request.name",
70
- // "term=test",
71
- // "filters=requestStatus.value==completed",
72
- // "filters=journalVolume==test1",
73
- // "filters=startDate%3E=2021-10-28",
74
- // "stats=true"
75
- // ]
76
- ```
77
-
78
- ### Props
79
-
80
- | Name | Type | Description | Default | Required |
81
- |---|---|---|---|---|
82
- | options | object | An object with keys: `searchKey`, `filterKeys`, `sortKeys`, and `stats`, which maps the incoming `nsValues` object to a KIWT query array. You can also pass arbitrary `key`/`value` pairs to append `key==value` onto the query. | | ✓ |
83
- | nsValues | object | An object containing the query parameters. Can contain `query`, `filters`, and `sort`, as well as any other arbitrary parameters. | | ✓ |
84
- | encode | boolean | A boolean indicating whether to URL-encode the values. | `true` | ✕ |
85
-
86
-
87
- ### Options Parameter Structure
88
-
89
- The `options` parameter is a powerful tool for customizing the query string generation. It has the following key elements:
90
-
91
- * **Search:**
92
- * `searchKey`: Specifies the field to search on. If using SASQ, the corresponding value in `nsValues.query` will be used as the search term. Otherwise, you can directly specify the search term using the `term` key in `options`.
93
- * **Filters:** See the "Filters Object Structure" section below for details.
94
- * **Sorting:**
95
- * `sortKeys`: An object mapping sort field names from `nsValues.sort` to their corresponding backend keys.
96
- * `sort`: An array of sort objects. Each object can have `path` (field to sort on) and `direction` (`asc` or `desc`).
97
- * **Statistics:**
98
- * `stats`: A boolean value indicating whether to include the `stats=true` parameter.
99
- * **Other parameters:** Any other key-value pairs in the `options` object will be directly added as query parameters.
100
-
101
-
102
- ### Filters Object Structure
103
-
104
- The `filters` option in the `options` parameter allows you to define complex filter expressions using an array of filter objects. Each filter object can have the following properties:
105
-
106
- * **path:** The path to the field to filter on (e.g., `item.title`).
107
- * **comparator:** *(Optional)* The comparator to use for the filter (e.g., `==`, `!=`, `>`, `<`). Defaults to `==`.
108
- * **value:** A single value to filter on.
109
- * **values:** An array of values to filter on. If present, this property takes precedence over `value`, and an `OR` condition is implied between the values.
110
- * **groupValues:** An object defining nested filter groups with `AND` or `OR` logic. This property allows for building complex nested filters. See the explanation below.
111
-
112
- #### Nested Filter Groups (`groupValues`)
113
-
114
- The `groupValues` property enables the creation of nested filter expressions with `AND` and `OR` logic. It is an object with either `AND` or `OR` properties (or both, with `AND` taking precedence). The value of these properties should be an array of filter objects, allowing for recursive nesting.
115
-
116
- ```javascript
117
- // Example: (status==active AND type==local) OR (status==pending)
118
- const filters = [
119
- {
120
- groupValues: {
121
- OR: [
122
- {
123
- groupValues: {
124
- AND: [
125
- { path: 'item.status', value: 'active' },
126
- { path: 'item.type', value: 'local' },
127
- ],
128
- }
129
- },
130
- { path: 'item.status', value: 'pending' },
131
- ]
132
- },
133
- },
134
- ];
135
- ```
136
-
137
- This structure allows you to express complex filter logic in a clear and organized way.
138
-
139
- ### Key Takeaways
140
-
141
- * `generateKiwtQuery` provides a flexible way to construct URL query strings for backend APIs, especially when working with Stripes SASQ.
142
- * The `options` parameter offers fine-grained control over the query generation process, allowing for complex filtering, sorting, and other customizations.
143
- * `generateKiwtQueryParams` is useful for advanced use cases where you need to manipulate the parameters before constructing the final query string.
@@ -1,4 +1,4 @@
1
- import generateKiwtQueryParams from './generateKiwtQueryParams';
1
+ import { generateKiwtQueryParams } from './generateKiwtQueryParams';
2
2
 
3
3
  const generateKiwtQuery = (options, nsValues, encode = true) => {
4
4
  const paramsArray = generateKiwtQueryParams(options, nsValues, encode);
@@ -0,0 +1,199 @@
1
+ # generateKiwtQueryParams
2
+
3
+ The `generateKiwtQueryParams` function is similar to `generateKiwtQuery`, but instead of returning a string, it returns an array of query parameters. This can be useful for more advanced use cases where you need to manipulate the parameters before constructing the final query string.
4
+
5
+ ## Basic Usage
6
+
7
+ ```javascript
8
+ import { generateKiwtQueryParams } from '@k-int/stripes-kint-components';
9
+
10
+ const nsValues = {
11
+ query: 'test',
12
+ filters: 'requestStatus.completed,journalVolume.test1,startDate.startDate>=2021-10-28'
13
+ };
14
+
15
+ const options = {
16
+ searchKey: 'request.name',
17
+ filterKeys: {
18
+ requestStatus: 'requestStatus.value',
19
+ journalVolume: 'journalVolume'
20
+ }
21
+ };
22
+
23
+ const queryArray = generateKiwtQueryParams(options, nsValues);
24
+
25
+ // queryArray will be:
26
+ // [
27
+ // "match=request.name",
28
+ // "term=test",
29
+ // "filters=requestStatus.value==completed",
30
+ // "filters=journalVolume==test1",
31
+ // "filters=startDate%3E=2021-10-28",
32
+ // "stats=true"
33
+ // ]
34
+ ```
35
+
36
+ ## Props
37
+
38
+ | Name | Type | Description | Default | Required |
39
+ |---|---|---|---|---|
40
+ | options | object | An object with keys: `searchKey`, `filterKeys`, `sortKeys`, and `stats`, which maps the incoming `nsValues` object to a KIWT query array. You can also pass arbitrary `key`/`value` pairs to append `key==value` onto the query. | | ✓ |
41
+ | nsValues | object | An object containing the query parameters. Can contain `query`, `filters`, and `sort`, as well as any other arbitrary parameters. | | ✓ |
42
+ | encode | boolean | A boolean indicating whether to URL-encode the values. | `true` | ✕ |
43
+
44
+
45
+ ## Options Parameter Structure
46
+
47
+ The `options` parameter is a powerful tool for customizing the query string generation manually. It has the following key elements:
48
+
49
+ * **Search:**
50
+ * `searchKey`: Specifies the field to search on. If using SASQ, the corresponding value in `nsValues.query` will be used as the search term. Otherwise, you can directly specify the search term using the `term` key in `options`.
51
+ * **Filters:** See the "Filters Object Structure" section below for details.
52
+ * **Sorting:**
53
+ * `sortKeys`: An object mapping sort field names from `nsValues.sort` to their corresponding backend keys.
54
+ * `sort`: An array of sort objects. Each object can have `path` (field to sort on) and `direction` (`asc` or `desc`).
55
+ * **Statistics:**
56
+ * `stats`: A boolean value indicating whether to include the `stats=true` parameter.
57
+ * **Other parameters:** Any other key-value pairs in the `options` object will be directly added as query parameters.
58
+
59
+
60
+ ### Filters Object Structure
61
+
62
+ The `filters` option in the `options` parameter allows you to define complex filter expressions using an array of filter objects. Each filter object can have the following properties:
63
+
64
+ * **path:** The path to the field to filter on (e.g., `item.title`).
65
+ * **comparator:** *(Optional)* The comparator to use for the filter (e.g., `==`, `!=`, `>`, `<`). Defaults to `==`.
66
+ * **value:** A single value to filter on.
67
+ * **values:** An array of values to filter on. If present, this property takes precedence over `value`, and an `OR` condition is implied between the values.
68
+ * **groupValues:** An object defining nested filter groups with `AND` or `OR` logic. This property allows for building complex nested filters. See the explanation below.
69
+
70
+ ### Nested Filter Groups (`groupValues`)
71
+
72
+ The `groupValues` property enables the creation of nested filter expressions with `AND` and `OR` logic. It is an object with either `AND` or `OR` properties (or both, with `AND` taking precedence). The value of these properties should be an array of filter objects, allowing for recursive nesting.
73
+
74
+ ```javascript
75
+ // Example: (status==active AND type==local) OR (status==pending)
76
+ const filters = [
77
+ {
78
+ groupValues: {
79
+ OR: [
80
+ {
81
+ groupValues: {
82
+ AND: [
83
+ { path: 'item.status', value: 'active' },
84
+ { path: 'item.type', value: 'local' },
85
+ ],
86
+ }
87
+ },
88
+ { path: 'item.status', value: 'pending' },
89
+ ]
90
+ },
91
+ },
92
+ ];
93
+ ```
94
+
95
+ This structure allows you to express complex filter logic in a clear and organized way.
96
+
97
+ ## nsValues options
98
+
99
+ In addition to the manual filtering capabilities, `generateKiwtQueryParams` supports advanced filtering options including custom comparators and dynamic filter key overrides for the `query` nsValues passed by SASQ. These features enable you to generate complex query expressions more easily.
100
+
101
+ ### Custom Comparators & Filter Key Overrides
102
+ When using the older `nsValues.filters` string (e.g., `"requestStatus.completed,journalVolume.test1"`), you can use `filterConfig` to customize how filters are interpreted:
103
+
104
+ - **Mapping Filter Names:**
105
+ Each entry in `filterConfig` should include a `name` field that matches the filter name parsed from `nsValues.filters`.
106
+
107
+ - **Overriding Values and Comparators:**
108
+ Optionally, a `values` array can be provided for more granular control. For each possible value, you can specify:
109
+ - A replacement value.
110
+ - A custom comparator to be used instead of the default `'=='`.
111
+
112
+ For example, if you want the filter `status` to use a comparator like `isNotSet` for a certain value, your configuration might look like this:
113
+
114
+ ```javascript
115
+ const options = {
116
+ filterKeys: { status: 'requestStatus.value' },
117
+ filterConfig: [
118
+ {
119
+ name: 'status',
120
+ values: [
121
+ { name: 'notSet', value: '', comparator: ' isNotSet' },
122
+ { name: 'isNotActive', value: 'active', comparator: '!=' },
123
+ // other value mappings... Any not present will be evaluated as is
124
+ ]
125
+ }
126
+ ]
127
+ };
128
+ ```
129
+
130
+ With this configuration, the generated query parameter for various nsValues.filters would be:
131
+
132
+ | nsValues.filters | outcome |
133
+ | -- | -- |
134
+ | status.notSet | `filters=requestStatus.value isNotSet` |
135
+ | status.wibble | `filters=requestStatus.value==wibble` |
136
+ | status.isNotActive | `filters=requestStatus.value!=active` |
137
+
138
+
139
+
140
+
141
+ ### Dynamic Date Example with `moreThanToday`
142
+
143
+ You can also dynamically set filter values based on runtime data. For instance, if you want to filter records where a date field is greater than or equal to today’s date, you can calculate the date value first and then reference it in your `filterConfig`:
144
+
145
+ ```javascript
146
+ // Dynamically calculate today's date in YYYY-MM-DD format
147
+ const today = new Date().toISOString().split('T')[0];
148
+
149
+ const filterConfig = [
150
+ {
151
+ name: 'startDate',
152
+ values: [
153
+ {
154
+ name: 'moreThanToday',
155
+ value: today,
156
+ comparator: '>='
157
+ }
158
+ ]
159
+ }
160
+ ];
161
+
162
+ const options = {
163
+ filterConfig,
164
+ };
165
+
166
+ const nsValues = {
167
+ // When 'startDate.moreThanToday' is encountered, it will use the filterConfig mapping
168
+ filters: 'startDate.moreThanToday'
169
+ };
170
+
171
+ const queryArray = generateKiwtQueryParams(options, nsValues);
172
+ console.log(queryArray);
173
+ // Example output (URL encoded):
174
+ // [
175
+ // "filters=startDate%3E%3D2025-02-19", // The date value will reflect today's date
176
+ // "stats=true"
177
+ // ]
178
+ ```
179
+
180
+ In this example, when `nsValues.filters` contains `startDate.moreThanToday`, the function looks up the corresponding configuration in `filterConfig`, uses the dynamically calculated date stored in `today`, and applies the comparator `>=` to produce a query parameter like:
181
+
182
+ ```
183
+ filters=startDate>=2025-02-19
184
+ ```
185
+
186
+ This approach makes it easy to filter records based on dynamic criteria, such as dates relative to the current day.
187
+
188
+ ### How It Works
189
+
190
+ - **For `options.filters` (object-based filtering):**
191
+ The function handles nested filters, groups (using `groupValues` with `AND`/`OR` logic), and applies the specified comparators. This provides full flexibility when building complex queries.
192
+
193
+ - **For Legacy SASQ `nsValues.filters` (string-based filtering):**
194
+ The code splits the incoming comma-separated string into individual filters. For each filter:
195
+ - It checks if there’s a matching entry in `filterConfig`.
196
+ - If found, it applies the mapping from `filterConfig` and uses the comparator specified there (or defaults to `'=='`).
197
+ - If no mapping exists and no filter key is provided in `filterKeys`, the raw value is passed to the backend.
198
+
199
+ By utilizing these advanced filtering options, you can tailor your query string generation to meet complex backend requirements while maintaining clarity and control over your filter logic.
@@ -129,8 +129,11 @@ const generateKiwtQueryParams = (options, nsValues, encode = true) => {
129
129
  if (filterConfigEntry) {
130
130
  // We have a direct mapping instruction, use it
131
131
  const filterString = filterValues.map(v => {
132
- const fceValue = filterConfigEntry?.values?.find(fce => fce.name === v)?.value;
133
- return `${filterName}==${fceValue ?? v}`;
132
+ const fcValueEntry = filterConfigEntry?.values?.find(fce => fce.name === v) ?? {};
133
+ const fceValue = fcValueEntry.value ?? v;
134
+ // This is especially useful where comparator acts strangely for a single value, such as `filters=foo isNotSet`
135
+ const fceComparator = fcValueEntry.comparator ?? '==';
136
+ return `${filterKey ?? filterName}${fceComparator}${fceValue ?? v}`;
134
137
  }).join('||');
135
138
 
136
139
  paramsArray.push(`filters=${conditionalEncodeURIComponent(filterString, encode)}`);
@@ -0,0 +1 @@
1
+ export { default as generateKiwtQueryParams } from './generateKiwtQueryParams';
@@ -1,5 +1,5 @@
1
1
  export { default as generateKiwtQuery } from './generateKiwtQuery';
2
- export { default as generateKiwtQueryParams } from './generateKiwtQueryParams';
2
+ export { generateKiwtQueryParams } from './generateKiwtQueryParams';
3
3
  export { default as selectorSafe } from './selectorSafe';
4
4
 
5
5
  export { default as buildUrl } from './buildUrl';