@k-int/stripes-kint-components 5.30.0 → 5.31.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 (278) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/es/index.js +8 -0
  3. package/es/lib/ButtonTypedown/ButtonTypedown.js +59 -0
  4. package/es/lib/ButtonTypedown/index.js +13 -0
  5. package/es/lib/Typedown/Typedown.js +89 -46
  6. package/es/lib/hooks/typedownHooks/useTypedown.js +148 -85
  7. package/package.json +1 -1
  8. package/src/artifacts/coverage-jest/ActionList/ActionList.js.html +1 -1
  9. package/src/artifacts/coverage-jest/ActionList/ActionListFieldArray.js.html +1 -1
  10. package/src/artifacts/coverage-jest/ActionList/index.html +1 -1
  11. package/src/artifacts/coverage-jest/ActionList/index.js.html +1 -1
  12. package/src/artifacts/coverage-jest/ButtonTypedown/ButtonTypedown.js.html +244 -0
  13. package/src/artifacts/coverage-jest/ButtonTypedown/index.html +131 -0
  14. package/src/artifacts/coverage-jest/ButtonTypedown/index.js.html +88 -0
  15. package/src/artifacts/coverage-jest/ComboButton/ComboButton.js.html +1 -1
  16. package/src/artifacts/coverage-jest/ComboButton/index.html +1 -1
  17. package/src/artifacts/coverage-jest/ComboButton/index.js.html +1 -1
  18. package/src/artifacts/coverage-jest/CustomProperties/Config/CustomPropertiesLookup.js.html +1 -1
  19. package/src/artifacts/coverage-jest/CustomProperties/Config/CustomPropertiesSettings.js.html +1 -1
  20. package/src/artifacts/coverage-jest/CustomProperties/Config/CustomPropertyForm.js.html +1 -1
  21. package/src/artifacts/coverage-jest/CustomProperties/Config/CustomPropertyView.js.html +1 -1
  22. package/src/artifacts/coverage-jest/CustomProperties/Config/index.html +1 -1
  23. package/src/artifacts/coverage-jest/CustomProperties/Config/index.js.html +1 -1
  24. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertiesEdit.js.html +1 -1
  25. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertiesEditCtx.js.html +1 -1
  26. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertiesListField.js.html +1 -1
  27. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertyField.js.html +1 -1
  28. package/src/artifacts/coverage-jest/CustomProperties/Edit/CustomPropertyFormCard.js.html +1 -1
  29. package/src/artifacts/coverage-jest/CustomProperties/Edit/index.html +1 -1
  30. package/src/artifacts/coverage-jest/CustomProperties/Edit/index.js.html +1 -1
  31. package/src/artifacts/coverage-jest/CustomProperties/Edit/testResources.js.html +1 -1
  32. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesFilter.js.html +1 -1
  33. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesFilterField.js.html +1 -1
  34. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesFilterFieldArray.js.html +1 -1
  35. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesFilterForm.js.html +1 -1
  36. package/src/artifacts/coverage-jest/CustomProperties/Filter/CustomPropertiesRule.js.html +1 -1
  37. package/src/artifacts/coverage-jest/CustomProperties/Filter/index.html +1 -1
  38. package/src/artifacts/coverage-jest/CustomProperties/Filter/index.js.html +1 -1
  39. package/src/artifacts/coverage-jest/CustomProperties/Filter/testResources.js.html +1 -1
  40. package/src/artifacts/coverage-jest/CustomProperties/Filter/useOperators.js.html +1 -1
  41. package/src/artifacts/coverage-jest/CustomProperties/Filter/useParseActiveFilterStrings.js.html +1 -1
  42. package/src/artifacts/coverage-jest/CustomProperties/Filter/useValueProps.js.html +1 -1
  43. package/src/artifacts/coverage-jest/CustomProperties/View/CustomPropertiesView.js.html +1 -1
  44. package/src/artifacts/coverage-jest/CustomProperties/View/CustomPropertiesViewCtx.js.html +1 -1
  45. package/src/artifacts/coverage-jest/CustomProperties/View/CustomPropertyCard.js.html +1 -1
  46. package/src/artifacts/coverage-jest/CustomProperties/View/index.html +1 -1
  47. package/src/artifacts/coverage-jest/CustomProperties/View/index.js.html +1 -1
  48. package/src/artifacts/coverage-jest/CustomProperties/View/testResources.js.html +1 -1
  49. package/src/artifacts/coverage-jest/CustomProperties/index.html +1 -1
  50. package/src/artifacts/coverage-jest/CustomProperties/index.js.html +1 -1
  51. package/src/artifacts/coverage-jest/CycleButton/CycleButton.js.html +1 -1
  52. package/src/artifacts/coverage-jest/CycleButton/index.html +1 -1
  53. package/src/artifacts/coverage-jest/CycleButton/index.js.html +1 -1
  54. package/src/artifacts/coverage-jest/FieldLabel/FieldLabel.js.html +1 -1
  55. package/src/artifacts/coverage-jest/FieldLabel/index.html +1 -1
  56. package/src/artifacts/coverage-jest/FieldLabel/index.js.html +1 -1
  57. package/src/artifacts/coverage-jest/FormModal/FormModal.js.html +1 -1
  58. package/src/artifacts/coverage-jest/FormModal/index.html +1 -1
  59. package/src/artifacts/coverage-jest/FormModal/index.js.html +1 -1
  60. package/src/artifacts/coverage-jest/FormattedKintMessage/FormattedKintMessage.js.html +1 -1
  61. package/src/artifacts/coverage-jest/FormattedKintMessage/index.html +1 -1
  62. package/src/artifacts/coverage-jest/FormattedKintMessage/index.js.html +1 -1
  63. package/src/artifacts/coverage-jest/IconSelect/IconSelect.js.html +1 -1
  64. package/src/artifacts/coverage-jest/IconSelect/index.html +1 -1
  65. package/src/artifacts/coverage-jest/IconSelect/index.js.html +1 -1
  66. package/src/artifacts/coverage-jest/NoResultsMessage/NoResultsMessage.js.html +1 -1
  67. package/src/artifacts/coverage-jest/NoResultsMessage/index.html +1 -1
  68. package/src/artifacts/coverage-jest/NoResultsMessage/index.js.html +1 -1
  69. package/src/artifacts/coverage-jest/NumberField/NumberField.js.html +1 -1
  70. package/src/artifacts/coverage-jest/NumberField/index.html +1 -1
  71. package/src/artifacts/coverage-jest/NumberField/index.js.html +1 -1
  72. package/src/artifacts/coverage-jest/QueryTypedown/QueryTypedown.js.html +1 -1
  73. package/src/artifacts/coverage-jest/QueryTypedown/index.html +1 -1
  74. package/src/artifacts/coverage-jest/QueryTypedown/index.js.html +1 -1
  75. package/src/artifacts/coverage-jest/RefdataButtons/RefdataButtons.js.html +1 -1
  76. package/src/artifacts/coverage-jest/RefdataButtons/index.html +1 -1
  77. package/src/artifacts/coverage-jest/RefdataButtons/index.js.html +1 -1
  78. package/src/artifacts/coverage-jest/ResponsiveButtonGroup/ResponsiveButtonGroup.js.html +1 -1
  79. package/src/artifacts/coverage-jest/ResponsiveButtonGroup/index.html +1 -1
  80. package/src/artifacts/coverage-jest/ResponsiveButtonGroup/index.js.html +1 -1
  81. package/src/artifacts/coverage-jest/ResponsiveButtonGroup/useResponsiveButtonGroupSizing.js.html +1 -1
  82. package/src/artifacts/coverage-jest/RichSelect/RichSelect.js.html +1 -1
  83. package/src/artifacts/coverage-jest/RichSelect/index.html +1 -1
  84. package/src/artifacts/coverage-jest/RichSelect/index.js.html +1 -1
  85. package/src/artifacts/coverage-jest/RichSelect/useSelectedOption.js.html +1 -1
  86. package/src/artifacts/coverage-jest/SASQLookupComponent/SASQLookupComponent.js.html +1 -1
  87. package/src/artifacts/coverage-jest/SASQLookupComponent/TableBody/TableBody.js.html +1 -1
  88. package/src/artifacts/coverage-jest/SASQLookupComponent/TableBody/index.html +1 -1
  89. package/src/artifacts/coverage-jest/SASQLookupComponent/TableBody/index.js.html +1 -1
  90. package/src/artifacts/coverage-jest/SASQLookupComponent/index.html +1 -1
  91. package/src/artifacts/coverage-jest/SASQLookupComponent/index.js.html +1 -1
  92. package/src/artifacts/coverage-jest/SASQRoute/SASQRoute.js.html +1 -1
  93. package/src/artifacts/coverage-jest/SASQRoute/index.html +1 -1
  94. package/src/artifacts/coverage-jest/SASQRoute/index.js.html +1 -1
  95. package/src/artifacts/coverage-jest/SASQViewComponent/SASQViewComponent.js.html +1 -1
  96. package/src/artifacts/coverage-jest/SASQViewComponent/index.html +1 -1
  97. package/src/artifacts/coverage-jest/SASQViewComponent/index.js.html +1 -1
  98. package/src/artifacts/coverage-jest/SearchField/SearchField.js.html +1 -1
  99. package/src/artifacts/coverage-jest/SearchField/index.html +1 -1
  100. package/src/artifacts/coverage-jest/SearchField/index.js.html +1 -1
  101. package/src/artifacts/coverage-jest/SearchKeyControl/SearchKeyControl.js.html +1 -1
  102. package/src/artifacts/coverage-jest/SearchKeyControl/index.html +1 -1
  103. package/src/artifacts/coverage-jest/SearchKeyControl/index.js.html +1 -1
  104. package/src/artifacts/coverage-jest/Settings/EditableRefdataCategoryList/EditableRefdataCategoryList.js.html +1 -1
  105. package/src/artifacts/coverage-jest/Settings/EditableRefdataCategoryList/index.html +1 -1
  106. package/src/artifacts/coverage-jest/Settings/EditableRefdataCategoryList/index.js.html +1 -1
  107. package/src/artifacts/coverage-jest/Settings/EditableRefdataList/EditableRefdataList.js.html +1 -1
  108. package/src/artifacts/coverage-jest/Settings/EditableRefdataList/index.html +1 -1
  109. package/src/artifacts/coverage-jest/Settings/EditableRefdataList/index.js.html +1 -1
  110. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/EditableSettingsList.js.html +1 -1
  111. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/EditableSettingsListFieldArray/EditableSettingsListFieldArray.js.html +1 -1
  112. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/EditableSettingsListFieldArray/index.html +1 -1
  113. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/EditableSettingsListFieldArray/index.js.html +1 -1
  114. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/EditSettingValue/EditSettingValue.js.html +1 -1
  115. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/EditSettingValue/index.html +1 -1
  116. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/EditSettingValue/index.js.html +1 -1
  117. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/RenderSettingValue/RenderSettingValue.js.html +1 -1
  118. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/RenderSettingValue/index.html +1 -1
  119. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/RenderSettingValue/index.js.html +1 -1
  120. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/SettingField.js.html +1 -1
  121. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/index.html +1 -1
  122. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/SettingField/index.js.html +1 -1
  123. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/index.html +1 -1
  124. package/src/artifacts/coverage-jest/Settings/EditableSettingsList/index.js.html +1 -1
  125. package/src/artifacts/coverage-jest/Settings/RefdataCategoriesSettings/RefdataCategoriesSettings.js.html +1 -1
  126. package/src/artifacts/coverage-jest/Settings/RefdataCategoriesSettings/index.html +1 -1
  127. package/src/artifacts/coverage-jest/Settings/RefdataCategoriesSettings/index.js.html +1 -1
  128. package/src/artifacts/coverage-jest/Settings/SettingPage/SettingPage.js.html +1 -1
  129. package/src/artifacts/coverage-jest/Settings/SettingPage/SettingPagePane/SettingPagePane.js.html +1 -1
  130. package/src/artifacts/coverage-jest/Settings/SettingPage/SettingPagePane/index.html +1 -1
  131. package/src/artifacts/coverage-jest/Settings/SettingPage/SettingPagePane/index.js.html +1 -1
  132. package/src/artifacts/coverage-jest/Settings/SettingPage/index.html +1 -1
  133. package/src/artifacts/coverage-jest/Settings/SettingPage/index.js.html +1 -1
  134. package/src/artifacts/coverage-jest/Settings/SettingsFormContainer/SettingsFormContainer.js.html +1 -1
  135. package/src/artifacts/coverage-jest/Settings/SettingsFormContainer/index.html +1 -1
  136. package/src/artifacts/coverage-jest/Settings/SettingsFormContainer/index.js.html +1 -1
  137. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/StaticSettingsField.js.html +1 -1
  138. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/StaticSettingsFieldComponent/StaticSettingsFieldComponent.js.html +1 -1
  139. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/StaticSettingsFieldComponent/index.html +1 -1
  140. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/StaticSettingsFieldComponent/index.js.html +1 -1
  141. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/index.html +1 -1
  142. package/src/artifacts/coverage-jest/Settings/StaticSettingsField/index.js.html +1 -1
  143. package/src/artifacts/coverage-jest/Settings/constants/index.html +1 -1
  144. package/src/artifacts/coverage-jest/Settings/constants/index.js.html +1 -1
  145. package/src/artifacts/coverage-jest/Settings/constants/queryKeys.js.html +1 -1
  146. package/src/artifacts/coverage-jest/Settings/contexts/SettingsContext.js.html +1 -1
  147. package/src/artifacts/coverage-jest/Settings/contexts/index.html +1 -1
  148. package/src/artifacts/coverage-jest/Settings/contexts/index.js.html +1 -1
  149. package/src/artifacts/coverage-jest/Settings/hooks/index.html +1 -1
  150. package/src/artifacts/coverage-jest/Settings/hooks/index.js.html +1 -1
  151. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/index.html +1 -1
  152. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/index.js.html +1 -1
  153. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingCallout/index.html +1 -1
  154. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingCallout/index.js.html +1 -1
  155. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingCallout/useSettingCallout.js.html +1 -1
  156. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingsSectionInitalValues/index.html +1 -1
  157. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingsSectionInitalValues/index.js.html +1 -1
  158. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useSettingsSectionInitalValues/useSettingsSectionInitalValues.js.html +1 -1
  159. package/src/artifacts/coverage-jest/Settings/hooks/staticSettingsPages/useStaticSettingsSection.js.html +1 -1
  160. package/src/artifacts/coverage-jest/Settings/hooks/useAppSettings/index.html +1 -1
  161. package/src/artifacts/coverage-jest/Settings/hooks/useAppSettings/index.js.html +1 -1
  162. package/src/artifacts/coverage-jest/Settings/hooks/useAppSettings/useAppSettings.js.html +1 -1
  163. package/src/artifacts/coverage-jest/Settings/hooks/useSettingSection/index.html +1 -1
  164. package/src/artifacts/coverage-jest/Settings/hooks/useSettingSection/index.js.html +1 -1
  165. package/src/artifacts/coverage-jest/Settings/hooks/useSettingSection/useSettingSection.js.html +1 -1
  166. package/src/artifacts/coverage-jest/Settings/hooks/useSettings/index.html +1 -1
  167. package/src/artifacts/coverage-jest/Settings/hooks/useSettings/index.js.html +1 -1
  168. package/src/artifacts/coverage-jest/Settings/hooks/useSettings/useSettings.js.html +1 -1
  169. package/src/artifacts/coverage-jest/Settings/index.html +1 -1
  170. package/src/artifacts/coverage-jest/Settings/index.js.html +1 -1
  171. package/src/artifacts/coverage-jest/Tags/Tags.js.html +1 -1
  172. package/src/artifacts/coverage-jest/Tags/hooks/index.html +1 -1
  173. package/src/artifacts/coverage-jest/Tags/hooks/index.js.html +1 -1
  174. package/src/artifacts/coverage-jest/Tags/hooks/useTags.js.html +1 -1
  175. package/src/artifacts/coverage-jest/Tags/hooks/useTagsEnabled.js.html +1 -1
  176. package/src/artifacts/coverage-jest/Tags/index.html +1 -1
  177. package/src/artifacts/coverage-jest/Tags/index.js.html +1 -1
  178. package/src/artifacts/coverage-jest/Tags/tagsConfig.js.html +1 -1
  179. package/src/artifacts/coverage-jest/Typedown/Typedown.js.html +230 -62
  180. package/src/artifacts/coverage-jest/Typedown/index.html +15 -15
  181. package/src/artifacts/coverage-jest/Typedown/index.js.html +1 -1
  182. package/src/artifacts/coverage-jest/cobertura-coverage.xml +252 -103
  183. package/src/artifacts/coverage-jest/constants/comparators.js.html +1 -1
  184. package/src/artifacts/coverage-jest/constants/customProperties.js.html +1 -1
  185. package/src/artifacts/coverage-jest/constants/endpoints.js.html +1 -1
  186. package/src/artifacts/coverage-jest/constants/eventCodes.js.html +1 -1
  187. package/src/artifacts/coverage-jest/constants/index.html +1 -1
  188. package/src/artifacts/coverage-jest/constants/pagination.js.html +1 -1
  189. package/src/artifacts/coverage-jest/hooks/index.html +1 -1
  190. package/src/artifacts/coverage-jest/hooks/index.js.html +1 -1
  191. package/src/artifacts/coverage-jest/hooks/intlHooks/index.html +1 -1
  192. package/src/artifacts/coverage-jest/hooks/intlHooks/index.js.html +1 -1
  193. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKey/index.html +1 -1
  194. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKey/index.js.html +1 -1
  195. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKey/useIntlKey.js.html +1 -1
  196. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKeyStore/index.html +1 -1
  197. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKeyStore/index.js.html +1 -1
  198. package/src/artifacts/coverage-jest/hooks/intlHooks/useIntlKeyStore/useIntlKeyStore.js.html +1 -1
  199. package/src/artifacts/coverage-jest/hooks/intlHooks/useKintIntl/index.html +1 -1
  200. package/src/artifacts/coverage-jest/hooks/intlHooks/useKintIntl/index.js.html +1 -1
  201. package/src/artifacts/coverage-jest/hooks/intlHooks/useKintIntl/useKintIntl.js.html +1 -1
  202. package/src/artifacts/coverage-jest/hooks/typedownHooks/index.html +14 -14
  203. package/src/artifacts/coverage-jest/hooks/typedownHooks/index.js.html +1 -1
  204. package/src/artifacts/coverage-jest/hooks/typedownHooks/useTypedown.js.html +318 -105
  205. package/src/artifacts/coverage-jest/hooks/typedownHooks/useTypedownData.js.html +1 -1
  206. package/src/artifacts/coverage-jest/hooks/typedownHooks/useTypedownToggle.js.html +1 -1
  207. package/src/artifacts/coverage-jest/hooks/useActionListRef.js.html +1 -1
  208. package/src/artifacts/coverage-jest/hooks/useActiveElement.js.html +1 -1
  209. package/src/artifacts/coverage-jest/hooks/useCustomProperties.js.html +1 -1
  210. package/src/artifacts/coverage-jest/hooks/useHelperApp.js.html +1 -1
  211. package/src/artifacts/coverage-jest/hooks/useInvalidateRefdata/index.html +1 -1
  212. package/src/artifacts/coverage-jest/hooks/useInvalidateRefdata/index.js.html +1 -1
  213. package/src/artifacts/coverage-jest/hooks/useInvalidateRefdata/useInvalidateRefdata.js.html +1 -1
  214. package/src/artifacts/coverage-jest/hooks/useKiwtFieldArray.js.html +1 -1
  215. package/src/artifacts/coverage-jest/hooks/useKiwtSASQuery.js.html +1 -1
  216. package/src/artifacts/coverage-jest/hooks/useLocalPageStore.js.html +1 -1
  217. package/src/artifacts/coverage-jest/hooks/useLocalStorageState.js.html +1 -1
  218. package/src/artifacts/coverage-jest/hooks/useModConfigEntries.js.html +1 -1
  219. package/src/artifacts/coverage-jest/hooks/useMutateCustomProperties/index.html +1 -1
  220. package/src/artifacts/coverage-jest/hooks/useMutateCustomProperties/index.js.html +1 -1
  221. package/src/artifacts/coverage-jest/hooks/useMutateCustomProperties/useMutateCustomProperties.js.html +1 -1
  222. package/src/artifacts/coverage-jest/hooks/useMutateGeneric/index.html +1 -1
  223. package/src/artifacts/coverage-jest/hooks/useMutateGeneric/index.js.html +1 -1
  224. package/src/artifacts/coverage-jest/hooks/useMutateGeneric/useMutateGeneric.js.html +1 -1
  225. package/src/artifacts/coverage-jest/hooks/useMutateModConfigEntry.js.html +1 -1
  226. package/src/artifacts/coverage-jest/hooks/useMutateRefdataCategory/index.html +1 -1
  227. package/src/artifacts/coverage-jest/hooks/useMutateRefdataCategory/index.js.html +1 -1
  228. package/src/artifacts/coverage-jest/hooks/useMutateRefdataCategory/useMutateRefdataCategory.js.html +1 -1
  229. package/src/artifacts/coverage-jest/hooks/useMutateRefdataValue/index.html +1 -1
  230. package/src/artifacts/coverage-jest/hooks/useMutateRefdataValue/index.js.html +1 -1
  231. package/src/artifacts/coverage-jest/hooks/useMutateRefdataValue/useMutateRefdataValue.js.html +1 -1
  232. package/src/artifacts/coverage-jest/hooks/usePrevNextPagination.js.html +1 -1
  233. package/src/artifacts/coverage-jest/hooks/useQIndex.js.html +1 -1
  234. package/src/artifacts/coverage-jest/hooks/useRefdata.js.html +1 -1
  235. package/src/artifacts/coverage-jest/hooks/useSASQQueryMeta.js.html +1 -1
  236. package/src/artifacts/coverage-jest/hooks/useStandaloneSASQQueryParameter/index.html +1 -1
  237. package/src/artifacts/coverage-jest/hooks/useStandaloneSASQQueryParameter/index.js.html +1 -1
  238. package/src/artifacts/coverage-jest/hooks/useStandaloneSASQQueryParameter/useStandaloneSASQQueryParameter.js.html +1 -1
  239. package/src/artifacts/coverage-jest/hooks/useTemplates.js.html +1 -1
  240. package/src/artifacts/coverage-jest/index.html +40 -25
  241. package/src/artifacts/coverage-jest/utils/buildUrl.js.html +1 -1
  242. package/src/artifacts/coverage-jest/utils/filterParsers/deparseKiwtQueryFilters.js.html +1 -1
  243. package/src/artifacts/coverage-jest/utils/filterParsers/index.html +1 -1
  244. package/src/artifacts/coverage-jest/utils/filterParsers/index.js.html +1 -1
  245. package/src/artifacts/coverage-jest/utils/filterParsers/parseKiwtQueryFilters.js.html +1 -1
  246. package/src/artifacts/coverage-jest/utils/filterParsers/parseKiwtQueryGroups.js.html +1 -1
  247. package/src/artifacts/coverage-jest/utils/filterParsers/parseKiwtQueryString.js.html +1 -1
  248. package/src/artifacts/coverage-jest/utils/generateKiwtQuery.js.html +1 -1
  249. package/src/artifacts/coverage-jest/utils/generateKiwtQueryParams/generateKiwtQueryParams.js.html +1 -1
  250. package/src/artifacts/coverage-jest/utils/generateKiwtQueryParams/index.html +1 -1
  251. package/src/artifacts/coverage-jest/utils/generateKiwtQueryParams/index.js.html +1 -1
  252. package/src/artifacts/coverage-jest/utils/groupCustomPropertiesByCtx.js.html +1 -1
  253. package/src/artifacts/coverage-jest/utils/highlightString.js.html +1 -1
  254. package/src/artifacts/coverage-jest/utils/index.html +1 -1
  255. package/src/artifacts/coverage-jest/utils/index.js.html +1 -1
  256. package/src/artifacts/coverage-jest/utils/matchString.js.html +1 -1
  257. package/src/artifacts/coverage-jest/utils/modConfigEntriesQueryKey.js.html +1 -1
  258. package/src/artifacts/coverage-jest/utils/parseErrorResponse.js.html +1 -1
  259. package/src/artifacts/coverage-jest/utils/parseModConfigEntry.js.html +1 -1
  260. package/src/artifacts/coverage-jest/utils/refdataOptions.js.html +1 -1
  261. package/src/artifacts/coverage-jest/utils/refdataQueryKey/index.html +1 -1
  262. package/src/artifacts/coverage-jest/utils/refdataQueryKey/index.js.html +1 -1
  263. package/src/artifacts/coverage-jest/utils/refdataQueryKey/refdataQueryKey.js.html +1 -1
  264. package/src/artifacts/coverage-jest/utils/selectorSafe.js.html +1 -1
  265. package/src/artifacts/coverage-jest/utils/sortByLabel.js.html +1 -1
  266. package/src/artifacts/coverage-jest/utils/toCamelCase.js.html +1 -1
  267. package/src/artifacts/coverage-jest/utils/typedownQueryKey.js.html +1 -1
  268. package/src/artifacts/coverage-jest/validators/index.html +1 -1
  269. package/src/artifacts/coverage-jest/validators/index.js.html +1 -1
  270. package/src/artifacts/coverage-jest/validators/validators.js.html +1 -1
  271. package/src/index.js +4 -0
  272. package/src/lib/ButtonTypedown/ButtonTypedown.js +53 -0
  273. package/src/lib/ButtonTypedown/README.md +53 -0
  274. package/src/lib/ButtonTypedown/index.js +1 -0
  275. package/src/lib/Typedown/README.md +24 -21
  276. package/src/lib/Typedown/Typedown.js +106 -50
  277. package/src/lib/hooks/typedownHooks/useTypedown.js +165 -94
  278. package/styles/TypeDown.css +4 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## [5.31.1](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.31.0...v5.31.1) (2025-12-12)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **Typedown:** OverlayContainer catches previous focus when Typedown is first element in module ([a516fca](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/a516fca4d89c30b916f6ac09c27e9e995f9b5391))
