@k-int/stripes-kint-components 5.32.0 → 5.33.1

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.
Files changed (420) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +1 -1
  3. package/es/__mocks__/@folio/stripes/components.js +3 -7
  4. package/es/__mocks__/@folio/stripes/core.js +4 -6
  5. package/es/__mocks__/@folio/stripes/smart-components.js +4 -6
  6. package/es/__mocks__/react-query.js +4 -6
  7. package/es/__mocks__/react-router-dom.js +6 -6
  8. package/es/lib/ActionList/ActionList.js +26 -33
  9. package/es/lib/ActionList/ActionListFieldArray.js +103 -119
  10. package/es/lib/ButtonTypedown/ButtonTypedown.js +25 -33
  11. package/es/lib/ComboButton/ComboButton.js +42 -47
  12. package/es/lib/CustomProperties/Config/CustomPropertiesLookup.js +11 -17
  13. package/es/lib/CustomProperties/Config/CustomPropertiesSettings.js +42 -46
  14. package/es/lib/CustomProperties/Config/CustomPropertyForm.js +58 -58
  15. package/es/lib/CustomProperties/Config/CustomPropertyForm.test.js +4 -8
  16. package/es/lib/CustomProperties/Config/CustomPropertyView.js +32 -33
  17. package/es/lib/CustomProperties/Config/CustomPropertyView.test.js +1 -1
  18. package/es/lib/CustomProperties/Edit/CustomPropertiesEdit.js +1 -1
  19. package/es/lib/CustomProperties/Edit/CustomPropertiesEditCtx.js +3 -3
  20. package/es/lib/CustomProperties/Edit/CustomPropertiesListField.js +29 -35
  21. package/es/lib/CustomProperties/Edit/CustomPropertyField.js +61 -59
  22. package/es/lib/CustomProperties/Edit/CustomPropertyField.test.js +20 -20
  23. package/es/lib/CustomProperties/Edit/CustomPropertyFormCard.js +2 -2
  24. package/es/lib/CustomProperties/Edit/CustomPropertyFormCard.test.js +1 -1
  25. package/es/lib/CustomProperties/Edit/testResources.js +11 -12
  26. package/es/lib/CustomProperties/Filter/CustomPropertiesFilter.js +22 -33
  27. package/es/lib/CustomProperties/Filter/CustomPropertiesFilterField.js +24 -37
  28. package/es/lib/CustomProperties/Filter/CustomPropertiesFilterField.test.js +1 -1
  29. package/es/lib/CustomProperties/Filter/CustomPropertiesFilterFieldArray.js +6 -6
  30. package/es/lib/CustomProperties/Filter/CustomPropertiesFilterForm.js +3 -6
  31. package/es/lib/CustomProperties/Filter/CustomPropertiesFilterForm.test.js +4 -8
  32. package/es/lib/CustomProperties/Filter/CustomPropertiesRule.js +15 -19
  33. package/es/lib/CustomProperties/Filter/testResources.js +1 -2
  34. package/es/lib/CustomProperties/Filter/useParseActiveFilterStrings.js +1 -2
  35. package/es/lib/CustomProperties/View/CustomPropertiesView.js +1 -1
  36. package/es/lib/CustomProperties/View/CustomPropertiesViewCtx.js +17 -25
  37. package/es/lib/CustomProperties/View/CustomPropertiesViewCtx.test.js +3 -6
  38. package/es/lib/CustomProperties/View/CustomPropertyCard.js +7 -11
  39. package/es/lib/CycleButton/CycleButton.js +9 -17
  40. package/es/lib/FormModal/FormModal.js +24 -32
  41. package/es/lib/FormattedKintMessage/FormattedKintMessage.js +23 -30
  42. package/es/lib/IconSelect/IconSelect.js +22 -32
  43. package/es/lib/NoResultsMessage/NoResultsMessage.js +4 -5
  44. package/es/lib/NumberField/NumberField.js +17 -25
  45. package/es/lib/NumberField/NumberField.test.js +6 -7
  46. package/es/lib/QueryTypedown/QueryTypedown.js +8 -15
  47. package/es/lib/RefdataButtons/RefdataButtons.js +6 -9
  48. package/es/lib/ResponsiveButtonGroup/ResponsiveButtonGroup.js +48 -60
  49. package/es/lib/ResponsiveButtonGroup/useResponsiveButtonGroupSizing.js +5 -6
  50. package/es/lib/RichSelect/RichSelect.js +31 -36
  51. package/es/lib/RichSelect/useSelectedOption.js +1 -2
  52. package/es/lib/SASQLookupComponent/SASQLookupComponent.js +91 -94
  53. package/es/lib/SASQLookupComponent/SASQLookupComponent.test.js +44 -36
  54. package/es/lib/SASQLookupComponent/TableBody/TableBody.js +42 -53
  55. package/es/lib/SASQLookupComponent/TableBody/TableBody.test.js +19 -23
  56. package/es/lib/SASQRoute/SASQRoute.js +25 -29
  57. package/es/lib/SASQRoute/SASQRoute.test.js +11 -13
  58. package/es/lib/SASQViewComponent/SASQViewComponent.js +68 -76
  59. package/es/lib/SASQViewComponent/SASQViewComponent.test.js +4 -8
  60. package/es/lib/SearchField/SearchField.js +7 -13
  61. package/es/lib/SearchKeyControl/SearchKeyControl.js +8 -13
  62. package/es/lib/SearchKeyControl/SearchKeyControl.test.js +2 -6
  63. package/es/lib/Settings/EditableRefdataCategoryList/EditableRefdataCategoryList.js +30 -46
  64. package/es/lib/Settings/EditableRefdataList/EditableRefdataList.js +33 -43
  65. package/es/lib/Settings/EditableSettingsList/EditableSettingsListFieldArray/EditableSettingsListFieldArray.js +7 -11
  66. package/es/lib/Settings/EditableSettingsList/SettingField/EditSettingValue/EditSettingValue.js +13 -20
  67. package/es/lib/Settings/EditableSettingsList/SettingField/RenderSettingValue/RenderSettingValue.js +10 -12
  68. package/es/lib/Settings/EditableSettingsList/SettingField/SettingField.js +10 -15
  69. package/es/lib/Settings/EditableSettingsList/SettingField/SettingField.test.js +3 -3
  70. package/es/lib/Settings/RefdataCategoriesSettings/RefdataCategoriesSettings.js +19 -26
  71. package/es/lib/Settings/SettingPage/SettingPagePane/SettingPagePane.js +2 -2
  72. package/es/lib/Settings/Settings/Settings.js +31 -13
  73. package/es/lib/Settings/SettingsFormContainer/SettingsFormContainer.js +30 -35
  74. package/es/lib/Settings/StaticSettingsField/StaticSettingsField.js +5 -8
  75. package/es/lib/Settings/StaticSettingsField/StaticSettingsFieldComponent/StaticSettingsFieldComponent.js +18 -22
  76. package/es/lib/Settings/hooks/staticSettingsPages/useSettingCallout/useSettingCallout.js +2 -2
  77. package/es/lib/Settings/hooks/staticSettingsPages/useSettingsSectionInitalValues/useSettingsSectionInitalValues.js +1 -1
  78. package/es/lib/Settings/hooks/staticSettingsPages/useStaticSettingsSection.js +3 -7
  79. package/es/lib/Settings/hooks/useAppSettings/useAppSettings.js +7 -11
  80. package/es/lib/Settings/hooks/useSettingSection/useSettingSection.js +16 -22
  81. package/es/lib/Settings/hooks/useSettings/useSettings.js +104 -88
  82. package/es/lib/Settings/index.js +8 -0
  83. package/es/lib/Tags/Tags.js +5 -8
  84. package/es/lib/Tags/hooks/useTags.js +1 -1
  85. package/es/lib/Tags/hooks/useTagsEnabled.js +2 -3
  86. package/es/lib/Tags/tagsConfig.js +1 -1
  87. package/es/lib/Typedown/Typedown.js +21 -28
  88. package/es/lib/hooks/__mocks__/index.js +3 -7
  89. package/es/lib/hooks/intlHooks/useIntlKeyStore/useIntlKeyStore.js +20 -26
  90. package/es/lib/hooks/intlHooks/useKintIntl/useKintIntl.js +24 -34
  91. package/es/lib/hooks/typedownHooks/useTypedown.js +11 -12
  92. package/es/lib/hooks/typedownHooks/useTypedownToggle.js +2 -2
  93. package/es/lib/hooks/useActionListRef.js +1 -1
  94. package/es/lib/hooks/useActiveElement.js +1 -1
  95. package/es/lib/hooks/useCustomProperties.js +6 -10
  96. package/es/lib/hooks/useHelperApp.js +13 -16
  97. package/es/lib/hooks/useKiwtFieldArray.js +7 -8
  98. package/es/lib/hooks/useKiwtSASQuery.js +15 -19
  99. package/es/lib/hooks/useLocalPageStore.js +7 -10
  100. package/es/lib/hooks/useModConfigEntries.js +2 -2
  101. package/es/lib/hooks/useMutateCustomProperties/useMutateCustomProperties.js +10 -17
  102. package/es/lib/hooks/useMutateGeneric/useMutateGeneric.js +2 -2
  103. package/es/lib/hooks/useMutateModConfigEntry.js +2 -2
  104. package/es/lib/hooks/useMutateRefdataCategory/useMutateRefdataCategory.js +15 -21
  105. package/es/lib/hooks/useMutateRefdataValue/useMutateRefdataValue.js +16 -23
  106. package/es/lib/hooks/usePrevNextPagination.js +17 -19
  107. package/es/lib/hooks/useQIndex.js +11 -14
  108. package/es/lib/hooks/useRefdata.js +3 -3
  109. package/es/lib/hooks/useStandaloneSASQQueryParameter/useStandaloneSASQQueryParameter.js +9 -13
  110. package/es/lib/hooks/useTemplates.js +4 -4
  111. package/es/lib/utils/buildUrl.js +2 -3
  112. package/es/lib/utils/filterParsers/deparseKiwtQueryFilters.js +5 -5
  113. package/es/lib/utils/filterParsers/parseKiwtQueryFilters.js +2 -2
  114. package/es/lib/utils/filterParsers/parseKiwtQueryGroups.js +4 -5
  115. package/es/lib/utils/filterParsers/parseKiwtQueryString.js +1 -1
  116. package/es/lib/utils/generateKiwtQueryParams/generateKiwtQueryParams.js +94 -107
  117. package/es/lib/utils/groupCustomPropertiesByCtx.js +5 -9
  118. package/es/lib/utils/index.js +34 -13
  119. package/es/lib/utils/matchString/index.js +13 -0
  120. package/es/lib/utils/{matchString.js → matchString/matchString.js} +8 -9
  121. package/es/lib/utils/matchString/matchString.test.js +40 -0
  122. package/es/lib/utils/parseErrorResponse.js +3 -7
  123. package/es/lib/utils/selectorSafe.js +2 -3
  124. package/es/lib/utils/sortByLabel.js +2 -3
  125. package/es/lib/utils/stringStyling/boldString.js +30 -0
  126. package/es/lib/utils/stringStyling/boldString.test.js +47 -0
  127. package/es/lib/utils/stringStyling/highlightString.js +30 -0
  128. package/es/lib/utils/stringStyling/highlightString.test.js +51 -0
  129. package/es/lib/utils/stringStyling/index.js +20 -0
  130. package/es/lib/validators/validators.js +6 -9
  131. package/package.json +1 -1
  132. package/src/artifacts/coverage-jest/ActionList/ActionList.js.html +1 -1
  133. package/src/artifacts/coverage-jest/ActionList/ActionListFieldArray.js.html +1 -1
  134. package/src/artifacts/coverage-jest/ActionList/index.html +1 -1
  135. package/src/artifacts/coverage-jest/ActionList/index.js.html +1 -1
  136. package/src/artifacts/coverage-jest/ButtonTypedown/ButtonTypedown.js.html +1 -1
  137. package/src/artifacts/coverage-jest/ButtonTypedown/index.html +1 -1
  138. package/src/artifacts/coverage-jest/ButtonTypedown/index.js.html +1 -1
  139. package/src/artifacts/coverage-jest/ComboButton/ComboButton.js.html +1 -1
  140. package/src/artifacts/coverage-jest/ComboButton/index.html +1 -1
  141. package/src/artifacts/coverage-jest/ComboButton/index.js.html +1 -1
  142. package/src/artifacts/coverage-jest/CustomProperties/Config/CustomPropertiesLookup.js.html +1 -1
  143. package/src/artifacts/coverage-jest/CustomProperties/Config/CustomPropertiesSettings.js.html +1 -1
  144. package/src/artifacts/coverage-jest/CustomProperties/Config/CustomPropertyForm.js.html +1 -1
  145. package/src/artifacts/coverage-jest/CustomProperties/Config/CustomPropertyView.js.html +1 -1
  146. package/src/artifacts/coverage-jest/CustomProperties/Config/index.html +1 -1
  147. package/src/artifacts/coverage-jest/CustomProperties/Config/index.js.html +1 -1
  148. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertiesEdit.js.html +1 -1
  149. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertiesEditCtx.js.html +1 -1
  150. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertiesListField.js.html +1 -1
  151. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertyField.js.html +1 -1
  152. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertyFormCard.js.html +1 -1
  153. package/src/artifacts/coverage-jest/CustomProperties/Edit/index.html +1 -1
  154. package/src/artifacts/coverage-jest/CustomProperties/Edit/index.js.html +1 -1
  155. package/src/artifacts/coverage-jest/CustomProperties/Edit/testResources.js.html +1 -1
  156. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesFilter.js.html +1 -1
  157. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesFilterField.js.html +1 -1
  158. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesFilterFieldArray.js.html +1 -1
  159. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesFilterForm.js.html +1 -1
  160. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesRule.js.html +1 -1
  161. package/src/artifacts/coverage-jest/CustomProperties/Filter/index.html +1 -1
  162. package/src/artifacts/coverage-jest/CustomProperties/Filter/index.js.html +1 -1
  163. package/src/artifacts/coverage-jest/CustomProperties/Filter/testResources.js.html +1 -1
  164. package/src/artifacts/coverage-jest/CustomProperties/Filter/useOperators.js.html +1 -1
  165. package/src/artifacts/coverage-jest/CustomProperties/Filter/useParseActiveFilterStrings.js.html +1 -1
  166. package/src/artifacts/coverage-jest/CustomProperties/Filter/useValueProps.js.html +1 -1
  167. package/src/artifacts/coverage-jest/CustomProperties/View/CustomPropertiesView.js.html +1 -1
  168. package/src/artifacts/coverage-jest/CustomProperties/View/CustomPropertiesViewCtx.js.html +1 -1
  169. package/src/artifacts/coverage-jest/CustomProperties/View/CustomPropertyCard.js.html +1 -1
  170. package/src/artifacts/coverage-jest/CustomProperties/View/index.html +1 -1
  171. package/src/artifacts/coverage-jest/CustomProperties/View/index.js.html +1 -1
  172. package/src/artifacts/coverage-jest/CustomProperties/View/testResources.js.html +1 -1
  173. package/src/artifacts/coverage-jest/CustomProperties/index.html +1 -1
  174. package/src/artifacts/coverage-jest/CustomProperties/index.js.html +1 -1
  175. package/src/artifacts/coverage-jest/CycleButton/CycleButton.js.html +1 -1
  176. package/src/artifacts/coverage-jest/CycleButton/index.html +1 -1
  177. package/src/artifacts/coverage-jest/CycleButton/index.js.html +1 -1
  178. package/src/artifacts/coverage-jest/FieldLabel/FieldLabel.js.html +1 -1
  179. package/src/artifacts/coverage-jest/FieldLabel/index.html +1 -1
  180. package/src/artifacts/coverage-jest/FieldLabel/index.js.html +1 -1
  181. package/src/artifacts/coverage-jest/FormModal/FormModal.js.html +1 -1
  182. package/src/artifacts/coverage-jest/FormModal/index.html +1 -1
  183. package/src/artifacts/coverage-jest/FormModal/index.js.html +1 -1
  184. package/src/artifacts/coverage-jest/FormattedKintMessage/FormattedKintMessage.js.html +1 -1
  185. package/src/artifacts/coverage-jest/FormattedKintMessage/index.html +1 -1
  186. package/src/artifacts/coverage-jest/FormattedKintMessage/index.js.html +1 -1
  187. package/src/artifacts/coverage-jest/IconSelect/IconSelect.js.html +1 -1
  188. package/src/artifacts/coverage-jest/IconSelect/index.html +1 -1
  189. package/src/artifacts/coverage-jest/IconSelect/index.js.html +1 -1
  190. package/src/artifacts/coverage-jest/NoResultsMessage/NoResultsMessage.js.html +1 -1
  191. package/src/artifacts/coverage-jest/NoResultsMessage/index.html +1 -1
  192. package/src/artifacts/coverage-jest/NoResultsMessage/index.js.html +1 -1
  193. package/src/artifacts/coverage-jest/NumberField/NumberField.js.html +15 -15
  194. package/src/artifacts/coverage-jest/NumberField/index.html +1 -1
  195. package/src/artifacts/coverage-jest/NumberField/index.js.html +1 -1
  196. package/src/artifacts/coverage-jest/QueryTypedown/QueryTypedown.js.html +1 -1
  197. package/src/artifacts/coverage-jest/QueryTypedown/index.html +1 -1
  198. package/src/artifacts/coverage-jest/QueryTypedown/index.js.html +1 -1
  199. package/src/artifacts/coverage-jest/RefdataButtons/RefdataButtons.js.html +1 -1
  200. package/src/artifacts/coverage-jest/RefdataButtons/index.html +1 -1
  201. package/src/artifacts/coverage-jest/RefdataButtons/index.js.html +1 -1
  202. package/src/artifacts/coverage-jest/ResponsiveButtonGroup/ResponsiveButtonGroup.js.html +1 -1
  203. package/src/artifacts/coverage-jest/ResponsiveButtonGroup/index.html +1 -1
  204. package/src/artifacts/coverage-jest/ResponsiveButtonGroup/index.js.html +1 -1
  205. package/src/artifacts/coverage-jest/ResponsiveButtonGroup/useResponsiveButtonGroupSizing.js.html +1 -1
  206. package/src/artifacts/coverage-jest/RichSelect/RichSelect.js.html +1 -1
  207. package/src/artifacts/coverage-jest/RichSelect/index.html +1 -1
  208. package/src/artifacts/coverage-jest/RichSelect/index.js.html +1 -1
  209. package/src/artifacts/coverage-jest/RichSelect/useSelectedOption.js.html +1 -1
  210. package/src/artifacts/coverage-jest/SASQLookupComponent/SASQLookupComponent.js.html +31 -31
  211. package/src/artifacts/coverage-jest/SASQLookupComponent/TableBody/TableBody.js.html +1 -1
  212. package/src/artifacts/coverage-jest/SASQLookupComponent/TableBody/index.html +1 -1
  213. package/src/artifacts/coverage-jest/SASQLookupComponent/TableBody/index.js.html +1 -1
  214. package/src/artifacts/coverage-jest/SASQLookupComponent/index.html +1 -1
  215. package/src/artifacts/coverage-jest/SASQLookupComponent/index.js.html +1 -1
  216. package/src/artifacts/coverage-jest/SASQRoute/SASQRoute.js.html +1 -1
  217. package/src/artifacts/coverage-jest/SASQRoute/index.html +1 -1
  218. package/src/artifacts/coverage-jest/SASQRoute/index.js.html +1 -1
  219. package/src/artifacts/coverage-jest/SASQViewComponent/SASQViewComponent.js.html +1 -1
  220. package/src/artifacts/coverage-jest/SASQViewComponent/index.html +1 -1
  221. package/src/artifacts/coverage-jest/SASQViewComponent/index.js.html +1 -1
  222. package/src/artifacts/coverage-jest/SearchField/SearchField.js.html +1 -1
  223. package/src/artifacts/coverage-jest/SearchField/index.html +1 -1
  224. package/src/artifacts/coverage-jest/SearchField/index.js.html +1 -1
  225. package/src/artifacts/coverage-jest/SearchKeyControl/SearchKeyControl.js.html +1 -1
  226. package/src/artifacts/coverage-jest/SearchKeyControl/index.html +1 -1
  227. package/src/artifacts/coverage-jest/SearchKeyControl/index.js.html +1 -1
  228. package/src/artifacts/coverage-jest/Settings/EditableRefdataCategoryList/EditableRefdataCategoryList.js.html +1 -1
  229. package/src/artifacts/coverage-jest/Settings/EditableRefdataCategoryList/index.html +1 -1
  230. package/src/artifacts/coverage-jest/Settings/EditableRefdataCategoryList/index.js.html +1 -1
  231. package/src/artifacts/coverage-jest/Settings/EditableRefdataList/EditableRefdataList.js.html +1 -1
  232. package/src/artifacts/coverage-jest/Settings/EditableRefdataList/index.html +1 -1
  233. package/src/artifacts/coverage-jest/Settings/EditableRefdataList/index.js.html +1 -1
  234. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/EditableSettingsList.js.html +1 -1
  235. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/EditableSettingsListFieldArray/EditableSettingsListFieldArray.js.html +1 -1
  236. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/EditableSettingsListFieldArray/index.html +1 -1
  237. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/EditableSettingsListFieldArray/index.js.html +1 -1
  238. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/EditSettingValue/EditSettingValue.js.html +1 -1
  239. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/EditSettingValue/index.html +1 -1
  240. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/EditSettingValue/index.js.html +1 -1
  241. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/RenderSettingValue/RenderSettingValue.js.html +1 -1
  242. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/RenderSettingValue/index.html +1 -1
  243. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/RenderSettingValue/index.js.html +1 -1
  244. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/SettingField.js.html +1 -1
  245. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/index.html +1 -1
  246. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/index.js.html +1 -1
  247. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/index.html +1 -1
  248. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/index.js.html +1 -1
  249. package/src/artifacts/coverage-jest/Settings/RefdataCategoriesSettings/RefdataCategoriesSettings.js.html +1 -1
  250. package/src/artifacts/coverage-jest/Settings/RefdataCategoriesSettings/index.html +1 -1
  251. package/src/artifacts/coverage-jest/Settings/RefdataCategoriesSettings/index.js.html +1 -1
  252. package/src/artifacts/coverage-jest/Settings/SettingPage/SettingPage.js.html +1 -1
  253. package/src/artifacts/coverage-jest/Settings/SettingPage/SettingPagePane/SettingPagePane.js.html +1 -1
  254. package/src/artifacts/coverage-jest/Settings/SettingPage/SettingPagePane/index.html +1 -1
  255. package/src/artifacts/coverage-jest/Settings/SettingPage/SettingPagePane/index.js.html +1 -1
  256. package/src/artifacts/coverage-jest/Settings/SettingPage/index.html +1 -1
  257. package/src/artifacts/coverage-jest/Settings/SettingPage/index.js.html +1 -1
  258. package/src/artifacts/coverage-jest/Settings/Settings/Settings.js.html +96 -9
  259. package/src/artifacts/coverage-jest/Settings/Settings/index.html +14 -14
  260. package/src/artifacts/coverage-jest/Settings/Settings/index.js.html +1 -1
  261. package/src/artifacts/coverage-jest/Settings/SettingsFormContainer/SettingsFormContainer.js.html +1 -1
  262. package/src/artifacts/coverage-jest/Settings/SettingsFormContainer/index.html +1 -1
  263. package/src/artifacts/coverage-jest/Settings/SettingsFormContainer/index.js.html +1 -1
  264. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/StaticSettingsField.js.html +1 -1
  265. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/StaticSettingsFieldComponent/StaticSettingsFieldComponent.js.html +1 -1
  266. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/StaticSettingsFieldComponent/index.html +1 -1
  267. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/StaticSettingsFieldComponent/index.js.html +1 -1
  268. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/index.html +1 -1
  269. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/index.js.html +1 -1
  270. package/src/artifacts/coverage-jest/Settings/constants/index.html +1 -1
  271. package/src/artifacts/coverage-jest/Settings/constants/index.js.html +1 -1
  272. package/src/artifacts/coverage-jest/Settings/constants/queryKeys.js.html +1 -1
  273. package/src/artifacts/coverage-jest/Settings/contexts/SettingsContext.js.html +1 -1
  274. package/src/artifacts/coverage-jest/Settings/contexts/index.html +1 -1
  275. package/src/artifacts/coverage-jest/Settings/contexts/index.js.html +1 -1
  276. package/src/artifacts/coverage-jest/Settings/hooks/index.html +1 -1
  277. package/src/artifacts/coverage-jest/Settings/hooks/index.js.html +1 -1
  278. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/index.html +1 -1
  279. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/index.js.html +1 -1
  280. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingCallout/index.html +1 -1
  281. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingCallout/index.js.html +1 -1
  282. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingCallout/useSettingCallout.js.html +1 -1
  283. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingsSectionInitalValues/index.html +1 -1
  284. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingsSectionInitalValues/index.js.html +1 -1
  285. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingsSectionInitalValues/useSettingsSectionInitalValues.js.html +1 -1
  286. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useStaticSettingsSection.js.html +1 -1
  287. package/src/artifacts/coverage-jest/Settings/hooks/useAppSettings/index.html +1 -1
  288. package/src/artifacts/coverage-jest/Settings/hooks/useAppSettings/index.js.html +1 -1
  289. package/src/artifacts/coverage-jest/Settings/hooks/useAppSettings/useAppSettings.js.html +1 -1
  290. package/src/artifacts/coverage-jest/Settings/hooks/useSettingSection/index.html +1 -1
  291. package/src/artifacts/coverage-jest/Settings/hooks/useSettingSection/index.js.html +1 -1
  292. package/src/artifacts/coverage-jest/Settings/hooks/useSettingSection/useSettingSection.js.html +1 -1
  293. package/src/artifacts/coverage-jest/Settings/hooks/useSettings/index.html +13 -13
  294. package/src/artifacts/coverage-jest/Settings/hooks/useSettings/index.js.html +1 -1
  295. package/src/artifacts/coverage-jest/Settings/hooks/useSettings/useSettings.js.html +105 -69
  296. package/src/artifacts/coverage-jest/Settings/index.html +1 -1
  297. package/src/artifacts/coverage-jest/Settings/index.js.html +11 -2
  298. package/src/artifacts/coverage-jest/Tags/Tags.js.html +1 -1
  299. package/src/artifacts/coverage-jest/Tags/hooks/index.html +1 -1
  300. package/src/artifacts/coverage-jest/Tags/hooks/index.js.html +1 -1
  301. package/src/artifacts/coverage-jest/Tags/hooks/useTags.js.html +1 -1
  302. package/src/artifacts/coverage-jest/Tags/hooks/useTagsEnabled.js.html +1 -1
  303. package/src/artifacts/coverage-jest/Tags/index.html +1 -1
  304. package/src/artifacts/coverage-jest/Tags/index.js.html +1 -1
  305. package/src/artifacts/coverage-jest/Tags/tagsConfig.js.html +1 -1
  306. package/src/artifacts/coverage-jest/Typedown/Typedown.js.html +1 -1
  307. package/src/artifacts/coverage-jest/Typedown/index.html +1 -1
  308. package/src/artifacts/coverage-jest/Typedown/index.js.html +1 -1
  309. package/src/artifacts/coverage-jest/cobertura-coverage.xml +371 -334
  310. package/src/artifacts/coverage-jest/constants/comparators.js.html +1 -1
  311. package/src/artifacts/coverage-jest/constants/customProperties.js.html +1 -1
  312. package/src/artifacts/coverage-jest/constants/endpoints.js.html +1 -1
  313. package/src/artifacts/coverage-jest/constants/eventCodes.js.html +1 -1
  314. package/src/artifacts/coverage-jest/constants/index.html +1 -1
  315. package/src/artifacts/coverage-jest/constants/pagination.js.html +1 -1
  316. package/src/artifacts/coverage-jest/hooks/index.html +1 -1
  317. package/src/artifacts/coverage-jest/hooks/index.js.html +1 -1
  318. package/src/artifacts/coverage-jest/hooks/intlHooks/index.html +1 -1
  319. package/src/artifacts/coverage-jest/hooks/intlHooks/index.js.html +1 -1
  320. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKey/index.html +1 -1
  321. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKey/index.js.html +1 -1
  322. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKey/useIntlKey.js.html +7 -7
  323. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKeyStore/index.html +1 -1
  324. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKeyStore/index.js.html +1 -1
  325. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKeyStore/useIntlKeyStore.js.html +6 -6
  326. package/src/artifacts/coverage-jest/hooks/intlHooks/useKintIntl/index.html +1 -1
  327. package/src/artifacts/coverage-jest/hooks/intlHooks/useKintIntl/index.js.html +1 -1
  328. package/src/artifacts/coverage-jest/hooks/intlHooks/useKintIntl/useKintIntl.js.html +6 -6
  329. package/src/artifacts/coverage-jest/hooks/typedownHooks/index.html +1 -1
  330. package/src/artifacts/coverage-jest/hooks/typedownHooks/index.js.html +1 -1
  331. package/src/artifacts/coverage-jest/hooks/typedownHooks/useTypedown.js.html +1 -1
  332. package/src/artifacts/coverage-jest/hooks/typedownHooks/useTypedownData.js.html +1 -1
  333. package/src/artifacts/coverage-jest/hooks/typedownHooks/useTypedownToggle.js.html +1 -1
  334. package/src/artifacts/coverage-jest/hooks/useActionListRef.js.html +1 -1
  335. package/src/artifacts/coverage-jest/hooks/useActiveElement.js.html +1 -1
  336. package/src/artifacts/coverage-jest/hooks/useCustomProperties.js.html +1 -1
  337. package/src/artifacts/coverage-jest/hooks/useHelperApp.js.html +1 -1
  338. package/src/artifacts/coverage-jest/hooks/useInvalidateRefdata/index.html +1 -1
  339. package/src/artifacts/coverage-jest/hooks/useInvalidateRefdata/index.js.html +1 -1
  340. package/src/artifacts/coverage-jest/hooks/useInvalidateRefdata/useInvalidateRefdata.js.html +1 -1
  341. package/src/artifacts/coverage-jest/hooks/useKiwtFieldArray.js.html +1 -1
  342. package/src/artifacts/coverage-jest/hooks/useKiwtSASQuery.js.html +9 -9
  343. package/src/artifacts/coverage-jest/hooks/useLocalPageStore.js.html +1 -1
  344. package/src/artifacts/coverage-jest/hooks/useLocalStorageState.js.html +5 -5
  345. package/src/artifacts/coverage-jest/hooks/useModConfigEntries.js.html +1 -1
  346. package/src/artifacts/coverage-jest/hooks/useMutateCustomProperties/index.html +1 -1
  347. package/src/artifacts/coverage-jest/hooks/useMutateCustomProperties/index.js.html +1 -1
  348. package/src/artifacts/coverage-jest/hooks/useMutateCustomProperties/useMutateCustomProperties.js.html +1 -1
  349. package/src/artifacts/coverage-jest/hooks/useMutateGeneric/index.html +1 -1
  350. package/src/artifacts/coverage-jest/hooks/useMutateGeneric/index.js.html +1 -1
  351. package/src/artifacts/coverage-jest/hooks/useMutateGeneric/useMutateGeneric.js.html +1 -1
  352. package/src/artifacts/coverage-jest/hooks/useMutateModConfigEntry.js.html +1 -1
  353. package/src/artifacts/coverage-jest/hooks/useMutateRefdataCategory/index.html +1 -1
  354. package/src/artifacts/coverage-jest/hooks/useMutateRefdataCategory/index.js.html +1 -1
  355. package/src/artifacts/coverage-jest/hooks/useMutateRefdataCategory/useMutateRefdataCategory.js.html +1 -1
  356. package/src/artifacts/coverage-jest/hooks/useMutateRefdataValue/index.html +1 -1
  357. package/src/artifacts/coverage-jest/hooks/useMutateRefdataValue/index.js.html +1 -1
  358. package/src/artifacts/coverage-jest/hooks/useMutateRefdataValue/useMutateRefdataValue.js.html +1 -1
  359. package/src/artifacts/coverage-jest/hooks/usePrevNextPagination.js.html +20 -20
  360. package/src/artifacts/coverage-jest/hooks/useQIndex.js.html +8 -8
  361. package/src/artifacts/coverage-jest/hooks/useRefdata.js.html +1 -1
  362. package/src/artifacts/coverage-jest/hooks/useSASQQueryMeta.js.html +1 -1
  363. package/src/artifacts/coverage-jest/hooks/useStandaloneSASQQueryParameter/index.html +1 -1
  364. package/src/artifacts/coverage-jest/hooks/useStandaloneSASQQueryParameter/index.js.html +1 -1
  365. package/src/artifacts/coverage-jest/hooks/useStandaloneSASQQueryParameter/useStandaloneSASQQueryParameter.js.html +1 -1
  366. package/src/artifacts/coverage-jest/hooks/useTemplates.js.html +1 -1
  367. package/src/artifacts/coverage-jest/index.html +63 -33
  368. package/src/artifacts/coverage-jest/utils/buildUrl.js.html +1 -1
  369. package/src/artifacts/coverage-jest/utils/filterParsers/deparseKiwtQueryFilters.js.html +1 -1
  370. package/src/artifacts/coverage-jest/utils/filterParsers/index.html +1 -1
  371. package/src/artifacts/coverage-jest/utils/filterParsers/index.js.html +1 -1
  372. package/src/artifacts/coverage-jest/utils/filterParsers/parseKiwtQueryFilters.js.html +1 -1
  373. package/src/artifacts/coverage-jest/utils/filterParsers/parseKiwtQueryGroups.js.html +1 -1
  374. package/src/artifacts/coverage-jest/utils/filterParsers/parseKiwtQueryString.js.html +1 -1
  375. package/src/artifacts/coverage-jest/utils/generateKiwtQuery.js.html +1 -1
  376. package/src/artifacts/coverage-jest/utils/generateKiwtQueryParams/generateKiwtQueryParams.js.html +1 -1
  377. package/src/artifacts/coverage-jest/utils/generateKiwtQueryParams/index.html +1 -1
  378. package/src/artifacts/coverage-jest/utils/generateKiwtQueryParams/index.js.html +1 -1
  379. package/src/artifacts/coverage-jest/utils/groupCustomPropertiesByCtx.js.html +1 -1
  380. package/src/artifacts/coverage-jest/utils/index.html +9 -39
  381. package/src/artifacts/coverage-jest/utils/index.js.html +2 -2
  382. package/src/artifacts/coverage-jest/utils/matchString/index.html +131 -0
  383. package/src/artifacts/coverage-jest/utils/matchString/index.js.html +88 -0
  384. package/src/artifacts/coverage-jest/utils/{matchString.js.html → matchString/matchString.js.html} +82 -55
  385. package/src/artifacts/coverage-jest/utils/modConfigEntriesQueryKey.js.html +1 -1
  386. package/src/artifacts/coverage-jest/utils/parseErrorResponse.js.html +1 -1
  387. package/src/artifacts/coverage-jest/utils/parseModConfigEntry.js.html +1 -1
  388. package/src/artifacts/coverage-jest/utils/refdataOptions.js.html +1 -1
  389. package/src/artifacts/coverage-jest/utils/refdataQueryKey/index.html +1 -1
  390. package/src/artifacts/coverage-jest/utils/refdataQueryKey/index.js.html +1 -1
  391. package/src/artifacts/coverage-jest/utils/refdataQueryKey/refdataQueryKey.js.html +1 -1
  392. package/src/artifacts/coverage-jest/utils/selectorSafe.js.html +1 -1
  393. package/src/artifacts/coverage-jest/utils/sortByLabel.js.html +1 -1
  394. package/src/artifacts/coverage-jest/utils/stringStyling/boldString.js.html +190 -0
  395. package/src/artifacts/coverage-jest/utils/stringStyling/highlightString.js.html +190 -0
  396. package/src/artifacts/coverage-jest/utils/stringStyling/index.html +146 -0
  397. package/src/artifacts/coverage-jest/utils/stringStyling/index.js.html +91 -0
  398. package/src/artifacts/coverage-jest/utils/toCamelCase.js.html +1 -1
  399. package/src/artifacts/coverage-jest/utils/typedownQueryKey.js.html +1 -1
  400. package/src/artifacts/coverage-jest/validators/index.html +1 -1
  401. package/src/artifacts/coverage-jest/validators/index.js.html +1 -1
  402. package/src/artifacts/coverage-jest/validators/validators.js.html +1 -1
  403. package/src/lib/Settings/Settings/Settings.js +30 -1
  404. package/src/lib/Settings/hooks/useSettings/README.md +49 -19
  405. package/src/lib/Settings/hooks/useSettings/useSettings.js +60 -48
  406. package/src/lib/Settings/index.js +3 -0
  407. package/src/lib/utils/index.js +1 -1
  408. package/src/lib/utils/matchString/index.js +1 -0
  409. package/src/lib/utils/matchString/matchString.js +44 -0
  410. package/src/lib/utils/matchString/matchString.test.js +68 -0
  411. package/src/lib/utils/stringStyling/boldString.js +35 -0
  412. package/src/lib/utils/stringStyling/boldString.test.js +59 -0
  413. package/src/lib/utils/stringStyling/highlightString.js +35 -0
  414. package/src/lib/utils/stringStyling/highlightString.test.js +67 -0
  415. package/src/lib/utils/stringStyling/index.js +2 -0
  416. package/styles/stringMatchStyles.css +3 -0
  417. package/es/lib/utils/highlightString.js +0 -45
  418. package/src/artifacts/coverage-jest/utils/highlightString.js.html +0 -259
  419. package/src/lib/utils/highlightString.js +0 -58
  420. package/src/lib/utils/matchString.js +0 -35
