@k-int/stripes-kint-components 5.14.0 → 5.15.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 +7 -0
- package/es/lib/settingsHooks/useSettings.js +181 -65
- package/package.json +1 -1
- package/src/lib/settingsHooks/useSettings.js +202 -88
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [5.15.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.14.0...v5.15.0) (2025-02-21)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* useSettings sections ([0c062bf](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/0c062bf203811078371820b5106b3106982845ad))
|
|
7
|
+
|
|
1
8
|
# [5.14.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.13.0...v5.14.0) (2025-02-19)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _react =
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
9
|
var _reactQuery = require("react-query");
|
|
10
10
|
var _core = require("@folio/stripes/core");
|
|
@@ -15,97 +15,213 @@ var _utils = require("../utils");
|
|
|
15
15
|
var _hooks = require("../hooks");
|
|
16
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
17
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
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); }
|
|
19
|
+
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; }
|
|
20
|
+
// TODO work underway to make the settings hook more useful when trying to render multiple sections at a time
|
|
21
|
+
const useSettings = function () {
|
|
22
|
+
let settingsProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
23
|
+
const {
|
|
20
24
|
allowGlobalEdit = true,
|
|
21
25
|
dynamicPageExclusions,
|
|
22
26
|
intlKey: passedIntlKey,
|
|
23
27
|
intlNS: passedIntlNS,
|
|
24
28
|
labelOverrides = {},
|
|
25
|
-
|
|
29
|
+
pages,
|
|
30
|
+
// If this is present, act completely as a passthrough either in sections OR standalone
|
|
31
|
+
persistentPages = [],
|
|
32
|
+
preventQueries = false,
|
|
26
33
|
refdataEndpoint,
|
|
34
|
+
renderSingleSection = false,
|
|
35
|
+
// IF SECTIONS == NULL, this prop allows the implementor to render the pageList as a section with label etc
|
|
36
|
+
sectionPermission,
|
|
37
|
+
// If we're rendering sections, this prevents the rendering of said section (works as fallback or prevention for single section)
|
|
38
|
+
sectionRoute,
|
|
39
|
+
sections,
|
|
40
|
+
// if present, should be an array of objects with the SAME shape as the overall props here.
|
|
41
|
+
// If a prop isn't present it can fall back to the "global" prop.
|
|
27
42
|
settingEndpoint,
|
|
28
43
|
templateEndpoint
|
|
29
|
-
} =
|
|
44
|
+
} = settingsProps;
|
|
30
45
|
const ky = (0, _core.useOkapiKy)();
|
|
46
|
+
const stripes = (0, _core.useStripes)();
|
|
31
47
|
const kintIntl = (0, _hooks.useKintIntl)(passedIntlKey, passedIntlNS);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
|
|
49
|
+
// Set up array of queryParams, pageLists etc etc ready for us to do all the work in a single place
|
|
50
|
+
|
|
51
|
+
const sectionMetaArray = (0, _react.useMemo)(() => {
|
|
52
|
+
const array = [];
|
|
53
|
+
const getSectionQueryProps = sectionProps => {
|
|
54
|
+
const dqp = sectionProps.dynamicPageExclusions ?? dynamicPageExclusions;
|
|
55
|
+
const queryParams = (0, _utils.generateKiwtQueryParams)({
|
|
56
|
+
filters: dqp?.map(dpe => ({
|
|
57
|
+
path: 'section',
|
|
58
|
+
comparator: '!=',
|
|
59
|
+
value: dpe
|
|
60
|
+
})),
|
|
61
|
+
perPage: 100,
|
|
62
|
+
stats: false
|
|
63
|
+
}, {});
|
|
64
|
+
const finalSettingEndpoint = sectionProps.settingEndpoint ?? settingEndpoint;
|
|
65
|
+
const queryKey = ['stripes-kint-components', 'useSettings', 'appSettings', finalSettingEndpoint, queryParams];
|
|
66
|
+
const queryFn = () => ky(`${finalSettingEndpoint}?${queryParams?.join('&')}`).json();
|
|
67
|
+
return {
|
|
68
|
+
queryParams,
|
|
69
|
+
queryKey,
|
|
70
|
+
queryFn
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
if ((sections?.length ?? 0) > 0) {
|
|
74
|
+
array.push(...sections.map(section => {
|
|
75
|
+
const querySectionProps = getSectionQueryProps(section);
|
|
76
|
+
return {
|
|
77
|
+
...settingsProps,
|
|
78
|
+
// ensure these fall through to section based props
|
|
79
|
+
...querySectionProps,
|
|
80
|
+
...section // return original section object
|
|
81
|
+
};
|
|
82
|
+
}));
|
|
83
|
+
} else {
|
|
84
|
+
const querySectionProps = getSectionQueryProps(settingsProps);
|
|
85
|
+
array.push({
|
|
86
|
+
...settingsProps,
|
|
87
|
+
...querySectionProps
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return array;
|
|
91
|
+
}, [dynamicPageExclusions, ky, sections, settingEndpoint, settingsProps]);
|
|
92
|
+
const queries = (0, _react.useMemo)(() => sectionMetaArray.map(sma => {
|
|
93
|
+
let enabled = true;
|
|
94
|
+
if (sma.pages || sma.preventQueries || pages || preventQueries) {
|
|
95
|
+
enabled = false;
|
|
96
|
+
}
|
|
47
97
|
return {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
98
|
+
queryKey: sma.queryKey,
|
|
99
|
+
queryFn: sma.queryFn,
|
|
100
|
+
enabled
|
|
101
|
+
};
|
|
102
|
+
}) ?? [], [pages, preventQueries, sectionMetaArray]);
|
|
103
|
+
const queryReturnArray = (0, _reactQuery.useQueries)(queries);
|
|
104
|
+
const [isLoading, setIsLoading] = (0, _react.useState)(true);
|
|
105
|
+
const getDynamicPages = (0, _react.useCallback)((qra, sma) => {
|
|
106
|
+
const pagesFromQueryReturn = [...new Set(qra.data?.map(s => s.section))];
|
|
107
|
+
const dynamic = pagesFromQueryReturn.map(page => {
|
|
108
|
+
const finalSectionRoute = sma.sectionRoute ?? sectionRoute;
|
|
109
|
+
const pageRoute = (finalSectionRoute ? `${finalSectionRoute}/` : '') + page;
|
|
110
|
+
return {
|
|
111
|
+
route: pageRoute,
|
|
112
|
+
label: kintIntl.formatKintMessage({
|
|
113
|
+
id: `settings.settingsSection.${(0, _utils.toCamelCase)(page)}`,
|
|
114
|
+
fallbackMessage: page
|
|
115
|
+
}),
|
|
116
|
+
component: props => /*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingPage.SettingPagePane, {
|
|
59
117
|
intlKey: passedIntlKey,
|
|
60
118
|
intlNS: passedIntlNS,
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
119
|
+
sectionName: page,
|
|
120
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingPage.SettingPage, {
|
|
121
|
+
allowEdit: allowGlobalEdit,
|
|
122
|
+
intlKey: passedIntlKey,
|
|
123
|
+
intlNS: passedIntlNS,
|
|
124
|
+
labelOverrides: labelOverrides,
|
|
125
|
+
sectionName: page,
|
|
126
|
+
...props
|
|
127
|
+
})
|
|
64
128
|
})
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
});
|
|
68
|
-
const pageList = persistentPages.concat(dynamic).sort(_utils.sortByLabel);
|
|
69
|
-
const intlKey = (0, _hooks.useIntlKey)(passedIntlKey, passedIntlNS);
|
|
70
|
-
const SettingsContextProvider = _ref2 => {
|
|
71
|
-
let {
|
|
72
|
-
children
|
|
73
|
-
} = _ref2;
|
|
74
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_contexts.SettingsContext.Provider, {
|
|
75
|
-
value: {
|
|
76
|
-
intlKey,
|
|
77
|
-
// This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
|
|
78
|
-
refdataEndpoint,
|
|
79
|
-
settingEndpoint,
|
|
80
|
-
templateEndpoint
|
|
81
|
-
},
|
|
82
|
-
children: children
|
|
129
|
+
};
|
|
83
130
|
});
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
131
|
+
return {
|
|
132
|
+
pages: pagesFromQueryReturn,
|
|
133
|
+
dynamic
|
|
134
|
+
};
|
|
135
|
+
}, [allowGlobalEdit, kintIntl, labelOverrides, passedIntlKey, passedIntlNS, sectionRoute]);
|
|
136
|
+
(0, _react.useEffect)(() => {
|
|
137
|
+
// Handle loading
|
|
138
|
+
if (queryReturnArray.length > 0 && queryReturnArray.every(qra => qra.isLoading === false) && isLoading === true) {
|
|
139
|
+
setIsLoading(false);
|
|
140
|
+
}
|
|
141
|
+
}, [isLoading, queryReturnArray]);
|
|
142
|
+
const finalSections = (0, _react.useMemo)(() => {
|
|
143
|
+
return sectionMetaArray.map((sma, idx) => {
|
|
144
|
+
const SettingsContextProvider = _ref => {
|
|
145
|
+
let {
|
|
146
|
+
children
|
|
147
|
+
} = _ref;
|
|
148
|
+
const intlKey = (0, _hooks.useIntlKey)(passedIntlKey, passedIntlNS);
|
|
149
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_contexts.SettingsContext.Provider, {
|
|
150
|
+
value: {
|
|
151
|
+
intlKey: sma.intlKey ?? intlKey,
|
|
152
|
+
// This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
|
|
153
|
+
refdataEndpoint: sma.refdataEndpoint ?? refdataEndpoint,
|
|
154
|
+
settingEndpoint: sma.settingEndpoint ?? settingEndpoint,
|
|
155
|
+
templateEndpoint: sma.templateEndpoint ?? templateEndpoint
|
|
156
|
+
},
|
|
157
|
+
children: children
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
SettingsContextProvider.propTypes = {
|
|
161
|
+
children: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node])
|
|
162
|
+
};
|
|
163
|
+
const finalPermission = sma.sectionPermission ?? sectionPermission;
|
|
164
|
+
if (!finalPermission || stripes.hasPerm(finalPermission)) {
|
|
165
|
+
const dynamicPagesFromQueryReturn = getDynamicPages(queryReturnArray[idx], sma);
|
|
166
|
+
const finalPages = sma.pages ?? pages ?? (sma.persistentPages ?? persistentPages).concat(dynamicPagesFromQueryReturn.dynamic).sort(_utils.sortByLabel).map(p => {
|
|
167
|
+
return {
|
|
168
|
+
...p,
|
|
169
|
+
component: pCProps => /*#__PURE__*/(0, _jsxRuntime.jsx)(SettingsContextProvider, {
|
|
170
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(p.component, {
|
|
171
|
+
...pCProps
|
|
172
|
+
})
|
|
173
|
+
})
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
return {
|
|
177
|
+
...sma,
|
|
178
|
+
SettingsContextProvider,
|
|
179
|
+
...dynamicPagesFromQueryReturn,
|
|
180
|
+
pageList: finalPages,
|
|
181
|
+
// DEPRECATED Here for backwards compatibility
|
|
182
|
+
pages: finalPages // ASSUMPTION MADE THAT INDICES REMAIN THE SAME
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}).filter(Boolean);
|
|
187
|
+
}, [getDynamicPages, pages, passedIntlKey, passedIntlNS, persistentPages, queryReturnArray, refdataEndpoint, sectionMetaArray, sectionPermission, settingEndpoint, stripes, templateEndpoint]);
|
|
188
|
+
const pageList = (0, _react.useMemo)(() => {
|
|
189
|
+
let finalPages = null;
|
|
190
|
+
if (finalSections && finalSections.length === 1 && !renderSingleSection) {
|
|
191
|
+
finalPages = pages ?? finalSections[0].pages;
|
|
192
|
+
}
|
|
193
|
+
return finalPages;
|
|
194
|
+
}, [finalSections, pages, renderSingleSection]);
|
|
195
|
+
const passedSections = (0, _react.useMemo)(() => {
|
|
196
|
+
if (finalSections.length > 1 || finalSections.length === 1 && renderSingleSection) {
|
|
197
|
+
return finalSections;
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}, [finalSections, renderSingleSection]);
|
|
88
201
|
const SettingsComponent = props => {
|
|
89
202
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_smartComponents.Settings, {
|
|
90
203
|
pages: pageList,
|
|
91
204
|
paneTitle: kintIntl.formatKintMessage({
|
|
92
205
|
id: 'meta.title'
|
|
93
206
|
}),
|
|
207
|
+
sections: passedSections,
|
|
94
208
|
...props
|
|
95
209
|
});
|
|
96
210
|
};
|
|
97
|
-
const SettingsComponentWithContext = props => {
|
|
98
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(SettingsContextProvider, {
|
|
99
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(SettingsComponent, {
|
|
100
|
-
...props
|
|
101
|
-
})
|
|
102
|
-
});
|
|
103
|
-
};
|
|
104
211
|
return {
|
|
105
212
|
isLoading,
|
|
106
213
|
pageList,
|
|
107
|
-
|
|
108
|
-
|
|
214
|
+
sections: finalSections,
|
|
215
|
+
SettingsComponent,
|
|
216
|
+
// This doesn't make much sense if there is more than one section, here to avoid breaking changes
|
|
217
|
+
SettingsContextProvider: finalSections && finalSections.length === 1 ? finalSections[0].SettingsContextProvider : _ref2 => {
|
|
218
|
+
let {
|
|
219
|
+
children
|
|
220
|
+
} = _ref2;
|
|
221
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
222
|
+
children: [" ", children, " "]
|
|
223
|
+
});
|
|
224
|
+
}
|
|
109
225
|
};
|
|
110
226
|
};
|
|
111
227
|
var _default = exports.default = useSettings;
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
import { useOkapiKy } from '@folio/stripes/core';
|
|
4
|
+
import { useQueries } from 'react-query';
|
|
5
|
+
import { useOkapiKy, useStripes } from '@folio/stripes/core';
|
|
6
6
|
|
|
7
7
|
import { Settings } from '@folio/stripes/smart-components';
|
|
8
8
|
|
|
@@ -12,88 +12,207 @@ import { SettingsContext } from '../contexts';
|
|
|
12
12
|
import { generateKiwtQueryParams, sortByLabel, toCamelCase } from '../utils';
|
|
13
13
|
import { useKintIntl, useIntlKey } from '../hooks';
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
15
|
+
// TODO work underway to make the settings hook more useful when trying to render multiple sections at a time
|
|
16
|
+
const useSettings = (settingsProps = {}) => {
|
|
17
|
+
const {
|
|
18
|
+
allowGlobalEdit = true,
|
|
19
|
+
dynamicPageExclusions,
|
|
20
|
+
intlKey: passedIntlKey,
|
|
21
|
+
intlNS: passedIntlNS,
|
|
22
|
+
labelOverrides = {},
|
|
23
|
+
pages, // If this is present, act completely as a passthrough either in sections OR standalone
|
|
24
|
+
persistentPages = [],
|
|
25
|
+
preventQueries = false,
|
|
26
|
+
refdataEndpoint,
|
|
27
|
+
renderSingleSection = false, // IF SECTIONS == NULL, this prop allows the implementor to render the pageList as a section with label etc
|
|
28
|
+
sectionPermission, // If we're rendering sections, this prevents the rendering of said section (works as fallback or prevention for single section)
|
|
29
|
+
sectionRoute,
|
|
30
|
+
sections, // if present, should be an array of objects with the SAME shape as the overall props here.
|
|
31
|
+
// If a prop isn't present it can fall back to the "global" prop.
|
|
32
|
+
settingEndpoint,
|
|
33
|
+
templateEndpoint
|
|
34
|
+
} = settingsProps;
|
|
35
|
+
|
|
26
36
|
const ky = useOkapiKy();
|
|
37
|
+
const stripes = useStripes();
|
|
27
38
|
const kintIntl = useKintIntl(passedIntlKey, passedIntlNS);
|
|
28
39
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
40
|
+
// Set up array of queryParams, pageLists etc etc ready for us to do all the work in a single place
|
|
41
|
+
|
|
42
|
+
const sectionMetaArray = useMemo(() => {
|
|
43
|
+
const array = [];
|
|
44
|
+
const getSectionQueryProps = (sectionProps) => {
|
|
45
|
+
const dqp = sectionProps.dynamicPageExclusions ?? dynamicPageExclusions;
|
|
46
|
+
const queryParams = generateKiwtQueryParams({
|
|
47
|
+
filters: dqp?.map(dpe => ({
|
|
48
|
+
path: 'section',
|
|
49
|
+
comparator: '!=',
|
|
50
|
+
value: dpe
|
|
51
|
+
})),
|
|
52
|
+
perPage: 100,
|
|
53
|
+
stats: false
|
|
54
|
+
}, {});
|
|
55
|
+
const finalSettingEndpoint = sectionProps.settingEndpoint ?? settingEndpoint;
|
|
56
|
+
const queryKey = ['stripes-kint-components', 'useSettings', 'appSettings', finalSettingEndpoint, queryParams];
|
|
57
|
+
const queryFn = () => ky(`${finalSettingEndpoint}?${queryParams?.join('&')}`).json();
|
|
58
|
+
|
|
59
|
+
return { queryParams, queryKey, queryFn };
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
if ((sections?.length ?? 0) > 0) {
|
|
63
|
+
array.push(...sections.map((section) => {
|
|
64
|
+
const querySectionProps = getSectionQueryProps(section);
|
|
65
|
+
|
|
66
|
+
return ({
|
|
67
|
+
...settingsProps, // ensure these fall through to section based props
|
|
68
|
+
...querySectionProps,
|
|
69
|
+
...section // return original section object
|
|
70
|
+
});
|
|
71
|
+
}));
|
|
72
|
+
} else {
|
|
73
|
+
const querySectionProps = getSectionQueryProps(settingsProps);
|
|
74
|
+
array.push({
|
|
75
|
+
...settingsProps,
|
|
76
|
+
...querySectionProps,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return array;
|
|
81
|
+
}, [dynamicPageExclusions, ky, sections, settingEndpoint, settingsProps]);
|
|
82
|
+
|
|
83
|
+
const queries = useMemo(() => sectionMetaArray.map(sma => {
|
|
84
|
+
let enabled = true;
|
|
85
|
+
if (sma.pages || sma.preventQueries || pages || preventQueries) {
|
|
86
|
+
enabled = false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
queryKey: sma.queryKey,
|
|
91
|
+
queryFn: sma.queryFn,
|
|
92
|
+
enabled
|
|
93
|
+
};
|
|
94
|
+
}) ?? [], [pages, preventQueries, sectionMetaArray]);
|
|
95
|
+
|
|
96
|
+
const queryReturnArray = useQueries(queries);
|
|
97
|
+
|
|
98
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
99
|
+
|
|
100
|
+
const getDynamicPages = useCallback((qra, sma) => {
|
|
101
|
+
const pagesFromQueryReturn = [...new Set(qra.data?.map(s => s.section))];
|
|
102
|
+
const dynamic = pagesFromQueryReturn.map(page => {
|
|
103
|
+
const finalSectionRoute = sma.sectionRoute ?? sectionRoute;
|
|
104
|
+
const pageRoute = (finalSectionRoute ? `${finalSectionRoute}/` : '') + page;
|
|
105
|
+
return (
|
|
106
|
+
{
|
|
107
|
+
route: pageRoute,
|
|
108
|
+
label: kintIntl.formatKintMessage({
|
|
109
|
+
id: `settings.settingsSection.${toCamelCase(page)}`,
|
|
110
|
+
fallbackMessage: page
|
|
111
|
+
}),
|
|
112
|
+
component: (props) => (
|
|
113
|
+
<SettingPagePane
|
|
61
114
|
intlKey={passedIntlKey}
|
|
62
115
|
intlNS={passedIntlNS}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
116
|
+
sectionName={page}
|
|
117
|
+
>
|
|
118
|
+
<SettingPage
|
|
119
|
+
allowEdit={allowGlobalEdit}
|
|
120
|
+
intlKey={passedIntlKey}
|
|
121
|
+
intlNS={passedIntlNS}
|
|
122
|
+
labelOverrides={labelOverrides}
|
|
123
|
+
sectionName={page}
|
|
124
|
+
{...props}
|
|
125
|
+
/>
|
|
126
|
+
</SettingPagePane>
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
pages: pagesFromQueryReturn,
|
|
134
|
+
dynamic,
|
|
135
|
+
};
|
|
136
|
+
}, [allowGlobalEdit, kintIntl, labelOverrides, passedIntlKey, passedIntlNS, sectionRoute]);
|
|
137
|
+
|
|
138
|
+
useEffect(() => {
|
|
139
|
+
// Handle loading
|
|
140
|
+
if (
|
|
141
|
+
queryReturnArray.length > 0 &&
|
|
142
|
+
queryReturnArray.every(qra => qra.isLoading === false) &&
|
|
143
|
+
isLoading === true
|
|
144
|
+
) {
|
|
145
|
+
setIsLoading(false);
|
|
146
|
+
}
|
|
147
|
+
}, [isLoading, queryReturnArray]);
|
|
148
|
+
|
|
149
|
+
const finalSections = useMemo(() => {
|
|
150
|
+
return sectionMetaArray.map(((sma, idx) => {
|
|
151
|
+
const SettingsContextProvider = ({ children }) => {
|
|
152
|
+
const intlKey = useIntlKey(passedIntlKey, passedIntlNS);
|
|
153
|
+
return (
|
|
154
|
+
<SettingsContext.Provider
|
|
155
|
+
value={{
|
|
156
|
+
intlKey: sma.intlKey ?? intlKey, // This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
|
|
157
|
+
refdataEndpoint: sma.refdataEndpoint ?? refdataEndpoint,
|
|
158
|
+
settingEndpoint: sma.settingEndpoint ?? settingEndpoint,
|
|
159
|
+
templateEndpoint: sma.templateEndpoint ?? templateEndpoint,
|
|
160
|
+
}}
|
|
161
|
+
>
|
|
162
|
+
{children}
|
|
163
|
+
</SettingsContext.Provider>
|
|
164
|
+
);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
SettingsContextProvider.propTypes = {
|
|
168
|
+
children: PropTypes.oneOfType([
|
|
169
|
+
PropTypes.func,
|
|
170
|
+
PropTypes.node
|
|
171
|
+
])
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const finalPermission = sma.sectionPermission ?? sectionPermission;
|
|
175
|
+
if (!finalPermission || stripes.hasPerm(finalPermission)) {
|
|
176
|
+
const dynamicPagesFromQueryReturn = getDynamicPages(queryReturnArray[idx], sma);
|
|
177
|
+
|
|
178
|
+
const finalPages = sma.pages ?? pages ?? (sma.persistentPages ?? persistentPages).concat(dynamicPagesFromQueryReturn.dynamic).sort(sortByLabel).map((p) => {
|
|
179
|
+
return {
|
|
180
|
+
...p,
|
|
181
|
+
component: (pCProps) => (
|
|
182
|
+
<SettingsContextProvider>
|
|
183
|
+
<p.component {...pCProps} />
|
|
184
|
+
</SettingsContextProvider>
|
|
185
|
+
)
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
...sma,
|
|
191
|
+
SettingsContextProvider,
|
|
192
|
+
...dynamicPagesFromQueryReturn,
|
|
193
|
+
pageList: finalPages, // DEPRECATED Here for backwards compatibility
|
|
194
|
+
pages: finalPages // ASSUMPTION MADE THAT INDICES REMAIN THE SAME
|
|
195
|
+
};
|
|
69
196
|
}
|
|
70
|
-
|
|
71
|
-
|
|
197
|
+
return null;
|
|
198
|
+
})).filter(Boolean);
|
|
199
|
+
}, [getDynamicPages, pages, passedIntlKey, passedIntlNS, persistentPages, queryReturnArray, refdataEndpoint, sectionMetaArray, sectionPermission, settingEndpoint, stripes, templateEndpoint]);
|
|
72
200
|
|
|
73
|
-
const pageList =
|
|
201
|
+
const pageList = useMemo(() => {
|
|
202
|
+
let finalPages = null;
|
|
203
|
+
if (finalSections && finalSections.length === 1 && !renderSingleSection) {
|
|
204
|
+
finalPages = pages ?? finalSections[0].pages;
|
|
205
|
+
}
|
|
74
206
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<SettingsContext.Provider
|
|
79
|
-
value={{
|
|
80
|
-
intlKey, // This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
|
|
81
|
-
refdataEndpoint,
|
|
82
|
-
settingEndpoint,
|
|
83
|
-
templateEndpoint
|
|
84
|
-
}}
|
|
85
|
-
>
|
|
86
|
-
{children}
|
|
87
|
-
</SettingsContext.Provider>
|
|
88
|
-
);
|
|
89
|
-
};
|
|
207
|
+
return finalPages;
|
|
208
|
+
}, [finalSections, pages, renderSingleSection]);
|
|
90
209
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
};
|
|
210
|
+
const passedSections = useMemo(() => {
|
|
211
|
+
if (finalSections.length > 1 || (finalSections.length === 1 && renderSingleSection)) {
|
|
212
|
+
return finalSections;
|
|
213
|
+
}
|
|
214
|
+
return null;
|
|
215
|
+
}, [finalSections, renderSingleSection]);
|
|
97
216
|
|
|
98
217
|
const SettingsComponent = (props) => {
|
|
99
218
|
return (
|
|
@@ -101,26 +220,21 @@ const useSettings = ({
|
|
|
101
220
|
pages={pageList}
|
|
102
221
|
paneTitle={
|
|
103
222
|
kintIntl.formatKintMessage({
|
|
104
|
-
|
|
105
|
-
|
|
223
|
+
id: 'meta.title'
|
|
224
|
+
})}
|
|
225
|
+
sections={passedSections}
|
|
106
226
|
{...props}
|
|
107
227
|
/>
|
|
108
228
|
);
|
|
109
229
|
};
|
|
110
230
|
|
|
111
|
-
const SettingsComponentWithContext = (props) => {
|
|
112
|
-
return (
|
|
113
|
-
<SettingsContextProvider>
|
|
114
|
-
<SettingsComponent {...props} />
|
|
115
|
-
</SettingsContextProvider>
|
|
116
|
-
);
|
|
117
|
-
};
|
|
118
|
-
|
|
119
231
|
return {
|
|
120
232
|
isLoading,
|
|
121
233
|
pageList,
|
|
122
|
-
|
|
123
|
-
|
|
234
|
+
sections: finalSections,
|
|
235
|
+
SettingsComponent,
|
|
236
|
+
// This doesn't make much sense if there is more than one section, here to avoid breaking changes
|
|
237
|
+
SettingsContextProvider: (finalSections && finalSections.length === 1) ? finalSections[0].SettingsContextProvider : ({ children }) => <> { children } </>
|
|
124
238
|
};
|
|
125
239
|
};
|
|
126
240
|
|