7
+ * **Typedown:** Typedown focus issues have been sorted, ButtonTypedown remembers what was typed ([15f8e11](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/15f8e111fbbe3a125f95e61ba1d21727de293607))
8
+
9
+ # [5.31.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.30.0...v5.31.0) (2025-12-12)
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * **Typedown:** Prevent typedown from closing when scrollbar is clicked ([34d072a](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/34d072ab76570953343f6ab221eb7a87e0e0957b))
15
+
16
+
17
+ ### Features
18
+
19
+ * **ButtonTypedown:** Added new Typedown variant specifically designed to work more like a dropdown with the search inside the list ([7d2be52](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/7d2be52ab9015cfbd11920c7ba193d3f7a2fff9f))
20
+ * **Typedown:** Ability to renderHeader, improvements to focus handling ([d7cd617](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/d7cd617f5e66840d83deca046d3dc51979f6be69))
21
+ * **Typedown:** Typedown renderTrigger and getDisplayValue ([3c492ca](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/commit/3c492ca8de9cb3a0c2d48d99670a4e6b187bb3d0))
22
+
1
23
  # [5.30.0](https://gitlab.com/knowledge-integration/folio/stripes-kint-components/compare/v5.29.1...v5.30.0) (2025-12-10)
2
24
 
3
25
 