@@ -112,7 +112,7 @@ export default toCamelCase;
112
112
  <div class='footer quiet pad2 space-top1 center small'>
113
113
  Code coverage generated by
114
114
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
115
- at 2026-02-17T13:52:17.739Z
115
+ at 2026-03-09T14:50:53.363Z
116
116
  </div>
117
117
  <script src="../prettify.js"></script>
118
118
  <script>
@@ -97,7 +97,7 @@ export default typedownQueryKey;
97
97
  <div class='footer quiet pad2 space-top1 center small'>
98
98
  Code coverage generated by
99
99
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
100
- at 2026-02-17T13:52:17.739Z
100
+ at 2026-03-09T14:50:53.363Z
101
101
  </div>
102
102
  <script src="../prettify.js"></script>
103
103
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-02-17T13:52:17.739Z
119
+ at 2026-03-09T14:50:53.363Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>
@@ -73,7 +73,7 @@
73
73
  <div class='footer quiet pad2 space-top1 center small'>
74
74
  Code coverage generated by
75
75
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
76
- at 2026-02-17T13:52:17.739Z
76
+ at 2026-03-09T14:50:53.363Z
77
77
  </div>
78
78
  <script src="../prettify.js"></script>
79
79
  <script>
@@ -355,7 +355,7 @@ export {
355
355
  <div class='footer quiet pad2 space-top1 center small'>
356
356
  Code coverage generated by
357
357
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
358
- at 2026-02-17T13:52:17.739Z
358
+ at 2026-03-09T14:50:53.363Z
359
359
  </div>
360
360
  <script src="../prettify.js"></script>
361
361
  <script>
@@ -99,11 +99,40 @@ const Settings = ({
99
99
  }, [location.pathname, location.search, match.path, stripes]);
100
100
 
101
101
  const routes = useMemo(() => internalRoutes.map((internalRoute) => {
102
+ const { page } = internalRoute;
103
+ const { component: Component, contextValue, Provider } = page;
104
+
105
+ if (Provider) {
106
+ return (
107
+ <Route
108
+ key={internalRoute.page.route}
109
+ path={`${match.path}/${internalRoute.page.route}`}
110
+ render={props2 => (
111
+ <Provider
112
+ contextValue={contextValue}
113
+ >
114
+ <Component
115
+ {...props2}
116
+ label={internalRoute.page.label}
117
+ stripes={stripes}
118
+ />
119
+ </Provider>
120
+ )}
121
+ />
122
+ );
123
+ }
124
+
102
125
  const Current = internalRoute.component;
103
126
  return (<Route
104
127
  key={internalRoute.page.route}
105
128
  path={`${match.path}/${internalRoute.page.route}`}
106
- render={props2 => <Current {...props2} label={internalRoute.page.label} stripes={stripes} />}
129
+ render={props2 => (
130
+ <Current
131
+ {...props2}
132
+ label={internalRoute.page.label}
133
+ stripes={stripes}
134
+ />
135
+ )}
107
136
  />);
108
137
  }), [internalRoutes, match.path, stripes]);
109
138
 
@@ -1,5 +1,9 @@
1
1
  # useSettings
2
2
 
3
+ >[!WARNING]
4
+ >Legacy Pattern > This hook has become significantly complex and "heavy" due to the need to support legacy stripes-smart-components patterns while managing dynamic context injection.
5
+ > It is possible that this pattern will be significantly reworked in future versions to separate data-fetching logic from UI component generation in a more modular way.
6
+
3
7
  A comprehensive hook that manages the retrieval and configuration of settings data for one or multiple sections. It orchestrates multiple queries with `react-query`, constructs dynamic pages for each settings section, and returns a pre-configured `SettingsComponent` for rendering the settings UI.
4
8
 
5
9
  ## Overview
@@ -45,24 +49,25 @@ const SettingsContainer = () => {
45
49
 
46
50
  `useSettings` accepts an optional settings props object (`settingsProps`) that may include the following properties:
47
51
 
48
- | Name | Type | Description | Required |
49
- |------------------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
50
- | `allowGlobalEdit` | `boolean`| Global flag to enable or disable editing of settings. Defaults to `true`. | ✕ |
51
- | `dynamicPageExclusions`| `array` | Array of section names to be excluded from dynamic page generation. | ✕ |
52
- | `intlKey` | `string` | Base internationalization key for resolving labels. | ✕ |
53
- | `intlNS` | `string` | Internationalization namespace. | ✕ |
54
- | `labelOverrides` | `object` | Custom label overrides for specific settings keys. | ✕ |
55
- | `pages` | `array` | If provided, acts as a passthrough configuration for either sections or standalone pages, disabling query execution. | ✕ |
56
- | `persistentPages` | `array` | Array of pages that persist regardless of dynamic query results. | ✕ |
57
- | `preventQueries` | `boolean`| Flag to disable querying if settings data is provided externally. | ✕ |
58
- | `refdataEndpoint` | `string` | The API endpoint to retrieve reference data for settings. | ✕ |
59
- | `renderSingleSection` | `boolean`| When only one section is available, determines if it should be rendered as a single section with its own label. | ✕ |
60
- | `sectionPermission` | `string` | Permission string that, if provided, restricts the rendering of a section unless the current user has the specified permission. | ✕ |
61
- | `sectionRoute` | `string` | Base route path to be used when constructing dynamic page routes for settings sections. | ✕ |
62
- | `sections` | `array` | Array of section configuration objects. Each object can override or extend the global settings props for that specific section. This means that the shape here matches more or less the shape for the props of `useSettings` itself. | ✕ |
63
- | `settingEndpoint` | `string` | The base URL endpoint for fetching and updating settings. | ✕ |
64
- | `templateEndpoint` | `string` | The endpoint for retrieving settings templates (if applicable). | ✕ |
65
- | `render` | `func` | A custom render function for rendering individual setting fields. This function is passed down to the underlying settings components for specialized display logic. See `EditableSettingsList` for more information on how render is used. | ✕ |
52
+ | Name | Type | Description | Required |
53
+ |-------------------------|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
54
+ | `allowGlobalEdit` | `boolean` | Global flag to enable or disable editing of settings. Defaults to `true`. | ✕ |
55
+ | `contextPerPage` | `boolean` | If `true`, wraps every individual page component in a Context Provider. Set to `false` if encountering redraw issues with SASQ components. Defaults to `true`, see "Performance & Redraws" section below for more information. | ✕ |
56
+ | `dynamicPageExclusions` | `array` | Array of section names to be excluded from dynamic page generation. | ✕ |
57
+ | `intlKey` | `string` | Base internationalization key for resolving labels. | ✕ |
58
+ | `intlNS` | `string` | Internationalization namespace. | ✕ |
59
+ | `labelOverrides` | `object` | Custom label overrides for specific settings keys. | ✕ |
60
+ | `pages` | `array` | If provided, acts as a passthrough configuration for either sections or standalone pages, disabling query execution. | ✕ |
61
+ | `persistentPages` | `array` | Array of pages that persist regardless of dynamic query results. | ✕ |
62
+ | `preventQueries` | `boolean` | Flag to disable querying if settings data is provided externally. | ✕ |
63
+ | `refdataEndpoint` | `string` | The API endpoint to retrieve reference data for settings. | ✕ |
64
+ | `renderSingleSection` | `boolean` | When only one section is available, determines if it should be rendered as a single section with its own label. | ✕ |
65
+ | `sectionPermission` | `string` | Permission string that, if provided, restricts the rendering of a section unless the current user has the specified permission. | ✕ |
66
+ | `sectionRoute` | `string` | Base route path to be used when constructing dynamic page routes for settings sections. | ✕ |
67
+ | `sections` | `array` | Array of section configuration objects. Each object can override or extend the global settings props for that specific section. This means that the shape here matches more or less the shape for the props of `useSettings` itself. | ✕ |
68
+ | `settingEndpoint` | `string` | The base URL endpoint for fetching and updating settings. | ✕ |
69
+ | `templateEndpoint` | `string` | The endpoint for retrieving settings templates (if applicable). | ✕ |
70
+ | `render` | `func` | A custom render function for rendering individual setting fields. This function is passed down to the underlying settings components for specialized display logic. See `EditableSettingsList` for more information on how render is used. | ✕ |
66
71
 
67
72
  ## Returns
68
73
 
@@ -81,4 +86,29 @@ The hook returns an object containing:
81
86
  A component pre-configured with the pages and sections that renders the settings UI. This component wraps the settings in the required `Settings` component from `@folio/stripes/smart-components`.
82
87
 
83
88
  - **`SettingsContextProvider`** (`React Component`):
84
- A context provider component for settings configuration. If only one section is available, it is provided directly; otherwise, it defaults to a pass-through provider.
89
+ A context provider component for settings configuration. If only one section is available, it is provided directly; otherwise, it defaults to a pass-through provider.
90
+
91
+ ## Performance and redraws
92
+ Because SettingsComponent is generated within the hook, its function reference changes whenever the underlying settings data (like pageList or sections) updates.
93
+
94
+ In some complex scenarios (e.g., using SearchAndSortQuery inside a settings page), this can cause the entire settings pane to unmount and remount (a "redraw"). If you experience lost input focus or flickering, instead of using the returned SettingsComponent, manually render the Settings component using the pageList or sections provided by the hook:
95
+
96
+ ```javascript
97
+ import { Settings } from '@k-int/stripes-kint-components';
98
+
99
+ const { isLoading, pageList, sections } = useSettings({
100
+ contextPerPage: false, // This should be turned off for this pattern
101
+ ...restOfConfig
102
+ });
103
+
104
+ if (isLoading) return null;
105
+
106
+ return (
107
+ <Settings
108
+ {...props}
109
+ pages={pageList}
110
+ sections={sections}
111
+ paneTitle={<FormattedMessage id="my-app.settings.title" />}
112
+ />
113
+ );
114
+ ```
@@ -1,7 +1,7 @@
1
1
  import { useCallback, useEffect, useMemo, useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
-
4
3
  import { useQueries } from 'react-query';
4
+
5
5
  import { useOkapiKy, useStripes } from '@folio/stripes/core';
6
6
 
7
7
  // We have swapped from the stripes-smart components settings page to our own internal one.
@@ -13,12 +13,30 @@ import { SettingPage, SettingPagePane } from '../../SettingPage';
13
13
  import { SettingsContext } from '../../contexts';
14
14
 
15
15
  import { generateKiwtQueryParams, sortByLabel, toCamelCase } from '../../../utils';
16
- import { useKintIntl, useIntlKey } from '../../../hooks';
16
+ import { useIntlKey, useKintIntl } from '../../../hooks';
17
+
18
+ const InternalSettingsContextProvider = ({ children, contextValue }) => (
19
+ <SettingsContext.Provider value={contextValue}>
20
+ {children}
21
+ </SettingsContext.Provider>
22
+ );
23
+
24
+ InternalSettingsContextProvider.propTypes = {
25
+ children: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
26
+ contextValue: PropTypes.object,
27
+ };
17
28
 
18
29
  // TODO work underway to make the settings hook more useful when trying to render multiple sections at a time
19
30
  const useSettings = (settingsProps = {}) => {
20
31
  const {
21
32
  allowGlobalEdit = true,
33
+ // DEPRECATED This prop will eventually be set to FALSE in a breaking change.
34
+ // This is a LEGACY prop, which ensured each page had context pre-wrapped.
35
+ // This is NOT required while using Settings component within kint-components
36
+ // to render dynamic pages, but the dynamic pages break if context is missing with
37
+ // the stripes smart components model
38
+ // Turn this OFF if having difficulties with settings page redraws (When using SASQ in particular)
39
+ contextPerPage = true,
22
40
  dynamicPageExclusions,
23
41
  intlKey: passedIntlKey,
24
42
  intlNS: passedIntlNS,
@@ -40,6 +58,7 @@ const useSettings = (settingsProps = {}) => {
40
58
  const ky = useOkapiKy();
41
59
  const stripes = useStripes();
42
60
  const kintIntl = useKintIntl(passedIntlKey, passedIntlNS);
61
+ const intlKey = useIntlKey(passedIntlKey, passedIntlNS);
43
62
 
44
63
  // Set up array of queryParams, pageLists etc etc ready for us to do all the work in a single place
45
64
 
@@ -154,50 +173,42 @@ const useSettings = (settingsProps = {}) => {
154
173
 
155
174
  const finalSections = useMemo(() => {
156
175
  return sectionMetaArray.map(((sma, idx) => {
157
- const SettingsContextProvider = ({ children }) => {
158
- const intlKey = useIntlKey(passedIntlKey, passedIntlNS);
159
-
160
- const contextValue = useMemo(() => ({
161
- intlKey: sma.intlKey ?? intlKey, // This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
162
- refdataEndpoint: sma.refdataEndpoint ?? refdataEndpoint,
163
- settingEndpoint: sma.settingEndpoint ?? settingEndpoint,
164
- templateEndpoint: sma.templateEndpoint ?? templateEndpoint,
165
- }), [intlKey]);
166
-
167
- return (
168
- <SettingsContext.Provider
169
- value={contextValue}
170
- >
171
- {children}
172
- </SettingsContext.Provider>
173
- );
174
- };
175
-
176
- SettingsContextProvider.propTypes = {
177
- children: PropTypes.oneOfType([
178
- PropTypes.func,
179
- PropTypes.node
180
- ])
176
+ const contextValue = {
177
+ intlKey: sma.intlKey ?? intlKey, // This is only here for backwards compatibility... is now grabbed from useIntlKey instead of what's passed in directly
178
+ refdataEndpoint: sma.refdataEndpoint ?? refdataEndpoint,
179
+ settingEndpoint: sma.settingEndpoint ?? settingEndpoint,
180
+ templateEndpoint: sma.templateEndpoint ?? templateEndpoint,
181
181
  };
182
182
 
183
183
  const finalPermission = sma.sectionPermission ?? sectionPermission;
184
184
  if (!finalPermission || stripes.hasPerm(finalPermission)) {
185
185
  const dynamicPagesFromQueryReturn = getDynamicPages(queryReturnArray[idx], sma);
186
186
 
187
- const finalPages = sma.pages ?? pages ?? (sma.persistentPages ?? persistentPages).concat(dynamicPagesFromQueryReturn.dynamic).sort(sortByLabel).map((p) => {
188
- return {
189
- ...p,
190
- component: (pCProps) => (
191
- <SettingsContextProvider>
192
- <p.component {...pCProps} />
193
- </SettingsContextProvider>
194
- )
195
- };
196
- });
187
+ const finalPages = sma.pages ?? pages ??
188
+ (sma.persistentPages ?? persistentPages)
189
+ .concat(dynamicPagesFromQueryReturn.dynamic)
190
+ .sort(sortByLabel)
191
+ .map((p) => {
192
+ let component = p.component;
193
+ if (contextPerPage) {
194
+ component = (cprops) => (
195
+ <InternalSettingsContextProvider contextValue={contextValue}>
196
+ <p.component {...cprops} />
197
+ </InternalSettingsContextProvider>
198
+ );
199
+ }
200
+
201
+ return {
202
+ ...p,
203
+ component,
204
+ Provider: InternalSettingsContextProvider,
205
+ contextValue,
206
+ };
207
+ });
197
208
 
198
209
  return {
199
210
  ...sma,
200
- SettingsContextProvider,
211
+ SettingsContextProvider: InternalSettingsContextProvider,
201
212
  ...dynamicPagesFromQueryReturn,
202
213
  pageList: finalPages, // DEPRECATED Here for backwards compatibility
203
214
  pages: finalPages // ASSUMPTION MADE THAT INDICES REMAIN THE SAME
@@ -205,46 +216,47 @@ const useSettings = (settingsProps = {}) => {
205
216
  }
206
217
  return null;
207
218
  })).filter(Boolean);
208
- }, [getDynamicPages, pages, passedIntlKey, passedIntlNS, persistentPages, queryReturnArray, refdataEndpoint, sectionMetaArray, sectionPermission, settingEndpoint, stripes, templateEndpoint]);
219
+ }, [contextPerPage, getDynamicPages, intlKey, pages, persistentPages, queryReturnArray, refdataEndpoint, sectionMetaArray, sectionPermission, settingEndpoint, stripes, templateEndpoint]);
209
220
 
210
- const pageList = useMemo(() => {
221
+ const outputPages = useMemo(() => {
211
222
  let finalPages = null;
212
- if (finalSections && finalSections.length === 1 && !renderSingleSection) {
223
+ if (finalSections?.length === 1 && !renderSingleSection) {
213
224
  finalPages = pages ?? finalSections[0].pages;
214
225
  }
215
226
 
216
227
  return finalPages;
217
228
  }, [finalSections, pages, renderSingleSection]);
218
229
 
219
- const passedSections = useMemo(() => {
230
+ const outputSections = useMemo(() => {
220
231
  if (finalSections.length > 1 || (finalSections.length === 1 && renderSingleSection)) {
221
232
  return finalSections;
222
233
  }
223
234
  return null;
224
235
  }, [finalSections, renderSingleSection]);
225
236
 
226
- const SettingsComponent = (props) => {
237
+ const SettingsComponent = useCallback((props) => {
227
238
  return (
228
239
  <Settings
229
- pages={pageList}
240
+ pages={outputPages}
230
241
  paneTitle={
231
242
  kintIntl.formatKintMessage({
232
243
  id: 'meta.title'
233
244
  })}
234
- sections={passedSections}
245
+ sections={outputSections}
235
246
  {...props}
236
247
  />
237
248
  );
238
- };
249
+ }, [kintIntl, outputPages, outputSections]);
239
250
 
240
251
  return {
241
252
  isLoading,
242
- pageList,
243
- sections: finalSections,
253
+ pageList: outputPages,
254
+ sections: outputSections,
244
255
  SettingsComponent,
245
256
  // This doesn't make much sense if there is more than one section, here to avoid breaking changes
246
- SettingsContextProvider: (finalSections && finalSections.length === 1) ? finalSections[0].SettingsContextProvider : ({ children }) => <> { children } </>
257
+ SettingsContextProvider: (finalSections?.length === 1) ? finalSections[0].SettingsContextProvider : ({ children }) => <> { children } </>
247
258
  };
248
259
  };
249
260
 
250
261
  export default useSettings;
262
+
@@ -9,6 +9,9 @@ export {
9
9
  SettingPagePane,
10
10
  } from './SettingPage';
11
11
 
12
+ // Internal replacement for stripes-smart-components Settings component
13
+ export { default as Settings } from './Settings';
14
+
12
15
  // EditableSettingsList
13
16
  export * from './EditableSettingsList';
14
17
 
@@ -17,7 +17,7 @@ export { default as toCamelCase } from './toCamelCase'; // I hate that this exis
17
17
 
18
18
 
19
19
  export { default as matchString } from './matchString';
20
- export { boldString, highlightString } from './highlightString';
20
+ export * from './stringStyling';
21
21
 
22
22
  export {
23
23
  parseKiwtQueryGroups,
@@ -0,0 +1 @@
1
+ export { default } from './matchString';
@@ -0,0 +1,44 @@
1
+ import escapeRegExp from 'lodash/escapeRegExp';
2
+
3
+ const matchString = (match, str, ignoreNull = true, simpleSplit = true) => {
4
+ // Simple regex split -- this is default behaviour
5
+ const regexSimple = new RegExp(
6
+ `${match.split(/(\s+)/)
7
+ .filter(h => h.trim())
8
+ .map(hl => '(' + escapeRegExp(hl) + ')')
9
+ .join('|')}`,
10
+ 'gi'
11
+ );
12
+
13
+ // Split Elvis "The King" Presley into [Elvis, The King, Presley]
14
+ const quotedParts = match.match(/"[^"]*"|\S+/g) || [];
15
+ const regex = new RegExp(
16
+ `${
17
+ quotedParts
18
+ .filter(h => h.trim())
19
+ .map(quotedSection => {
20
+ if (quotedSection.charAt(0) === '"' && quotedSection.charAt(quotedSection.length - 1) === '"') {
21
+ return quotedSection.slice(1, -1);
22
+ }
23
+ return quotedSection;
24
+ })
25
+ .map(hl => '(' + escapeRegExp(hl) + ')')
26
+ .join('|')
27
+ }`,
28
+ 'gi'
29
+ );
30
+
31
+ if (ignoreNull && !match) {
32
+ const nullRegex = /a^/gi; // Should match nothing
33
+
34
+ return [[str], nullRegex];
35
+ }
36
+
37
+ if (simpleSplit) {
38
+ return [str.split(regexSimple)?.filter(s => s != null && s !== ''), regexSimple];
39
+ }
40
+
41
+ return [str.split(regex)?.filter(s => s != null && s !== ''), regex];
42
+ };
43
+
44
+ export default matchString;
@@ -0,0 +1,68 @@
1
+ import matchString from './matchString';
2
+
3
+ describe('matchString', () => {
4
+ describe('simpleSplit=true (default)', () => {
5
+ test.each([
6
+ ['hello', 'say hello world', 'hello', 'splits by matched term'],
7
+ ['HELLO', 'say hello world', 'hello', 'match is case insensitive'],
8
+ ['foo bar', 'foo baz bar', 'foo', 'highlights individual words'],
9
+ ['foo bar', 'foo baz bar', 'bar', 'highlights individual words (second word)'],
10
+ ['foo.bar', 'foo.bar baz', 'foo.bar', 'handles regex special characters'],
11
+ ['(test)', '(test) value', '(test)', 'handles parentheses'],
12
+ ])('%s: when searching "%s", parts should contain "%s"', (term, str, expected) => {
13
+ const [parts] = matchString(term, str);
14
+ expect(parts).toContain(expected);
15
+ });
16
+
17
+ test.each([
18
+ ['AN', 'AN 2025', 'start of string'],
19
+ ['AN 2025', 'AN 2025', 'full match'],
20
+ ['AB', 'AB CD EF', 'multiple spaces'],
21
+ ['world', 'hello world', 'end of string'],
22
+ ['a', 'a b a', 'multiple matches'],
23
+ ['A', 'AN 2025', 'single character'],
24
+ ['AN ', 'AN 2025', 'trailing space'],
25
+ ])('preserves original string structure for "%s" in "%s" (%s)', (term, str) => {
26
+ const [parts] = matchString(term, str);
27
+ expect(parts.join('')).toBe(str);
28
+ });
29
+
30
+ test('returns full string when no match found', () => {
31
+ const [parts] = matchString('xyz', 'hello world');
32
+ expect(parts).toEqual(['hello world']);
33
+ });
34
+
35
+ test('returns regex as second element with correct flags', () => {
36
+ const [, regex] = matchString('test', 'this is a test');
37
+ expect(regex).toBeInstanceOf(RegExp);
38
+ expect(regex.flags).toMatch(/g/);
39
+ expect(regex.flags).toMatch(/i/);
40
+ });
41
+ });
42
+
43
+ describe('simpleSplit=false (quoted string support)', () => {
44
+ test.each([
45
+ ['"The King"', 'Elvis The King Presley', 'The King', 'quoted phrases as single term'],
46
+ ['AN', 'AN 2025', 'AN', 'start of string'],
47
+ ['AN ', 'AN 2025', 'AN', 'trailing space'],
48
+ ['"AN 2025"', 'AN 2025', 'AN 2025', 'full match of quoted phrase'],
49
+ ['hello', 'hello world', 'hello', 'partial match'],
50
+ ['AB', 'AB CD EF', 'AB', 'multiple spaces'],
51
+ ['world', 'hello world', 'world', 'end of string'],
52
+ ['a', 'a b a', 'a', 'multiple matches'],
53
+ ['A', 'AN 2025', 'A', 'single character'],
54
+ ])('simpleSplit=false: %s in "%s" should preserve string and contain "%s"', (term, str, expected) => {
55
+ const [parts] = matchString(term, str, true, false);
56
+ expect(parts.join('')).toBe(str);
57
+ expect(parts).toContain(expected);
58
+ });
59
+ });
60
+
61
+ describe('ignoreNull behavior', () => {
62
+ test('returns full string with non-matching regex when match is empty and ignoreNull=true', () => {
63
+ const [parts, regex] = matchString('', 'hello world', true);
64
+ expect(parts).toEqual(['hello world']);
65
+ expect(regex.exec('anything')).toBeNull();
66
+ });
67
+ });
68
+ });
@@ -0,0 +1,35 @@
1
+ import matchString from '../matchString';
2
+
3
+ import css from '../../../../styles/stringMatchStyles.css';
4
+
5
+ const boldString = (match, str, ignoreNull = true, simpleSplit = true) => {
6
+ const [parts, regex] = matchString(match, str, ignoreNull, simpleSplit);
7
+
8
+ return (
9
+ parts.map((part, i) => {
10
+ // RegExp is stateful, set up a new one to work with
11
+ const immutableRegex = new RegExp(regex);
12
+ if (immutableRegex.exec(part) !== null) {
13
+ return (
14
+ <strong
15
+ key={`bold-strong-${part}-${i}`}
16
+ className={css.whitespacePre}
17
+ >
18
+ {part}
19
+ </strong>
20
+ );
21
+ }
22
+
23
+ return (
24
+ <span
25
+ key={`bold-span-${part}-${i}`}
26
+ className={css.whitespacePre}
27
+ >
28
+ {part}
29
+ </span>
30
+ );
31
+ })
32
+ );
33
+ };
34
+
35
+ export default boldString;
@@ -0,0 +1,59 @@
1
+ import { render } from '@folio/jest-config-stripes/testing-library/react';
2
+ import boldString from './boldString';
3
+
4
+ import css from '../../../../styles/stringMatchStyles.css';
5
+
6
+ const renderBolded = (match, str, ignoreNull, simpleSplit) => {
7
+ const result = boldString(match, str, ignoreNull, simpleSplit);
8
+ const { container } = render(<div>{result}</div>);
9
+ return container;
10
+ };
11
+
12
+ describe('boldString', () => {
13
+ describe('logic and structure', () => {
14
+ test.each([
15
+ ['hello', 'say hello world', 1, 'wraps matched text in <strong>'],
16
+ ['HELLO', 'say hello world', 1, 'match is case insensitive'],
17
+ ['o', 'foo boo', 4, 'highlights multiple occurrences (o in foo boo)'],
18
+ ['oo', 'foo boo', 2, 'highlights multiple occurrences (oo in foo boo)'],
19
+ ])('%s: %s', (match, str, expectedBolds) => {
20
+ const container = renderBolded(match, str);
21
+ expect(container.querySelectorAll('strong')).toHaveLength(expectedBolds);
22
+ expect(container.textContent).toBe(str);
23
+ });
24
+
25
+ test('returns full string without strong tags when no match', () => {
26
+ const container = renderBolded('xyz', 'hello world');
27
+ expect(container.querySelectorAll('strong')).toHaveLength(0);
28
+ expect(container.textContent).toBe('hello world');
29
+ });
30
+ });
31
+
32
+ describe('space preservation (all modes)', () => {
33
+ test.each([
34
+ ['A', 'AN 2025', true, false],
35
+ ['AN ', 'AN 2025', true, false],
36
+ ['AN 2025', 'AN 2025', true, true],
37
+ ['world', 'hello world', true, true],
38
+ ])('searching "%s" in "%s" (simpleSplit: %s) preserves spaces', (match, str, ignore, simple) => {
39
+ const container = renderBolded(match, str, ignore, simple);
40
+ expect(container.textContent).toBe(str);
41
+ });
42
+ });
43
+
44
+ describe('whitespace styling', () => {
45
+ test.each([
46
+ ['strong', 'AN', 'AN 2025'],
47
+ ['span', 'AN', 'AN 2025'],
48
+ ])('%s elements should have whiteSpace: pre', (selector, match, str) => {
49
+ const container = renderBolded(match, str, true, false);
50
+ const elements = container.querySelectorAll(selector);
51
+
52
+ expect(elements.length).toBeGreaterThan(0);
53
+ elements.forEach(el => {
54
+ // Compare classname to "whitespacePre" from css
55
+ expect(el.classList.contains(css.whitespacePre)).toBe(true);
56
+ });
57
+ });
58
+ });
59
+ });