@k-int/stripes-kint-components 5.10.0 → 5.12.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 +15 -0
- package/es/index.js +12 -0
- package/es/lib/EditableRefdataList/EditableRefdataList.js +1 -1
- package/es/lib/SASQLookupComponent/SASQLookupComponent.js +38 -30
- package/es/lib/Tags/Tags.js +143 -0
- package/es/lib/Tags/Tags.test.js +80 -0
- package/es/lib/Tags/hooks/index.js +28 -0
- package/es/lib/Tags/hooks/useTags.js +15 -0
- package/es/lib/Tags/hooks/useTagsEnabled.js +25 -0
- package/es/lib/Tags/index.js +40 -0
- package/es/lib/Tags/tagsConfig.js +10 -0
- package/es/lib/constants/pagination.js +15 -0
- package/es/lib/hooks/index.js +7 -0
- package/es/lib/hooks/useHelperApp.js +18 -15
- package/es/lib/hooks/useLocalPageStore.js +25 -0
- package/es/lib/hooks/usePrevNextPagination.js +168 -0
- package/package.json +11 -10
- package/src/index.js +2 -0
- package/src/lib/EditableRefdataList/EditableRefdataList.js +5 -5
- package/src/lib/SASQLookupComponent/SASQLookupComponent.js +60 -49
- package/src/lib/Tags/Tags.js +145 -0
- package/src/lib/Tags/Tags.test.js +77 -0
- package/src/lib/Tags/hooks/index.js +2 -0
- package/src/lib/Tags/hooks/useTags.js +16 -0
- package/src/lib/Tags/hooks/useTagsEnabled.js +19 -0
- package/src/lib/Tags/index.js +4 -0
- package/src/lib/Tags/tagsConfig.js +16 -0
- package/src/lib/constants/pagination.js +10 -0
- package/src/lib/hooks/index.js +2 -0
- package/src/lib/hooks/useHelperApp.js +21 -13
- package/src/lib/hooks/useLocalPageStore.js +18 -0
- package/src/lib/hooks/usePrevNextPagination.js +203 -0
- package/test/helpers/test-implementor-translations.json +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# [5.12.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.11.0...v5.12.0) (2025-02-13)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **deps:** Stripes v10 dependency updates ([be3892f](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/be3892f9a3f61bf7e52cf1c1287082aed412161b))
|
|
7
|
+
* Paginated display as default for SASQRoute (refs UISER-185) ([9f379c9](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/9f379c91ef284dad9408cccb8d80cc314c969d8d))
|
|
8
|
+
|
|
9
|
+
# [5.11.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.10.0...v5.11.0) (2025-02-07)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* Added Tags helper app and hooks to stripes-kint-components (Moving out of erm-components longer term) ([e881639](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/e881639b49036d6016dc65d83bcf67e596652acc))
|
|
15
|
+
|
|
1
16
|
# [5.10.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.9.0...v5.10.0) (2025-02-04)
|
|
2
17
|
|
|
3
18
|
|
package/es/index.js
CHANGED
|
@@ -400,6 +400,18 @@ var _ResponsiveButtonGroup = _interopRequireDefault(require("./lib/ResponsiveBut
|
|
|
400
400
|
var _SettingsFormContainer = _interopRequireDefault(require("./lib/SettingsFormContainer"));
|
|
401
401
|
var _ComboButton = _interopRequireDefault(require("./lib/ComboButton"));
|
|
402
402
|
var _NumberField = _interopRequireDefault(require("./lib/NumberField"));
|
|
403
|
+
var _Tags = require("./lib/Tags");
|
|
404
|
+
Object.keys(_Tags).forEach(function (key) {
|
|
405
|
+
if (key === "default" || key === "__esModule") return;
|
|
406
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
407
|
+
if (key in exports && exports[key] === _Tags[key]) return;
|
|
408
|
+
Object.defineProperty(exports, key, {
|
|
409
|
+
enumerable: true,
|
|
410
|
+
get: function () {
|
|
411
|
+
return _Tags[key];
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
});
|
|
403
415
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
404
416
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
405
417
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -116,7 +116,7 @@ const EditableRefdataList = _ref => {
|
|
|
116
116
|
// or one provided in labelOverrides, which is passed the error message and refdata in question
|
|
117
117
|
delete: async err => {
|
|
118
118
|
const errorResp = await (0, _utils.parseErrorResponse)(err.response);
|
|
119
|
-
console.log(
|
|
119
|
+
// console.log('ERRORRESP: %o', errorResp);
|
|
120
120
|
callout.sendCallout({
|
|
121
121
|
message: kintIntl.formatKintMessage({
|
|
122
122
|
id: 'refdata.deleteRefdataValue.errorMessage',
|
|
@@ -28,6 +28,7 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
|
|
|
28
28
|
intlNS: passedIntlNS,
|
|
29
29
|
labelOverrides = {},
|
|
30
30
|
mainPaneProps,
|
|
31
|
+
mclProps = {},
|
|
31
32
|
noSearchField,
|
|
32
33
|
persistedPanesetProps = {},
|
|
33
34
|
RenderBody,
|
|
@@ -38,6 +39,15 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
|
|
|
38
39
|
searchFieldProps
|
|
39
40
|
} = props;
|
|
40
41
|
const kintIntl = (0, _hooks.useKintIntl)(passedIntlKey, passedIntlNS);
|
|
42
|
+
const [count, setCount] = (0, _react.useState)(0);
|
|
43
|
+
const {
|
|
44
|
+
currentPage,
|
|
45
|
+
paginationMCLProps,
|
|
46
|
+
paginationSASQProps
|
|
47
|
+
} = (0, _hooks.usePrevNextPagination)({
|
|
48
|
+
count,
|
|
49
|
+
pageSize: fetchParameters.SASQ_MAP?.perPage
|
|
50
|
+
});
|
|
41
51
|
const {
|
|
42
52
|
query,
|
|
43
53
|
queryGetter,
|
|
@@ -48,14 +58,10 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
|
|
|
48
58
|
} = (0, _core.useNamespace)();
|
|
49
59
|
const ky = (0, _core.useOkapiKy)();
|
|
50
60
|
const filterPaneVisibileKey = `${namespace}-${id}-filterPaneVisibility`;
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const queryMap = fetchParameters.SASQ_MAP;
|
|
56
|
-
queryMap.offset = pageParam;
|
|
57
|
-
return ky(`${fetchParameters.endpoint}${(0, _utils.generateKiwtQuery)(queryMap, query)}`).json();
|
|
58
|
-
};
|
|
61
|
+
const queryParams = (0, _react.useMemo)(() => (0, _utils.generateKiwtQuery)({
|
|
62
|
+
...fetchParameters.SASQ_MAP,
|
|
63
|
+
page: currentPage
|
|
64
|
+
}, query ?? {}), [currentPage, fetchParameters.SASQ_MAP, query]);
|
|
59
65
|
const [filterPaneVisible, setFilterPaneVisible] = (0, _hooks.useLocalStorageState)(filterPaneVisibileKey, true);
|
|
60
66
|
const toggleFilterPane = () => setFilterPaneVisible(!filterPaneVisible);
|
|
61
67
|
const queryNamespace = [namespace, 'SASQ'];
|
|
@@ -64,30 +70,27 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
|
|
|
64
70
|
}
|
|
65
71
|
queryNamespace.push('viewAll');
|
|
66
72
|
queryNamespace.push(query);
|
|
73
|
+
queryNamespace.push(currentPage);
|
|
67
74
|
const {
|
|
68
|
-
data
|
|
69
|
-
...
|
|
70
|
-
} = (0, _reactQuery.
|
|
75
|
+
data = {},
|
|
76
|
+
...restOfQueryProps
|
|
77
|
+
} = (0, _reactQuery.useQuery)(queryNamespace, () => {
|
|
78
|
+
return ky.get(`${fetchParameters.endpoint}${queryParams}`).json();
|
|
79
|
+
}, {
|
|
80
|
+
enabled: !!currentPage
|
|
81
|
+
});
|
|
82
|
+
(0, _react.useEffect)(() => {
|
|
83
|
+
if (count !== data?.totalRecords) {
|
|
84
|
+
setCount(data?.totalRecords);
|
|
85
|
+
}
|
|
86
|
+
}, [count, data.totalRecords]);
|
|
71
87
|
(0, _react.useImperativeHandle)(ref, () => ({
|
|
72
88
|
lookupQueryProps: {
|
|
73
|
-
data
|
|
74
|
-
...
|
|
75
|
-
}
|
|
89
|
+
data,
|
|
90
|
+
...restOfQueryProps
|
|
91
|
+
},
|
|
92
|
+
queryParams
|
|
76
93
|
}));
|
|
77
|
-
const data = totalData.pages?.reduce((acc, curr) => {
|
|
78
|
-
const newAcc = {
|
|
79
|
-
...acc
|
|
80
|
-
};
|
|
81
|
-
for (const [key, value] of Object.entries(curr)) {
|
|
82
|
-
if (key !== 'page' && key !== 'result' && acc[key] !== value) {
|
|
83
|
-
newAcc[key] = value;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
const newResults = [...(acc.results ?? [])];
|
|
87
|
-
newResults.push(...(curr.results ?? []));
|
|
88
|
-
newAcc.results = newResults;
|
|
89
|
-
return newAcc;
|
|
90
|
-
}, {}) ?? {};
|
|
91
94
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_smartComponents.SearchAndSortQuery, {
|
|
92
95
|
initialSearchState: {
|
|
93
96
|
query: ''
|
|
@@ -95,6 +98,7 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
|
|
|
95
98
|
queryGetter: queryGetter,
|
|
96
99
|
querySetter: querySetter,
|
|
97
100
|
...sasqProps,
|
|
101
|
+
...paginationSASQProps,
|
|
98
102
|
children: sasqRenderProps => {
|
|
99
103
|
const {
|
|
100
104
|
activeFilters,
|
|
@@ -222,10 +226,14 @@ const SASQLookupComponent = /*#__PURE__*/(0, _react.forwardRef)((props, ref) =>
|
|
|
222
226
|
query: query,
|
|
223
227
|
rowNavigation: rowNavigation,
|
|
224
228
|
toggleFilterPane: toggleFilterPane,
|
|
225
|
-
...
|
|
229
|
+
...restOfQueryProps,
|
|
226
230
|
...sasqRenderProps,
|
|
227
231
|
...sasqProps,
|
|
228
|
-
...props
|
|
232
|
+
...props,
|
|
233
|
+
mclProps: {
|
|
234
|
+
...paginationMCLProps,
|
|
235
|
+
...mclProps
|
|
236
|
+
}
|
|
229
237
|
})
|
|
230
238
|
}), children]
|
|
231
239
|
});
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
|
+
var _reactQuery = require("react-query");
|
|
10
|
+
var _core = require("@folio/stripes/core");
|
|
11
|
+
var _lodash = require("lodash");
|
|
12
|
+
var _components = require("@folio/stripes/components");
|
|
13
|
+
var _smartComponents = require("@folio/stripes/smart-components");
|
|
14
|
+
var _tagsConfig = require("./tagsConfig");
|
|
15
|
+
var _hooks = require("./hooks");
|
|
16
|
+
var _hooks2 = require("../hooks");
|
|
17
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
18
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
|
+
const Tags = _ref => {
|
|
20
|
+
let {
|
|
21
|
+
invalidateLinks = [],
|
|
22
|
+
// If there are other queries that need invalidating, pass those here
|
|
23
|
+
labelOverrides = {},
|
|
24
|
+
link,
|
|
25
|
+
onToggle,
|
|
26
|
+
intlKey: passedIntlKey,
|
|
27
|
+
intlNS: passedIntlNS
|
|
28
|
+
} = _ref;
|
|
29
|
+
const kintIntl = (0, _hooks2.useKintIntl)(passedIntlKey, passedIntlNS);
|
|
30
|
+
const ky = (0, _core.useOkapiKy)();
|
|
31
|
+
const callout = (0, _react.useContext)(_core.CalloutContext);
|
|
32
|
+
const queryClient = (0, _reactQuery.useQueryClient)();
|
|
33
|
+
|
|
34
|
+
// TAG GET/POST
|
|
35
|
+
const {
|
|
36
|
+
data: {
|
|
37
|
+
tags = []
|
|
38
|
+
} = {}
|
|
39
|
+
} = (0, _hooks.useTags)([..._tagsConfig.tagNamespaceArray, link]);
|
|
40
|
+
|
|
41
|
+
// istanbul ignore next
|
|
42
|
+
const {
|
|
43
|
+
mutateAsync: postTags
|
|
44
|
+
} = (0, _reactQuery.useMutation)(['tags', 'stripes-erm-components', 'Tags', 'postTags'], data => ky.post('tags', {
|
|
45
|
+
json: data
|
|
46
|
+
}).then(() => {
|
|
47
|
+
queryClient.invalidateQueries('tags');
|
|
48
|
+
}));
|
|
49
|
+
|
|
50
|
+
// ENTITY GET/PUT
|
|
51
|
+
const {
|
|
52
|
+
data: entity
|
|
53
|
+
} = (0, _reactQuery.useQuery)([link, 'stripes-erm-components', 'Tags'], () => ky.get(link).json());
|
|
54
|
+
|
|
55
|
+
// istanbul ignore next
|
|
56
|
+
const {
|
|
57
|
+
mutateAsync: putEntity
|
|
58
|
+
} = (0, _reactQuery.useMutation)([link, 'stripes-erm-components', 'Tags', 'putEntity'], data => ky.put(link, {
|
|
59
|
+
json: data
|
|
60
|
+
}).then(() => {
|
|
61
|
+
queryClient.invalidateQueries(link);
|
|
62
|
+
if (invalidateLinks?.length) {
|
|
63
|
+
invalidateLinks.forEach(il => queryClient.invalidateQueries(il));
|
|
64
|
+
}
|
|
65
|
+
}));
|
|
66
|
+
|
|
67
|
+
// add tags to global list of tags
|
|
68
|
+
// istanbul ignore next
|
|
69
|
+
const saveTags = tagsToSave => {
|
|
70
|
+
const newTag = (0, _lodash.difference)(tagsToSave.map(t => t.value || t), tags.map(t => t.label.toLowerCase()));
|
|
71
|
+
if (!newTag || !newTag.length) return;
|
|
72
|
+
postTags({
|
|
73
|
+
label: newTag[0],
|
|
74
|
+
description: newTag[0]
|
|
75
|
+
});
|
|
76
|
+
callout.sendCallout({
|
|
77
|
+
message: kintIntl.formatKintMessage({
|
|
78
|
+
id: 'newTagCreated',
|
|
79
|
+
overrideValue: labelOverrides.newTagCreated
|
|
80
|
+
})
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// add tag to the list of entity tags
|
|
85
|
+
// istanbul ignore next
|
|
86
|
+
const saveEntityTags = tagsToSave => {
|
|
87
|
+
const tagListMap = (entity?.tags ?? []).map(tag => ({
|
|
88
|
+
'value': tag.value
|
|
89
|
+
}));
|
|
90
|
+
const tagsMap = tagsToSave.map(tag => ({
|
|
91
|
+
'value': tag.value || tag
|
|
92
|
+
}));
|
|
93
|
+
const newTags = (0, _lodash.sortBy)((0, _lodash.uniqBy)([...tagListMap, ...tagsMap], 'value'));
|
|
94
|
+
putEntity({
|
|
95
|
+
tags: newTags
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
const onAdd = addTags => {
|
|
99
|
+
saveEntityTags(addTags);
|
|
100
|
+
saveTags(addTags);
|
|
101
|
+
};
|
|
102
|
+
const onRemove = tag => {
|
|
103
|
+
const tagToDelete = (entity?.tags ?? []).filter(t => t.value.toLowerCase() === tag.toLowerCase());
|
|
104
|
+
putEntity({
|
|
105
|
+
tags: [{
|
|
106
|
+
id: tagToDelete[0].id,
|
|
107
|
+
_delete: true
|
|
108
|
+
}]
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
const entityTags = (entity?.tags ?? []).map(tag => tag.value.toLowerCase());
|
|
112
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Pane, {
|
|
113
|
+
defaultWidth: "20%",
|
|
114
|
+
dismissible: true,
|
|
115
|
+
id: "tags-helper-pane",
|
|
116
|
+
onClose: onToggle,
|
|
117
|
+
paneSub: kintIntl.formatKintMessage({
|
|
118
|
+
id: 'numberOfTags',
|
|
119
|
+
overrideValue: labelOverrides.numberOfTags
|
|
120
|
+
}, {
|
|
121
|
+
count: entity?.tags?.length ?? 0
|
|
122
|
+
}),
|
|
123
|
+
paneTitle: kintIntl.formatKintMessage({
|
|
124
|
+
id: 'tags',
|
|
125
|
+
overrideValue: labelOverrides.tags
|
|
126
|
+
}),
|
|
127
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_smartComponents.TagsForm, {
|
|
128
|
+
entityTags: entityTags,
|
|
129
|
+
onAdd: onAdd,
|
|
130
|
+
onRemove: onRemove,
|
|
131
|
+
tags: tags
|
|
132
|
+
})
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
Tags.propTypes = {
|
|
136
|
+
intlKey: _propTypes.default.string,
|
|
137
|
+
intlNS: _propTypes.default.string,
|
|
138
|
+
invalidateLinks: _propTypes.default.arrayOf(_propTypes.default.string),
|
|
139
|
+
labelOverrides: _propTypes.default.object,
|
|
140
|
+
link: _propTypes.default.string,
|
|
141
|
+
onToggle: _propTypes.default.func
|
|
142
|
+
};
|
|
143
|
+
var _default = exports.default = Tags;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _reactRouterDom = require("react-router-dom");
|
|
5
|
+
var _stripesErmTesting = require("@folio/stripes-erm-testing");
|
|
6
|
+
var _Tags = _interopRequireDefault(require("./Tags"));
|
|
7
|
+
var _jest = require("../../../test/jest");
|
|
8
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
const onToggle = jest.fn();
|
|
11
|
+
const onAdd = jest.fn();
|
|
12
|
+
const link = 'erm/sas/14c16fc4-f986-4e60-aa59-4e627fcf160b';
|
|
13
|
+
describe('Tags', () => {
|
|
14
|
+
let renderComponent;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
renderComponent = (0, _jest.renderWithKintHarness)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.MemoryRouter, {
|
|
17
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tags.default, {
|
|
18
|
+
invalidateLinks: [],
|
|
19
|
+
link: link,
|
|
20
|
+
onAdd: onAdd,
|
|
21
|
+
onToggle: onToggle
|
|
22
|
+
})
|
|
23
|
+
}));
|
|
24
|
+
});
|
|
25
|
+
test('renders the expected label', () => {
|
|
26
|
+
const {
|
|
27
|
+
getByText
|
|
28
|
+
} = renderComponent;
|
|
29
|
+
expect(getByText('0 Tags')).toBeInTheDocument();
|
|
30
|
+
});
|
|
31
|
+
test('renders expected pane dismiss button ', async () => {
|
|
32
|
+
await (0, _stripesErmTesting.IconButton)('Close Tags').exists();
|
|
33
|
+
});
|
|
34
|
+
test('renders expected open menu button ', () => {
|
|
35
|
+
const {
|
|
36
|
+
getByRole
|
|
37
|
+
} = renderComponent;
|
|
38
|
+
expect(getByRole('button', {
|
|
39
|
+
name: 'stripes-components.multiSelection.dropdownTriggerLabel'
|
|
40
|
+
})).toBeInTheDocument();
|
|
41
|
+
});
|
|
42
|
+
test('renders tags heading ', () => {
|
|
43
|
+
const {
|
|
44
|
+
getByRole
|
|
45
|
+
} = renderComponent;
|
|
46
|
+
expect(getByRole('heading', {
|
|
47
|
+
name: 'Tags'
|
|
48
|
+
})).toBeInTheDocument();
|
|
49
|
+
});
|
|
50
|
+
test('renders expected region with zero tags', () => {
|
|
51
|
+
const {
|
|
52
|
+
getByRole
|
|
53
|
+
} = renderComponent;
|
|
54
|
+
expect(getByRole('region', {
|
|
55
|
+
name: 'Tags 0 Tags'
|
|
56
|
+
})).toBeInTheDocument();
|
|
57
|
+
});
|
|
58
|
+
test('renders the expected multiSelectDescription', () => {
|
|
59
|
+
const {
|
|
60
|
+
getByText
|
|
61
|
+
} = renderComponent;
|
|
62
|
+
expect(getByText('Contains a list of any selected values, followed by an autocomplete textfield for selecting additional values.')).toBeInTheDocument();
|
|
63
|
+
});
|
|
64
|
+
test('renders the expected label', () => {
|
|
65
|
+
const {
|
|
66
|
+
getByText
|
|
67
|
+
} = renderComponent;
|
|
68
|
+
expect(getByText('0 items selected')).toBeInTheDocument();
|
|
69
|
+
});
|
|
70
|
+
test('displays the tags pane', async () => {
|
|
71
|
+
await (0, _stripesErmTesting.Pane)('Tags').is({
|
|
72
|
+
visible: true
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
test('displays the tags pane header', async () => {
|
|
76
|
+
await (0, _stripesErmTesting.PaneHeader)('Tags').is({
|
|
77
|
+
visible: true
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "tagsEnabledQueryKey", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _useTagsEnabled.tagsEnabledQueryKey;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "useTags", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _useTags.default;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "useTagsEnabled", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _useTagsEnabled.default;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
var _useTagsEnabled = _interopRequireWildcard(require("./useTagsEnabled"));
|
|
25
|
+
var _useTags = _interopRequireDefault(require("./useTags"));
|
|
26
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
27
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
28
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactQuery = require("react-query");
|
|
8
|
+
var _core = require("@folio/stripes/core");
|
|
9
|
+
var _tagsConfig = require("../tagsConfig");
|
|
10
|
+
const useTags = (namespaceArray, options) => {
|
|
11
|
+
const ky = (0, _core.useOkapiKy)();
|
|
12
|
+
const nsArray = namespaceArray ?? _tagsConfig.tagNamespaceArray;
|
|
13
|
+
return (0, _reactQuery.useQuery)(nsArray, () => ky.get(_tagsConfig.defaultTagQuery).json(), options);
|
|
14
|
+
};
|
|
15
|
+
var _default = exports.default = useTags;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.tagsEnabledQueryKey = exports.default = void 0;
|
|
7
|
+
var _core = require("@folio/stripes/core");
|
|
8
|
+
var _reactQuery = require("react-query");
|
|
9
|
+
var _endpoints = require("../../constants/endpoints");
|
|
10
|
+
const tagsEnabledQueryKey = exports.tagsEnabledQueryKey = [_endpoints.MOD_SETTINGS_ENDPOINT, 'query=(module==TAGS and configName==tags_enabled)', 'stripes-kint-components', 'useTagsEnabled'];
|
|
11
|
+
const useTagsEnabled = () => {
|
|
12
|
+
const ky = (0, _core.useOkapiKy)();
|
|
13
|
+
const queryObject = (0, _reactQuery.useQuery)(tagsEnabledQueryKey, () => ky.get(`${_endpoints.MOD_SETTINGS_ENDPOINT}?query=(module==TAGS and configName==tags_enabled)`).json());
|
|
14
|
+
const {
|
|
15
|
+
data: {
|
|
16
|
+
configs: {
|
|
17
|
+
0: {
|
|
18
|
+
value
|
|
19
|
+
} = {}
|
|
20
|
+
} = []
|
|
21
|
+
} = {}
|
|
22
|
+
} = queryObject;
|
|
23
|
+
return !value || value === 'true';
|
|
24
|
+
};
|
|
25
|
+
var _default = exports.default = useTagsEnabled;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _exportNames = {
|
|
7
|
+
Tags: true
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "Tags", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function () {
|
|
12
|
+
return _Tags.default;
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
var _Tags = _interopRequireDefault(require("./Tags"));
|
|
16
|
+
var _tagsConfig = require("./tagsConfig");
|
|
17
|
+
Object.keys(_tagsConfig).forEach(function (key) {
|
|
18
|
+
if (key === "default" || key === "__esModule") return;
|
|
19
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
20
|
+
if (key in exports && exports[key] === _tagsConfig[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _tagsConfig[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
var _hooks = require("./hooks");
|
|
29
|
+
Object.keys(_hooks).forEach(function (key) {
|
|
30
|
+
if (key === "default" || key === "__esModule") return;
|
|
31
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
32
|
+
if (key in exports && exports[key] === _hooks[key]) return;
|
|
33
|
+
Object.defineProperty(exports, key, {
|
|
34
|
+
enumerable: true,
|
|
35
|
+
get: function () {
|
|
36
|
+
return _hooks[key];
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.tagsPath = exports.tagNamespaceArray = exports.defaultTagsParams = exports.defaultTagQuery = void 0;
|
|
7
|
+
const tagNamespaceArray = exports.tagNamespaceArray = ['tags', 'stripes-kint-components', 'Tags'];
|
|
8
|
+
const tagsPath = exports.tagsPath = 'tags';
|
|
9
|
+
const defaultTagsParams = exports.defaultTagsParams = ['limit=1000', 'query=cql.allRecords%3D1%20sortby%20label'];
|
|
10
|
+
const defaultTagQuery = exports.defaultTagQuery = `${tagsPath}?${defaultTagsParams?.join('&')}`;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PREV = exports.NEXT = exports.MCL_NEED_MORE_DATA_PREV_NEXT_ARG_INDEX = exports.DEFAULT_PAGINATION_SIZE = exports.DEFAULT_PAGE_KEY = void 0;
|
|
7
|
+
const NEXT = exports.NEXT = 'next';
|
|
8
|
+
const PREV = exports.PREV = 'prev';
|
|
9
|
+
|
|
10
|
+
// THIS SHOULD BE SET BY CALLING CODE, ONLY DEFAULTED TO AVOID DIVISION BY UNDEFINED
|
|
11
|
+
const DEFAULT_PAGINATION_SIZE = exports.DEFAULT_PAGINATION_SIZE = 25;
|
|
12
|
+
// Only here because we need argument 3 from onNeedMoreData
|
|
13
|
+
// and want to avoid "magic number" sonarlint
|
|
14
|
+
const MCL_NEED_MORE_DATA_PREV_NEXT_ARG_INDEX = exports.MCL_NEED_MORE_DATA_PREV_NEXT_ARG_INDEX = 3;
|
|
15
|
+
const DEFAULT_PAGE_KEY = exports.DEFAULT_PAGE_KEY = 'defaultPageKey';
|
package/es/lib/hooks/index.js
CHANGED
|
@@ -105,6 +105,12 @@ Object.defineProperty(exports, "useMutateRefdataValue", {
|
|
|
105
105
|
return _useMutateRefdataValue.default;
|
|
106
106
|
}
|
|
107
107
|
});
|
|
108
|
+
Object.defineProperty(exports, "usePrevNextPagination", {
|
|
109
|
+
enumerable: true,
|
|
110
|
+
get: function () {
|
|
111
|
+
return _usePrevNextPagination.default;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
108
114
|
Object.defineProperty(exports, "useQIndex", {
|
|
109
115
|
enumerable: true,
|
|
110
116
|
get: function () {
|
|
@@ -150,4 +156,5 @@ var _useMutateRefdataValue = _interopRequireDefault(require("./useMutateRefdataV
|
|
|
150
156
|
var _useMutateRefdataCategory = _interopRequireDefault(require("./useMutateRefdataCategory"));
|
|
151
157
|
var _useMutateCustomProperties = _interopRequireDefault(require("./useMutateCustomProperties"));
|
|
152
158
|
var _useMutateModConfigEntry = _interopRequireDefault(require("./useMutateModConfigEntry"));
|
|
159
|
+
var _usePrevNextPagination = _interopRequireDefault(require("./usePrevNextPagination"));
|
|
153
160
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -4,18 +4,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _react =
|
|
7
|
+
var _react = require("react");
|
|
8
8
|
var _reactRouterDom = require("react-router-dom");
|
|
9
9
|
var _queryString = _interopRequireDefault(require("query-string"));
|
|
10
10
|
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
11
11
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
-
let helperObject = {};
|
|
16
13
|
const useHelperApp = helpers => {
|
|
17
14
|
const history = (0, _reactRouterDom.useHistory)();
|
|
18
15
|
const location = (0, _reactRouterDom.useLocation)();
|
|
16
|
+
const [helperObject, setHelperObject] = (0, _react.useState)({});
|
|
17
|
+
const [helperToggleFunctions, setHelperToggleFunctions] = (0, _react.useState)({});
|
|
19
18
|
const query = _queryString.default.parse(location.search);
|
|
20
19
|
const [currentHelper, setCurrentHelper] = (0, _react.useState)(query?.helper);
|
|
21
20
|
const handleToggleHelper = (0, _react.useCallback)(helper => {
|
|
@@ -25,9 +24,16 @@ const useHelperApp = helpers => {
|
|
|
25
24
|
return currentHelper === hlp;
|
|
26
25
|
};
|
|
27
26
|
(0, _react.useEffect)(() => {
|
|
28
|
-
// Keep object outside of hook to avoid redraw, oncly change when keys change
|
|
29
27
|
if (!(0, _isEqual.default)(Object.keys(helperObject), Object.keys(helpers))) {
|
|
30
|
-
|
|
28
|
+
setHelperObject(helpers);
|
|
29
|
+
}
|
|
30
|
+
const newHelperToggleFunctions = {};
|
|
31
|
+
Object.keys(helperObject).forEach(h => {
|
|
32
|
+
newHelperToggleFunctions[h] = () => handleToggleHelper(h);
|
|
33
|
+
});
|
|
34
|
+
if (!(0, _isEqual.default)(Object.keys(helperToggleFunctions), Object.keys(newHelperToggleFunctions))) {
|
|
35
|
+
// This makes sure adding/removing helpers changes the functions
|
|
36
|
+
setHelperToggleFunctions(newHelperToggleFunctions);
|
|
31
37
|
}
|
|
32
38
|
if (currentHelper !== query?.helper) {
|
|
33
39
|
const newQuery = {
|
|
@@ -38,11 +44,14 @@ const useHelperApp = helpers => {
|
|
|
38
44
|
pathname: location.pathname,
|
|
39
45
|
search: `?${_queryString.default.stringify(newQuery)}`
|
|
40
46
|
});
|
|
47
|
+
|
|
48
|
+
// When helper changes, reset helperToggleFunctions
|
|
49
|
+
setHelperToggleFunctions(newHelperToggleFunctions);
|
|
41
50
|
}
|
|
42
|
-
}, [currentHelper, helpers, history, location, query]);
|
|
51
|
+
}, [currentHelper, handleToggleHelper, helperObject, helperToggleFunctions, helpers, history, location, query]);
|
|
43
52
|
|
|
44
53
|
// Set the HelperComponent
|
|
45
|
-
const HelperComponent = (0, _react.
|
|
54
|
+
const HelperComponent = (0, _react.useCallback)(props => {
|
|
46
55
|
if (!query?.helper) return null;
|
|
47
56
|
let Component = null;
|
|
48
57
|
Component = helperObject[query?.helper];
|
|
@@ -51,13 +60,7 @@ const useHelperApp = helpers => {
|
|
|
51
60
|
onToggle: () => handleToggleHelper(query?.helper),
|
|
52
61
|
...props
|
|
53
62
|
});
|
|
54
|
-
}, [handleToggleHelper, query
|
|
55
|
-
|
|
56
|
-
// Set up the helperToggleFunctions
|
|
57
|
-
const helperToggleFunctions = {};
|
|
58
|
-
Object.keys(helperObject).forEach(h => {
|
|
59
|
-
helperToggleFunctions[h] = () => handleToggleHelper(h);
|
|
60
|
-
});
|
|
63
|
+
}, [handleToggleHelper, helperObject, query?.helper]);
|
|
61
64
|
return {
|
|
62
65
|
currentHelper,
|
|
63
66
|
HelperComponent,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _zustand = require("zustand");
|
|
8
|
+
var _pagination = require("../constants/pagination");
|
|
9
|
+
// Any time that usePrevNextPagination is NOT synced to location,
|
|
10
|
+
// store a keyed currentPage here instead
|
|
11
|
+
const useLocalPageStore = (0, _zustand.create)(set => ({
|
|
12
|
+
pageStore: {},
|
|
13
|
+
setPage: (id, page) => set(state => {
|
|
14
|
+
// Any non-id keyed pages will go into a single storage slot
|
|
15
|
+
const key = id ?? _pagination.DEFAULT_PAGE_KEY;
|
|
16
|
+
return {
|
|
17
|
+
...state,
|
|
18
|
+
pageStore: {
|
|
19
|
+
...state.pageStore,
|
|
20
|
+
[key]: page
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
})
|
|
24
|
+
}));
|
|
25
|
+
var _default = exports.default = useLocalPageStore;
|