package/es/index.js CHANGED
@@ -7,6 +7,7 @@ var _exportNames = {
7
7
  ActionList: true,
8
8
  Typedown: true,
9
9
  QueryTypedown: true,
10
+ ButtonTypedown: true,
10
11
  SearchField: true,
11
12
  SearchKeyControl: true,
12
13
  SASQRoute: true,
@@ -53,6 +54,12 @@ Object.defineProperty(exports, "ActionList", {
53
54
  return _ActionList.default;
54
55
  }
55
56
  });
57
+ Object.defineProperty(exports, "ButtonTypedown", {
58
+ enumerable: true,
59
+ get: function () {
60
+ return _ButtonTypedown.default;
61
+ }
62
+ });
56
63
  Object.defineProperty(exports, "ComboButton", {
57
64
  enumerable: true,
58
65
  get: function () {
@@ -339,6 +346,7 @@ Object.keys(_Settings).forEach(function (key) {
339
346
  var _ActionList = _interopRequireDefault(require("./lib/ActionList"));
340
347
  var _Typedown = _interopRequireDefault(require("./lib/Typedown"));
341
348
  var _QueryTypedown = _interopRequireDefault(require("./lib/QueryTypedown"));
349
+ var _ButtonTypedown = _interopRequireDefault(require("./lib/ButtonTypedown"));
342
350
  var _SearchField = _interopRequireDefault(require("./lib/SearchField"));
343
351
  var _SearchKeyControl = _interopRequireDefault(require("./lib/SearchKeyControl"));
344
352
  var _SASQRoute = _interopRequireDefault(require("./lib/SASQRoute"));
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _propTypes = _interopRequireDefault(require("prop-types"));
8
+ var _components = require("@folio/stripes/components");
9
+ var _SearchField = _interopRequireDefault(require("../SearchField"));
10
+ var _Typedown = _interopRequireDefault(require("../Typedown"));
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ const ButtonTypedown = _ref => {
14
+ let {
15
+ id,
16
+ renderListItem,
17
+ ...typedownProps
18
+ } = _ref;
19
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typedown.default, {
20
+ getDisplayValue: () => false,
21
+ renderHeader: _ref2 => {
22
+ let {
23
+ handleType,
24
+ currentlyTyped
25
+ } = _ref2;
26
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchField.default, {
27
+ id: `button-typedown-searchfield-${id}`,
28
+ marginBottom0: true,
29
+ onChange: handleType,
30
+ value: currentlyTyped
31
+ });
32
+ },
33
+ renderListItem: renderListItem,
34
+ renderTrigger: _ref3 => {
35
+ let {
36
+ selectedValue,
37
+ triggerComponentRef,
38
+ triggerId,
39
+ typedownTriggerKeyDownHandler
40
+ } = _ref3;
41
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.DropdownButton, {
42
+ ref: triggerComponentRef,
43
+ buttonStyle: "dropdownItem",
44
+ fullWidth: true,
45
+ id: triggerId,
46
+ marginBottom0: true,
47
+ onKeyDown: typedownTriggerKeyDownHandler,
48
+ children: renderListItem(selectedValue)
49
+ });
50
+ },
51
+ ...typedownProps
52
+ });
53
+ };
54
+ var _default = exports.default = ButtonTypedown;
55
+ ButtonTypedown.propTypes = {
56
+ onType: _propTypes.default.func.isRequired,
57
+ renderListItem: _propTypes.default.func.isRequired
58
+ // REST OF TYPEDOWN PROPS
59
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _ButtonTypedown.default;
10
+ }
11
+ });
12
+ var _ButtonTypedown = _interopRequireDefault(require("./ButtonTypedown"));
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _classnames = _interopRequireDefault(require("classnames"));
10
10
  var _get = _interopRequireDefault(require("lodash/get"));
@@ -15,7 +15,6 @@ var _typedownHooks = require("../hooks/typedownHooks");
15
15
  var _selectorSafe = _interopRequireDefault(require("../utils/selectorSafe"));
16
16
  var _jsxRuntime = require("react/jsx-runtime");
17
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
19
18
  const Typedown = _ref => {
20
19
  let {
21
20
  className,
@@ -23,6 +22,8 @@ const Typedown = _ref => {
23
22
  displayClearItem = true,
24
23
  displayValueWhileOpen = true,
25
24
  endOfList,
25
+ getDisplayValue,
26
+ // Can overrule displayValue entirely
26
27
  id,
27
28
  initialOpenDelay = 800,
28
29
  // Initial opening delay of 800ms (handles any stripes animations)
@@ -34,13 +35,16 @@ const Typedown = _ref => {
34
35
  onChange,
35
36
  onType,
36
37
  renderFooter = null,
38
+ renderHeader = null,
37
39
  renderListItem = null,
40
+ renderTrigger = null,
38
41
  required,
39
42
  selectedStyles,
40
43
  // A way to pass any styles that need to be applied globally on selection
41
44
  uniqueIdentificationPath = 'id'
42
45
  } = _ref;
43
46
  const selectedUniqueId = (0, _get.default)(input.value, uniqueIdentificationPath);
47
+ const [selectedValue, setSelectedValue] = (0, _react.useState)(input.value); // Track what's been selected in state as well
44
48
 
45
49
  // Display data needs to be in line with data options but also able to react to default handleType
46
50
  const [displayData, setDisplayData] = (0, _react.useState)(dataOptions);
@@ -53,7 +57,7 @@ const Typedown = _ref => {
53
57
  }, [dataOptions]);
54
58
 
55
59
  // Setup default handleType
56
- const handleType = e => {
60
+ const handleType = (0, _react.useCallback)(e => {
57
61
  const regex = new RegExp(`${e.target.value.toLowerCase()}`);
58
62
  if (onType) {
59
63
  onType(e);
@@ -70,20 +74,20 @@ const Typedown = _ref => {
70
74
  } else {
71
75
  setExactMatch(false);
72
76
  }
73
- };
77
+ }, [dataOptions, displayData, filterPath, onType, uniqueIdentificationPath]);
74
78
 
75
79
  // Hook to set up all the essentials
76
80
  const {
77
81
  refs: {
78
82
  listRef,
79
83
  triggerRef,
84
+ triggerComponentRef,
80
85
  overlayRef,
81
- footerRef
86
+ footerRef,
87
+ headerRef
82
88
  },
83
89
  handlers: {
84
- handleNextFocus,
85
- listKeyDownHandler,
86
- searchFieldKeyDownHandler
90
+ handleNextFocus
87
91
  },
88
92
  variables: {
89
93
  open,
@@ -92,21 +96,50 @@ const Typedown = _ref => {
92
96
  searchWidth
93
97
  }
94
98
  } = (0, _typedownHooks.useTypedown)(input.name, {
99
+ dataOptions,
95
100
  timeout: initialOpenDelay
96
101
  });
97
102
  const renderItem = (0, _react.useCallback)(function (option) {
98
103
  let optionIsSelected = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
99
104
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
100
105
  className: _TypeDown.default.listItem,
101
- children: renderListItem ? renderListItem(option, currentlyTyped, exactMatch, optionIsSelected) : (0, _get.default)(option, uniqueIdentificationPath)
106
+ children: renderListItem ? renderListItem(option, currentlyTyped, exactMatch, optionIsSelected, selectedValue) : (0, _get.default)(option, uniqueIdentificationPath)
102
107
  });
103
- }, [currentlyTyped, exactMatch, renderListItem, uniqueIdentificationPath]);
108
+ }, [currentlyTyped, exactMatch, renderListItem, selectedValue, uniqueIdentificationPath]);
104
109
  const handleChange = (0, _react.useCallback)(value => {
105
110
  input.onChange(value);
111
+ setSelectedValue(value);
106
112
  if (typeof onChange === 'function') {
107
113
  onChange(value);
108
114
  }
109
115
  }, [input, onChange]);
116
+ const renderTypedownTrigger = () => {
117
+ const triggerComponentId = `typedown-trigger-${(0, _selectorSafe.default)(input.name)}`;
118
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
119
+ ref: triggerRef,
120
+ id: `typedown-parent-${(0, _selectorSafe.default)(input.name)}-trigger`,
121
+ children: renderTrigger ? renderTrigger({
122
+ // Pass all props in that searchfield uses.
123
+ handleType,
124
+ input,
125
+ // Pass input? Useful when not controlled I guess
126
+ meta,
127
+ selectedValue,
128
+ triggerComponentId,
129
+ triggerComponentRef
130
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchField.default, {
131
+ ref: triggerComponentRef
132
+ // Pass meta through so correct styling gets applied to the TextField
133
+ ,
134
+ id: triggerComponentId,
135
+ label: label,
136
+ marginBottom0: true,
137
+ meta: meta,
138
+ onChange: handleType,
139
+ required: required
140
+ })
141
+ });
142
+ };
110
143
  const dropDown = (0, _react.useCallback)(() => {
111
144
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
112
145
  className: _TypeDown.default.dropdownMenu,
@@ -114,27 +147,43 @@ const Typedown = _ref => {
114
147
  style: {
115
148
  '--searchWidth': `${searchWidth}px`
116
149
  },
117
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
150
+ children: [renderHeader && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
151
+ ref: headerRef,
152
+ className: _TypeDown.default.header,
153
+ id: `typedown-header-${(0, _selectorSafe.default)(input.name)}`,
154
+ children: renderHeader({
155
+ currentlyTyped,
156
+ displayData,
157
+ handleType,
158
+ exactMatch
159
+ })
160
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
118
161
  ref: listRef,
119
162
  className: _TypeDown.default.listContainer,
120
- id: "typedown-list",
163
+ id: "typedown-list"
164
+ /* This is an acceptable exception to the no-static-element-interactions
165
+ * as we are only PREVENTING interactions, namely focus change on scrollbar click
166
+ * Without this, the typedown closes instantly when the scrollbar is clicked or dragged.
167
+ * This does NOT prevent item click, as e.propagation is not prevented.
168
+ */,
169
+ onMouseDown: e => e.preventDefault(),
121
170
  children: displayData?.length ? displayData?.map((d, index) => {
122
171
  const isSelectedEval = isSelected ? isSelected(input.value, d) : (0, _get.default)(input.value, uniqueIdentificationPath) === (0, _get.default)(d, uniqueIdentificationPath);
123
172
  const selectedCSS = selectedStyles ?? _TypeDown.default.selectedMenuButton;
173
+ const uniqueButtonKey = `typedown-button-[${(0, _get.default)(d, uniqueIdentificationPath)}]`;
124
174
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
125
175
  className: (0, _classnames.default)(_TypeDown.default.fullWidth, _TypeDown.default.menuButton, {
126
176
  [`${selectedCSS}`]: isSelectedEval
127
177
  }),
128
178
  "data-selected": isSelectedEval,
129
- id: `typedown-button-[${index}]`,
179
+ id: uniqueButtonKey,
130
180
  onClick: () => {
131
181
  handleChange(d);
132
182
  handleNextFocus();
133
183
  },
134
- onKeyDown: listKeyDownHandler,
135
184
  type: "button",
136
185
  children: renderItem(d, isSelectedEval)
137
- }, `typedown-button-[${index}]`);
186
+ }, uniqueButtonKey);
138
187
  }) : endOfList || /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.EndOfList, {})
139
188
  }), renderFooter && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
140
189
  ref: footerRef,
@@ -143,32 +192,33 @@ const Typedown = _ref => {
143
192
  children: renderFooter(displayData, currentlyTyped, exactMatch)
144
193
  })]
145
194
  });
146
- }, [currentlyTyped, displayData, endOfList, exactMatch, footerRef, handleChange, handleNextFocus, input.name, input.value, isSelected, listKeyDownHandler, listRef, renderFooter, renderItem, searchWidth, selectedStyles, uniqueIdentificationPath]);
147
- const renderSearchField = () => {
148
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
149
- ref: triggerRef,
150
- id: `typedown-parent-${(0, _selectorSafe.default)(input.name)}-searchField`,
151
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchField.default
152
- // Pass meta through so correct styling gets applied to the TextField
153
- , {
154
- id: `typedown-searchField-${(0, _selectorSafe.default)(input.name)}`,
155
- label: label,
156
- marginBottom0: true,
157
- meta: meta,
158
- onChange: handleType,
159
- onKeyDown: searchFieldKeyDownHandler,
160
- required: required
161
- })
162
- });
163
- };
195
+ }, [currentlyTyped, displayData, endOfList, exactMatch, footerRef, handleChange, handleNextFocus, handleType, headerRef, input.name, input.value, isSelected, listRef, renderFooter, renderHeader, renderItem, searchWidth, selectedStyles, uniqueIdentificationPath]);
196
+ const renderSelectedItem = (0, _react.useCallback)(() => /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
197
+ className: (0, _classnames.default)(_TypeDown.default.selectedDisplay),
198
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
199
+ className: _TypeDown.default.selectedItem,
200
+ children: renderItem(input.value)
201
+ }), displayClearItem && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.IconButton, {
202
+ className: _TypeDown.default.clearItem,
203
+ icon: "times-circle-solid",
204
+ onClick: () => handleChange()
205
+ })]
206
+ }), [displayClearItem, handleChange, input.value, renderItem]);
164
207
  const displayValue = (0, _react.useMemo)(() => {
208
+ // Allow full control over whether to display the value
209
+ if (getDisplayValue) {
210
+ return getDisplayValue({
211
+ selectedUniqueId,
212
+ open
213
+ });
214
+ }
165
215
  return !!selectedUniqueId && (!open || displayValueWhileOpen);
166
- }, [displayValueWhileOpen, open, selectedUniqueId]);
216
+ }, [displayValueWhileOpen, getDisplayValue, open, selectedUniqueId]);
167
217
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
168
218
  ref: resizeRef,
169
219
  className: (0, _classnames.default)(_TypeDown.default.typedown, className),
170
220
  id: `typedown-id-${id}`,
171
- children: [renderSearchField(), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Popper, {
221
+ children: [renderTypedownTrigger(), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Popper, {
172
222
  anchorRef: triggerRef,
173
223
  className: (0, _classnames.default)(_TypeDown.default.dropdown, _TypeDown.default.fullWidth),
174
224
  isOpen: open,
@@ -192,17 +242,7 @@ const Typedown = _ref => {
192
242
  overlayRef: overlayRef,
193
243
  portal: portal,
194
244
  children: dropDown()
195
- }, "typedown-menu-toggle"), displayValue && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
196
- className: (0, _classnames.default)(_TypeDown.default.selectedDisplay),
197
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
198
- className: _TypeDown.default.selectedItem,
199
- children: renderItem(input.value)
200
- }), displayClearItem && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.IconButton, {
201
- className: _TypeDown.default.clearItem,
202
- icon: "times-circle-solid",
203
- onClick: () => handleChange()
204
- })]
205
- })]
245
+ }, "typedown-menu-toggle"), displayValue && renderSelectedItem()]
206
246
  });
207
247
  };
208
248
  Typedown.propTypes = {
@@ -212,6 +252,7 @@ Typedown.propTypes = {
212
252
  displayValueWhileOpen: _propTypes.default.bool,
213
253
  endOfList: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node, _propTypes.default.element]),
214
254
  filterPath: _propTypes.default.string,
255
+ getDisplayValue: _propTypes.default.func,
215
256
  id: _propTypes.default.string,
216
257
  initialOpenDelay: _propTypes.default.number,
217
258
  input: _propTypes.default.object,
@@ -220,8 +261,10 @@ Typedown.propTypes = {
220
261
  meta: _propTypes.default.object,
221
262
  onChange: _propTypes.default.func,
222
263
  onType: _propTypes.default.func,
264
+ renderHeader: _propTypes.default.func,
223
265
  renderFooter: _propTypes.default.func,
224
266
  renderListItem: _propTypes.default.func,
267
+ renderTrigger: _propTypes.default.func,
225
268
  required: _propTypes.default.bool,
226
269
  selectedStyles: _propTypes.default.string,
227
270
  uniqueIdentificationPath: _propTypes.default.string
@@ -8,97 +8,163 @@ var _react = require("react");
8
8
  var _reactResizeDetector = require("react-resize-detector");
9
9
  var _components = require("@folio/stripes/components");
10
10
  var _eventCodes = require("../../constants/eventCodes");
11
- var _selectorSafe = _interopRequireDefault(require("../../utils/selectorSafe"));
12
11
  var _useTypedownToggle = _interopRequireDefault(require("./useTypedownToggle"));
13
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
13
  const useTypedown = function (name) {
15
14
  let {
15
+ dataOptions,
16
16
  timeout = 800
17
17
  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18
- // SEARCHFIELD COMPONENT
19
- const searchFieldComponent = document.getElementById(`typedown-searchField-${(0, _selectorSafe.default)(name)}`);
18
+ // SET UP STATE HOLDING DOM ELEMENTS
19
+ const [list, setList] = (0, _react.useState)();
20
+ const [trigger, setTrigger] = (0, _react.useState)();
21
+ const [footer, setFooter] = (0, _react.useState)();
22
+ const [header, setHeader] = (0, _react.useState)();
20
23
 
21
24
  // SET UP REFS
22
- const listRef = (0, _react.useRef)();
23
25
  const triggerRef = (0, _react.useRef)();
24
26
  const overlayRef = (0, _react.useRef)();
25
- const footerRef = (0, _react.useRef)();
26
- const footer = document.getElementById(`typedown-footer-${(0, _selectorSafe.default)(name)}`);
27
- // Add an event listener to the footer, so that we can control tab behaviour between footer elements
27
+ const listRef = (0, _react.useCallback)(node => setList(node), []);
28
+ const triggerComponentRef = (0, _react.useCallback)(node => setTrigger(node), []);
29
+ const footerRef = (0, _react.useCallback)(node => setFooter(node), []);
30
+ const headerRef = (0, _react.useCallback)(node => setHeader(node), []);
28
31
 
29
- if (footer && footer.getAttribute('hasListener') !== 'true') {
30
- footer.addEventListener('keydown', e => {
31
- // We want special behaviour on tab
32
- if (e.code === _eventCodes.TAB) {
33
- // Prevent the default behaviour
34
- e.preventDefault();
35
- const focusFunc = e.shiftKey ? _components.getPreviousFocusable : _components.getNextFocusable;
36
- const elem = focusFunc(footerRef.current, true, true, false, true);
37
- if (elem) {
38
- // Focus on next focusable element
39
- elem.focus();
40
- } else if (e.shiftKey) {
41
- // We are at the beginning of the list, refocus on search bar
42
- searchFieldComponent.focus();
43
- } else {
44
- // We are at the end of the list, move onto next focusable element in page
45
- (0, _components.getNextFocusable)(searchFieldComponent, false).focus();
46
- }
47
- }
48
- });
49
- footer.setAttribute('hasListener', 'true');
50
- }
51
-
52
- // SET UP HANDLERS
53
- const searchFieldKeyDownHandler = e => {
54
- if (e.code === _eventCodes.UP_ARROW) {
55
- const elem = (0, _components.getLastFocusable)(listRef.current, true, true);
56
- if (elem) {
57
- elem.focus();
58
- }
59
- }
60
- if (e.code === _eventCodes.DOWN_ARROW) {
61
- const elem = (0, _components.getFirstFocusable)(listRef.current, true, true);
62
- if (elem) {
63
- elem.focus();
64
- }
32
+ // OVERLAY PORTAL
33
+ const portal = document.getElementById('OverlayContainer');
34
+ const getPreviousToTrigger = (0, _react.useCallback)(() => {
35
+ const prevElem = (0, _components.getPreviousFocusable)(trigger, false, false, false);
36
+ if (prevElem.closest('[id^=OverlayContainer]') !== null) {
37
+ // If we find ourselves inside the OverlayContainer when heading backwards from the trigger
38
+ // then we must be the first focusable element on the page.
39
+ // From here we need to skip over the overlay container and head backwards
40
+ return (0, _components.getPreviousFocusable)(portal, false, false, false);
65
41
  }
42
+ return prevElem;
43
+ }, [portal, trigger]);
44
+ (0, _react.useEffect)(() => {
45
+ const cleanups = [];
66
46
 
67
- // Tab key (But not while shifting)
68
- if (e.code === _eventCodes.TAB && !e.shiftKey) {
69
- e.preventDefault();
70
- // If we have focusable elements in the footer, then focus on them, else unfocus searchbar
71
- const elem = (0, _components.getNextFocusable)(footerRef.current, true, true, true, true);
72
- if (elem) {
73
- elem.focus();
74
- } else {
75
- (0, _components.getNextFocusable)(searchFieldComponent, false).focus();
76
- }
77
- }
78
- };
79
- const listKeyDownHandler = e => {
80
- if (e.code === _eventCodes.DOWN_ARROW) {
81
- const elem = (0, _components.getNextFocusable)(listRef.current, true, true);
82
- elem.focus();
83
- }
84
- if (e.code === _eventCodes.UP_ARROW) {
85
- const elem = (0, _components.getPreviousFocusable)(listRef.current, true, true);
86
- elem.focus();
87
- }
88
- if (e.code === _eventCodes.TAB) {
89
- e.preventDefault();
90
- let elem;
91
- if (!e.shiftKey && !footerRef.current) {
92
- elem = (0, _components.getNextFocusable)(searchFieldComponent, false);
93
- } else if (!e.shiftKey) {
94
- elem = (0, _components.getNextFocusable)(footerRef.current, true, true, true, true);
95
- } else {
96
- elem = searchFieldComponent;
97
- }
98
- elem.focus();
99
- }
100
- };
101
- const handleNextFocus = () => (0, _components.getNextFocusable)(searchFieldComponent, false).focus();
47
+ // There appears to be some BIZARRE off-by-one issue with selectors here, that can be fixed by introducing a 1ms delay...
48
+ // I hate it but it is effective
49
+ setTimeout(() => {
50
+ // Split these out to shut up the linter
51
+ const rawFirstItemInList = list ? (0, _components.getFirstFocusable)(list) : null;
52
+ const rawLastItemInList = list ? (0, _components.getLastFocusable)(list) : null;
53
+
54
+ // If there are no dataOptions, this can get a bit stuck, so deliberately set to null when no dataOptions are present
55
+ const firstItemInList = dataOptions.length > 0 ? rawFirstItemInList : null;
56
+ const lastItemInList = dataOptions.length > 0 ? rawLastItemInList : null;
57
+ const configs = [
58
+ // --- HEADER CONFIG ---
59
+ {
60
+ element: header,
61
+ allowTabThroughContents: true,
62
+ previousElement: trigger,
63
+ nextElement: (footer ? (0, _components.getFirstFocusable)(footer) : null) ?? (0, _components.getNextFocusable)(trigger, false),
64
+ downElement: firstItemInList,
65
+ upElement: lastItemInList
66
+ },
67
+ // --- FOOTER CONFIG ---
68
+ {
69
+ element: footer,
70
+ allowTabThroughContents: true,
71
+ previousElement: (header ? (0, _components.getLastFocusable)(header) : null) ?? trigger,
72
+ nextElement: (0, _components.getNextFocusable)(trigger, false),
73
+ downElement: firstItemInList,
74
+ upElement: lastItemInList
75
+ },
76
+ // --- LIST/CONTAINER CONFIG ---
77
+ {
78
+ element: list,
79
+ allowUpDownThroughContents: true,
80
+ previousElement: (header ? (0, _components.getLastFocusable)(header) : null) ?? trigger,
81
+ nextElement: (footer ? (0, _components.getFirstFocusable)(footer) : null) ?? (0, _components.getNextFocusable)(trigger, false)
82
+ },
83
+ // --- TRIGGER CONFIG ---
84
+ {
85
+ element: trigger,
86
+ nextElement: (header ? (0, _components.getFirstFocusable)(header) : null) ?? (footer ? (0, _components.getFirstFocusable)(footer) : null) ?? (0, _components.getNextFocusable)(trigger, false),
87
+ previousElement: getPreviousToTrigger(),
88
+ downElement: firstItemInList,
89
+ upElement: lastItemInList
90
+ }].filter(c => c.element); // Filter out configs where the element (e.g., header) is null
91
+
92
+ const setupListener = config => {
93
+ const {
94
+ element,
95
+ allowTabThroughContents,
96
+ previousElement,
97
+ nextElement,
98
+ allowUpDownThroughContents,
99
+ downElement,
100
+ upElement
101
+ } = config;
102
+ const handleTab = e => {
103
+ const IS_SHIFT = e.shiftKey;
104
+ const tabIgnoreContents = () => {
105
+ if (IS_SHIFT) {
106
+ return previousElement?.focus();
107
+ }
108
+ return nextElement?.focus();
109
+ };
110
+ if (!allowTabThroughContents) {
111
+ return tabIgnoreContents();
112
+ }
113
+ const focusFunc = IS_SHIFT ? _components.getPreviousFocusable : _components.getNextFocusable;
114
+ const elem = focusFunc(element, true, true, false, true);
115
+ if (elem) {
116
+ return elem.focus();
117
+ }
118
+ return tabIgnoreContents();
119
+ };
120
+ const handleUpDown = e => {
121
+ // Prevent the default behaviour
122
+ const IS_UP = e.code === _eventCodes.UP_ARROW;
123
+ const upDownIgnoreContents = () => {
124
+ if (IS_UP) {
125
+ return upElement?.focus();
126
+ }
127
+ return downElement?.focus();
128
+ };
129
+ if (!allowUpDownThroughContents) {
130
+ return upDownIgnoreContents();
131
+ }
132
+ const focusFunc = IS_UP ? _components.getPreviousFocusable : _components.getNextFocusable;
133
+ const elem = focusFunc(element, true, true, true, true); // Allow looping through elements
134
+ if (elem) {
135
+ return elem.focus();
136
+ }
137
+ return upDownIgnoreContents();
138
+ };
139
+ const handler = e => {
140
+ if (!element.contains(document.activeElement)) {
141
+ return;
142
+ }
143
+ if (e.code === _eventCodes.TAB) {
144
+ e.preventDefault();
145
+ handleTab(e);
146
+ } else if (e.code === _eventCodes.DOWN_ARROW || e.code === _eventCodes.UP_ARROW) {
147
+ e.preventDefault();
148
+ handleUpDown(e);
149
+ }
150
+ };
151
+
152
+ // Add event listener and add the removal of said event listener to the cleanup function
153
+ element.addEventListener('keydown', handler);
154
+ cleanups.push(() => element.removeEventListener('keydown', handler));
155
+ };
156
+
157
+ // Set up the event listener for each config entry
158
+ configs.forEach(setupListener);
159
+ }, 0);
160
+
161
+ // Cleanup any event listeners
162
+ return () => {
163
+ cleanups.forEach(cleanup => cleanup());
164
+ };
165
+ // Re-add the listener ANY time any of the elements changes (this is why we're using callback refs)
166
+ }, [dataOptions, header, trigger, footer, list, getPreviousToTrigger]);
167
+ const handleNextFocus = () => (0, _components.getNextFocusable)(trigger, false).focus();
102
168
 
103
169
  // SET UP VARIABLES
104
170
  const {
@@ -120,20 +186,17 @@ const useTypedown = function (name) {
120
186
  width: searchWidth,
121
187
  ref: resizeRef
122
188
  } = (0, _reactResizeDetector.useResizeDetector)();
123
-
124
- // OVERLAY PORTAL
125
- const portal = document.getElementById('OverlayContainer');
126
189
  return {
127
190
  refs: {
128
191
  listRef,
129
192
  triggerRef,
193
+ triggerComponentRef,
130
194
  overlayRef,
131
- footerRef
195
+ footerRef,
196
+ headerRef
132
197
  },
133
198
  handlers: {
134
- handleNextFocus,
135
- listKeyDownHandler,
136
- searchFieldKeyDownHandler
199
+ handleNextFocus
137
200
  },
138
201
  variables: {
139
202
  open: useOpen ? open : false,