@transferwise/components 0.0.0-experimental-e9f4151 → 0.0.0-experimental-ffa47f4

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 (339) hide show
  1. package/build/accordion/AccordionItem/AccordionItem.js +19 -3
  2. package/build/accordion/AccordionItem/AccordionItem.js.map +1 -1
  3. package/build/accordion/AccordionItem/AccordionItem.mjs +19 -3
  4. package/build/accordion/AccordionItem/AccordionItem.mjs.map +1 -1
  5. package/build/actionButton/ActionButton.js +19 -1
  6. package/build/actionButton/ActionButton.js.map +1 -1
  7. package/build/actionButton/ActionButton.mjs +19 -1
  8. package/build/actionButton/ActionButton.mjs.map +1 -1
  9. package/build/actionOption/ActionOption.js +19 -1
  10. package/build/actionOption/ActionOption.js.map +1 -1
  11. package/build/actionOption/ActionOption.mjs +19 -1
  12. package/build/actionOption/ActionOption.mjs.map +1 -1
  13. package/build/alert/Alert.js +19 -3
  14. package/build/alert/Alert.js.map +1 -1
  15. package/build/alert/Alert.mjs +19 -3
  16. package/build/alert/Alert.mjs.map +1 -1
  17. package/build/alert/inlineMarkdown/InlineMarkdown.js +19 -1
  18. package/build/alert/inlineMarkdown/InlineMarkdown.js.map +1 -1
  19. package/build/alert/inlineMarkdown/InlineMarkdown.mjs +19 -1
  20. package/build/alert/inlineMarkdown/InlineMarkdown.mjs.map +1 -1
  21. package/build/avatar/Avatar.js +19 -1
  22. package/build/avatar/Avatar.js.map +1 -1
  23. package/build/avatar/Avatar.mjs +19 -1
  24. package/build/avatar/Avatar.mjs.map +1 -1
  25. package/build/avatarWrapper/AvatarWrapper.js +19 -2
  26. package/build/avatarWrapper/AvatarWrapper.js.map +1 -1
  27. package/build/avatarWrapper/AvatarWrapper.mjs +19 -2
  28. package/build/avatarWrapper/AvatarWrapper.mjs.map +1 -1
  29. package/build/badge/Badge.js +19 -2
  30. package/build/badge/Badge.js.map +1 -1
  31. package/build/badge/Badge.mjs +19 -2
  32. package/build/badge/Badge.mjs.map +1 -1
  33. package/build/button/Button.js +19 -2
  34. package/build/button/Button.js.map +1 -1
  35. package/build/button/Button.mjs +19 -2
  36. package/build/button/Button.mjs.map +1 -1
  37. package/build/button/classMap.js +18 -0
  38. package/build/button/classMap.js.map +1 -1
  39. package/build/button/classMap.mjs +18 -0
  40. package/build/button/classMap.mjs.map +1 -1
  41. package/build/button/legacyUtils/legacyUtils.js +18 -2
  42. package/build/button/legacyUtils/legacyUtils.js.map +1 -1
  43. package/build/button/legacyUtils/legacyUtils.mjs +18 -2
  44. package/build/button/legacyUtils/legacyUtils.mjs.map +1 -1
  45. package/build/card/Card.js +19 -2
  46. package/build/card/Card.js.map +1 -1
  47. package/build/card/Card.mjs +19 -2
  48. package/build/card/Card.mjs.map +1 -1
  49. package/build/checkbox/Checkbox.js +19 -1
  50. package/build/checkbox/Checkbox.js.map +1 -1
  51. package/build/checkbox/Checkbox.mjs +19 -1
  52. package/build/checkbox/Checkbox.mjs.map +1 -1
  53. package/build/chevron/Chevron.js +18 -1
  54. package/build/chevron/Chevron.js.map +1 -1
  55. package/build/chevron/Chevron.mjs +18 -1
  56. package/build/chevron/Chevron.mjs.map +1 -1
  57. package/build/chips/Chip.js +19 -1
  58. package/build/chips/Chip.js.map +1 -1
  59. package/build/chips/Chip.mjs +19 -1
  60. package/build/chips/Chip.mjs.map +1 -1
  61. package/build/circularButton/CircularButton.js +19 -2
  62. package/build/circularButton/CircularButton.js.map +1 -1
  63. package/build/circularButton/CircularButton.mjs +19 -2
  64. package/build/circularButton/CircularButton.mjs.map +1 -1
  65. package/build/common/bottomSheet/BottomSheet.js +3 -2
  66. package/build/common/bottomSheet/BottomSheet.js.map +1 -1
  67. package/build/common/bottomSheet/BottomSheet.mjs +3 -2
  68. package/build/common/bottomSheet/BottomSheet.mjs.map +1 -1
  69. package/build/common/hooks/useHasIntersected/useHasIntersected.js +7 -9
  70. package/build/common/hooks/useHasIntersected/useHasIntersected.js.map +1 -1
  71. package/build/common/hooks/useHasIntersected/useHasIntersected.mjs +7 -9
  72. package/build/common/hooks/useHasIntersected/useHasIntersected.mjs.map +1 -1
  73. package/build/common/locale/index.js +18 -0
  74. package/build/common/locale/index.js.map +1 -1
  75. package/build/common/locale/index.mjs +18 -0
  76. package/build/common/locale/index.mjs.map +1 -1
  77. package/build/common/panel/Panel.js +19 -1
  78. package/build/common/panel/Panel.js.map +1 -1
  79. package/build/common/panel/Panel.mjs +19 -1
  80. package/build/common/panel/Panel.mjs.map +1 -1
  81. package/build/common/responsivePanel/ResponsivePanel.js +22 -2
  82. package/build/common/responsivePanel/ResponsivePanel.js.map +1 -1
  83. package/build/common/responsivePanel/ResponsivePanel.mjs +22 -2
  84. package/build/common/responsivePanel/ResponsivePanel.mjs.map +1 -1
  85. package/build/criticalBanner/CriticalCommsBanner.js +19 -3
  86. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  87. package/build/criticalBanner/CriticalCommsBanner.mjs +19 -3
  88. package/build/criticalBanner/CriticalCommsBanner.mjs.map +1 -1
  89. package/build/dateInput/DateInput.js +19 -4
  90. package/build/dateInput/DateInput.js.map +1 -1
  91. package/build/dateInput/DateInput.mjs +19 -4
  92. package/build/dateInput/DateInput.mjs.map +1 -1
  93. package/build/dateLookup/DateLookup.js +20 -5
  94. package/build/dateLookup/DateLookup.js.map +1 -1
  95. package/build/dateLookup/DateLookup.mjs +20 -5
  96. package/build/dateLookup/DateLookup.mjs.map +1 -1
  97. package/build/dateLookup/dateHeader/DateHeader.js +23 -4
  98. package/build/dateLookup/dateHeader/DateHeader.js.map +1 -1
  99. package/build/dateLookup/dateHeader/DateHeader.mjs +23 -4
  100. package/build/dateLookup/dateHeader/DateHeader.mjs.map +1 -1
  101. package/build/dateLookup/dateTrigger/DateTrigger.js +19 -3
  102. package/build/dateLookup/dateTrigger/DateTrigger.js.map +1 -1
  103. package/build/dateLookup/dateTrigger/DateTrigger.mjs +19 -3
  104. package/build/dateLookup/dateTrigger/DateTrigger.mjs.map +1 -1
  105. package/build/decision/Decision.js +19 -2
  106. package/build/decision/Decision.js.map +1 -1
  107. package/build/decision/Decision.mjs +19 -2
  108. package/build/decision/Decision.mjs.map +1 -1
  109. package/build/definitionList/DefinitionList.js +19 -1
  110. package/build/definitionList/DefinitionList.js.map +1 -1
  111. package/build/definitionList/DefinitionList.mjs +19 -1
  112. package/build/definitionList/DefinitionList.mjs.map +1 -1
  113. package/build/dimmer/Dimmer.js +20 -1
  114. package/build/dimmer/Dimmer.js.map +1 -1
  115. package/build/dimmer/Dimmer.mjs +20 -1
  116. package/build/dimmer/Dimmer.mjs.map +1 -1
  117. package/build/display/Display.js +19 -1
  118. package/build/display/Display.js.map +1 -1
  119. package/build/display/Display.mjs +19 -1
  120. package/build/display/Display.mjs.map +1 -1
  121. package/build/drawer/Drawer.js +22 -3
  122. package/build/drawer/Drawer.js.map +1 -1
  123. package/build/drawer/Drawer.mjs +22 -3
  124. package/build/drawer/Drawer.mjs.map +1 -1
  125. package/build/field/Field.js +19 -1
  126. package/build/field/Field.js.map +1 -1
  127. package/build/field/Field.mjs +19 -1
  128. package/build/field/Field.mjs.map +1 -1
  129. package/build/flowNavigation/FlowNavigation.js +19 -2
  130. package/build/flowNavigation/FlowNavigation.js.map +1 -1
  131. package/build/flowNavigation/FlowNavigation.mjs +19 -2
  132. package/build/flowNavigation/FlowNavigation.mjs.map +1 -1
  133. package/build/header/Header.js +19 -1
  134. package/build/header/Header.js.map +1 -1
  135. package/build/header/Header.mjs +19 -1
  136. package/build/header/Header.mjs.map +1 -1
  137. package/build/image/Image.js +4 -1
  138. package/build/image/Image.js.map +1 -1
  139. package/build/image/Image.mjs +4 -1
  140. package/build/image/Image.mjs.map +1 -1
  141. package/build/index.js +64 -62
  142. package/build/index.js.map +1 -1
  143. package/build/index.mjs +22 -20
  144. package/build/index.mjs.map +1 -1
  145. package/build/info/Info.js +19 -2
  146. package/build/info/Info.js.map +1 -1
  147. package/build/info/Info.mjs +19 -2
  148. package/build/info/Info.mjs.map +1 -1
  149. package/build/inlineAlert/InlineAlert.js +19 -2
  150. package/build/inlineAlert/InlineAlert.js.map +1 -1
  151. package/build/inlineAlert/InlineAlert.mjs +19 -2
  152. package/build/inlineAlert/InlineAlert.mjs.map +1 -1
  153. package/build/inputs/SearchInput.js +19 -1
  154. package/build/inputs/SearchInput.js.map +1 -1
  155. package/build/inputs/SearchInput.mjs +19 -1
  156. package/build/inputs/SearchInput.mjs.map +1 -1
  157. package/build/instructionsList/InstructionsList.js +19 -1
  158. package/build/instructionsList/InstructionsList.js.map +1 -1
  159. package/build/instructionsList/InstructionsList.mjs +19 -1
  160. package/build/instructionsList/InstructionsList.mjs.map +1 -1
  161. package/build/loader/Loader.js +19 -1
  162. package/build/loader/Loader.js.map +1 -1
  163. package/build/loader/Loader.mjs +19 -1
  164. package/build/loader/Loader.mjs.map +1 -1
  165. package/build/markdown/Markdown.js +19 -1
  166. package/build/markdown/Markdown.js.map +1 -1
  167. package/build/markdown/Markdown.mjs +19 -1
  168. package/build/markdown/Markdown.mjs.map +1 -1
  169. package/build/modal/Modal.js +22 -5
  170. package/build/modal/Modal.js.map +1 -1
  171. package/build/modal/Modal.mjs +22 -5
  172. package/build/modal/Modal.mjs.map +1 -1
  173. package/build/moneyInput/MoneyInput.js +19 -2
  174. package/build/moneyInput/MoneyInput.js.map +1 -1
  175. package/build/moneyInput/MoneyInput.mjs +19 -2
  176. package/build/moneyInput/MoneyInput.mjs.map +1 -1
  177. package/build/navigationOption/NavigationOption.js +19 -1
  178. package/build/navigationOption/NavigationOption.js.map +1 -1
  179. package/build/navigationOption/NavigationOption.mjs +19 -1
  180. package/build/navigationOption/NavigationOption.mjs.map +1 -1
  181. package/build/nudge/Nudge.js +19 -1
  182. package/build/nudge/Nudge.js.map +1 -1
  183. package/build/nudge/Nudge.mjs +19 -1
  184. package/build/nudge/Nudge.mjs.map +1 -1
  185. package/build/overlayHeader/OverlayHeader.js +19 -1
  186. package/build/overlayHeader/OverlayHeader.js.map +1 -1
  187. package/build/overlayHeader/OverlayHeader.mjs +19 -1
  188. package/build/overlayHeader/OverlayHeader.mjs.map +1 -1
  189. package/build/phoneNumberInput/PhoneNumberInput.js +19 -1
  190. package/build/phoneNumberInput/PhoneNumberInput.js.map +1 -1
  191. package/build/phoneNumberInput/PhoneNumberInput.mjs +19 -1
  192. package/build/phoneNumberInput/PhoneNumberInput.mjs.map +1 -1
  193. package/build/popover/Popover.js +20 -3
  194. package/build/popover/Popover.js.map +1 -1
  195. package/build/popover/Popover.mjs +20 -3
  196. package/build/popover/Popover.mjs.map +1 -1
  197. package/build/processIndicator/ProcessIndicator.js +19 -1
  198. package/build/processIndicator/ProcessIndicator.js.map +1 -1
  199. package/build/processIndicator/ProcessIndicator.mjs +19 -1
  200. package/build/processIndicator/ProcessIndicator.mjs.map +1 -1
  201. package/build/progressBar/ProgressBar.js +19 -1
  202. package/build/progressBar/ProgressBar.js.map +1 -1
  203. package/build/progressBar/ProgressBar.mjs +19 -1
  204. package/build/progressBar/ProgressBar.mjs.map +1 -1
  205. package/build/promoCard/PromoCard.js +19 -1
  206. package/build/promoCard/PromoCard.js.map +1 -1
  207. package/build/promoCard/PromoCard.mjs +19 -1
  208. package/build/promoCard/PromoCard.mjs.map +1 -1
  209. package/build/promoCard/PromoCardIndicator.js +19 -1
  210. package/build/promoCard/PromoCardIndicator.js.map +1 -1
  211. package/build/promoCard/PromoCardIndicator.mjs +19 -1
  212. package/build/promoCard/PromoCardIndicator.mjs.map +1 -1
  213. package/build/provider/Provider.js +20 -1
  214. package/build/provider/Provider.js.map +1 -1
  215. package/build/provider/Provider.mjs +20 -1
  216. package/build/provider/Provider.mjs.map +1 -1
  217. package/build/radio/Radio.js +19 -1
  218. package/build/radio/Radio.js.map +1 -1
  219. package/build/radio/Radio.mjs +19 -1
  220. package/build/radio/Radio.mjs.map +1 -1
  221. package/build/segmentedControl/SegmentedControl.js +19 -1
  222. package/build/segmentedControl/SegmentedControl.js.map +1 -1
  223. package/build/segmentedControl/SegmentedControl.mjs +19 -1
  224. package/build/segmentedControl/SegmentedControl.mjs.map +1 -1
  225. package/build/select/Select.js +23 -3
  226. package/build/select/Select.js.map +1 -1
  227. package/build/select/Select.mjs +23 -3
  228. package/build/select/Select.mjs.map +1 -1
  229. package/build/select/option/Option.js +19 -1
  230. package/build/select/option/Option.js.map +1 -1
  231. package/build/select/option/Option.mjs +19 -1
  232. package/build/select/option/Option.mjs.map +1 -1
  233. package/build/selectOption/SelectOption.js +20 -3
  234. package/build/selectOption/SelectOption.js.map +1 -1
  235. package/build/selectOption/SelectOption.mjs +20 -3
  236. package/build/selectOption/SelectOption.mjs.map +1 -1
  237. package/build/snackbar/Snackbar.js +2 -2
  238. package/build/snackbar/Snackbar.js.map +1 -1
  239. package/build/snackbar/Snackbar.mjs +2 -2
  240. package/build/snackbar/Snackbar.mjs.map +1 -1
  241. package/build/stepper/Stepper.js +21 -2
  242. package/build/stepper/Stepper.js.map +1 -1
  243. package/build/stepper/Stepper.mjs +21 -2
  244. package/build/stepper/Stepper.mjs.map +1 -1
  245. package/build/sticky/Sticky.js +19 -1
  246. package/build/sticky/Sticky.js.map +1 -1
  247. package/build/sticky/Sticky.mjs +19 -1
  248. package/build/sticky/Sticky.mjs.map +1 -1
  249. package/build/summary/Summary.js +19 -4
  250. package/build/summary/Summary.js.map +1 -1
  251. package/build/summary/Summary.mjs +19 -4
  252. package/build/summary/Summary.mjs.map +1 -1
  253. package/build/tabs/Tabs.js +19 -2
  254. package/build/tabs/Tabs.js.map +1 -1
  255. package/build/tabs/Tabs.mjs +19 -2
  256. package/build/tabs/Tabs.mjs.map +1 -1
  257. package/build/tile/Tile.js +19 -1
  258. package/build/tile/Tile.js.map +1 -1
  259. package/build/tile/Tile.mjs +19 -1
  260. package/build/tile/Tile.mjs.map +1 -1
  261. package/build/title/Title.js +19 -1
  262. package/build/title/Title.js.map +1 -1
  263. package/build/title/Title.mjs +19 -1
  264. package/build/title/Title.mjs.map +1 -1
  265. package/build/tooltip/Tooltip.js +19 -1
  266. package/build/tooltip/Tooltip.js.map +1 -1
  267. package/build/tooltip/Tooltip.mjs +19 -1
  268. package/build/tooltip/Tooltip.mjs.map +1 -1
  269. package/build/typeahead/Typeahead.js +20 -3
  270. package/build/typeahead/Typeahead.js.map +1 -1
  271. package/build/typeahead/Typeahead.mjs +20 -3
  272. package/build/typeahead/Typeahead.mjs.map +1 -1
  273. package/build/types/common/fakeEvents.d.ts +23 -0
  274. package/build/types/common/fakeEvents.d.ts.map +1 -0
  275. package/build/types/common/hooks/index.d.ts +4 -4
  276. package/build/types/common/hooks/index.d.ts.map +1 -1
  277. package/build/types/common/hooks/useConditionalListener/index.d.ts +1 -1
  278. package/build/types/common/hooks/useConditionalListener/index.d.ts.map +1 -1
  279. package/build/types/common/hooks/useDirection/index.d.ts +1 -1
  280. package/build/types/common/hooks/useDirection/index.d.ts.map +1 -1
  281. package/build/types/common/hooks/useHasIntersected/index.d.ts +1 -1
  282. package/build/types/common/hooks/useHasIntersected/index.d.ts.map +1 -1
  283. package/build/types/common/hooks/useHasIntersected/useHasIntersected.d.ts +15 -4
  284. package/build/types/common/hooks/useHasIntersected/useHasIntersected.d.ts.map +1 -1
  285. package/build/types/common/index.d.ts +24 -24
  286. package/build/types/common/index.d.ts.map +1 -1
  287. package/build/types/common/requirements.d.ts +47 -0
  288. package/build/types/common/requirements.d.ts.map +1 -0
  289. package/build/types/common/responsivePanel/index.d.ts +1 -1
  290. package/build/types/common/responsivePanel/index.d.ts.map +1 -1
  291. package/build/types/navigationOption/NavigationOption.d.ts +1 -0
  292. package/build/types/navigationOption/NavigationOption.d.ts.map +1 -1
  293. package/build/types/snackbar/Snackbar.d.ts.map +1 -1
  294. package/build/upload/Upload.js +19 -1
  295. package/build/upload/Upload.js.map +1 -1
  296. package/build/upload/Upload.mjs +19 -1
  297. package/build/upload/Upload.mjs.map +1 -1
  298. package/build/upload/steps/processingStep/processingStep.js +19 -2
  299. package/build/upload/steps/processingStep/processingStep.js.map +1 -1
  300. package/build/upload/steps/processingStep/processingStep.mjs +19 -2
  301. package/build/upload/steps/processingStep/processingStep.mjs.map +1 -1
  302. package/build/upload/steps/uploadImageStep/uploadImageStep.js +19 -2
  303. package/build/upload/steps/uploadImageStep/uploadImageStep.js.map +1 -1
  304. package/build/upload/steps/uploadImageStep/uploadImageStep.mjs +19 -2
  305. package/build/upload/steps/uploadImageStep/uploadImageStep.mjs.map +1 -1
  306. package/build/uploadInput/UploadInput.js +19 -2
  307. package/build/uploadInput/UploadInput.js.map +1 -1
  308. package/build/uploadInput/UploadInput.mjs +19 -2
  309. package/build/uploadInput/UploadInput.mjs.map +1 -1
  310. package/build/uploadInput/uploadButton/UploadButton.js +19 -1
  311. package/build/uploadInput/uploadButton/UploadButton.js.map +1 -1
  312. package/build/uploadInput/uploadButton/UploadButton.mjs +19 -1
  313. package/build/uploadInput/uploadButton/UploadButton.mjs.map +1 -1
  314. package/build/uploadInput/uploadButton/defaults.js +18 -0
  315. package/build/uploadInput/uploadButton/defaults.js.map +1 -1
  316. package/build/uploadInput/uploadButton/defaults.mjs +18 -0
  317. package/build/uploadInput/uploadButton/defaults.mjs.map +1 -1
  318. package/build/uploadInput/uploadItem/UploadItem.js +19 -3
  319. package/build/uploadInput/uploadItem/UploadItem.js.map +1 -1
  320. package/build/uploadInput/uploadItem/UploadItem.mjs +19 -3
  321. package/build/uploadInput/uploadItem/UploadItem.mjs.map +1 -1
  322. package/build/withDisplayFormat/WithDisplayFormat.js +20 -1
  323. package/build/withDisplayFormat/WithDisplayFormat.js.map +1 -1
  324. package/build/withDisplayFormat/WithDisplayFormat.mjs +20 -1
  325. package/build/withDisplayFormat/WithDisplayFormat.mjs.map +1 -1
  326. package/package.json +3 -3
  327. package/src/common/{fakeEvents.js → fakeEvents.ts} +1 -1
  328. package/src/common/hooks/useHasIntersected/{useHasIntersected.js → useHasIntersected.ts} +17 -11
  329. package/src/common/{requirements.js → requirements.ts} +106 -36
  330. package/src/navigationOption/{NavigationOption.story.js → NavigationOption.story.tsx} +23 -5
  331. package/src/navigationOption/NavigationOption.tsx +1 -1
  332. package/src/snackbar/Snackbar.story.tsx +3 -1
  333. package/src/snackbar/Snackbar.tsx +8 -2
  334. /package/src/common/hooks/{index.js → index.ts} +0 -0
  335. /package/src/common/hooks/useConditionalListener/{index.js → index.ts} +0 -0
  336. /package/src/common/hooks/useDirection/{index.js → index.ts} +0 -0
  337. /package/src/common/hooks/useHasIntersected/{index.js → index.ts} +0 -0
  338. /package/src/common/{index.js → index.ts} +0 -0
  339. /package/src/common/responsivePanel/{index.js → index.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"WithDisplayFormat.js","sources":["../../src/withDisplayFormat/WithDisplayFormat.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { HistoryNavigator } from '../common';\nimport {\n formatWithPattern,\n getCountOfSymbolsInSelection,\n getCursorPositionAfterKeystroke,\n unformatWithPattern,\n getDistanceToPreviousSymbol,\n getDistanceToNextSymbol,\n} from '../common/textFormat';\nimport { InputProps } from '../inputs/Input';\nimport { TextAreaProps } from '../inputs/TextArea';\n\ntype HTMLTextElement = HTMLInputElement | HTMLTextAreaElement;\ntype TextElementProps = InputProps | TextAreaProps;\n\nexport type EventType =\n | 'KeyDown'\n | 'Paste'\n | 'Cut'\n | 'Undo'\n | 'Redo'\n | 'Backspace'\n | 'Delete'\n | 'Initial';\n\ninterface WithDisplayFormatState {\n value: string;\n historyNavigator: HistoryNavigator;\n prevDisplayPattern: string;\n triggerType: EventType;\n triggerEvent: React.KeyboardEvent<HTMLTextElement> | null;\n pastedLength: number;\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface WithDisplayFormatProps<T extends TextElementProps = TextElementProps>\n extends Pick<\n TextElementProps,\n | 'className'\n | 'disabled'\n | 'id'\n | 'maxLength'\n | 'minLength'\n | 'name'\n | 'placeholder'\n | 'readOnly'\n | 'required'\n | 'inputMode'\n > {\n value?: string;\n displayPattern: string;\n /**\n * autocomplete hides our form help so we need to disable it when help text\n * is present. Chrome ignores autocomplete=off, the only way to disable it is\n * to provide an 'invalid' value, for which 'disabled' serves.\n */\n autoComplete?: TextElementProps['autoComplete'] | 'disabled';\n onChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n onFocus?: (value: string) => void;\n render: (renderProps: T) => React.JSX.Element;\n}\n\nclass WithDisplayFormat<T extends TextElementProps> extends React.Component<\n WithDisplayFormatProps<T>,\n WithDisplayFormatState\n> {\n declare props: WithDisplayFormatProps<T> &\n Required<Pick<WithDisplayFormatProps<T>, keyof typeof WithDisplayFormat.defaultProps>>;\n static defaultProps = {\n autoComplete: 'off',\n displayPattern: '',\n value: '',\n };\n\n constructor(props: WithDisplayFormatProps) {\n super(props);\n const unformattedValue = unformatWithPattern(props.value ?? '', props.displayPattern);\n this.state = {\n value: formatWithPattern(unformattedValue, props.displayPattern),\n historyNavigator: new HistoryNavigator(),\n prevDisplayPattern: props.displayPattern,\n triggerType: 'Initial',\n triggerEvent: null,\n selectionStart: 0,\n selectionEnd: 0,\n pastedLength: 0,\n };\n }\n\n static getDerivedStateFromProps(\n { displayPattern }: WithDisplayFormatProps,\n { prevDisplayPattern = displayPattern, value, historyNavigator }: WithDisplayFormatState,\n ) {\n if (prevDisplayPattern !== displayPattern) {\n const unFormattedValue = unformatWithPattern(value, prevDisplayPattern);\n historyNavigator.reset();\n\n return {\n prevDisplayPattern: displayPattern,\n value: formatWithPattern(unFormattedValue, displayPattern),\n triggerType: null,\n triggerEvent: null,\n pastedLength: 0,\n };\n }\n return null;\n }\n\n getUserAction = (unformattedValue: string): EventType | string => {\n const { triggerEvent, triggerType, value } = this.state;\n const { displayPattern } = this.props;\n\n if (triggerEvent) {\n const charCode = String.fromCharCode(triggerEvent.which).toLowerCase();\n\n if (triggerType === 'Paste' || triggerType === 'Cut') {\n return triggerType;\n }\n\n if ((triggerEvent.ctrlKey || triggerEvent.metaKey) && charCode === 'z') {\n return triggerEvent.shiftKey ? 'Redo' : 'Undo';\n }\n // Detect mouse event redo\n if (triggerEvent.ctrlKey && charCode === 'd') {\n return 'Delete';\n }\n\n // Android Fix.\n if (\n typeof triggerEvent.key === 'undefined' &&\n unformattedValue.length <= unformatWithPattern(value, displayPattern).length\n ) {\n return 'Backspace';\n }\n return triggerEvent.key;\n }\n // triggerEvent can be null only in case of \"autofilling\" (via password manager extension or browser build-in one) events\n return 'Paste';\n };\n\n resetEvent = () => {\n this.setState({\n triggerType: 'Initial',\n triggerEvent: null,\n pastedLength: 0,\n });\n };\n\n detectUndoRedo = (event: React.KeyboardEvent<HTMLTextElement>) => {\n const charCode = String.fromCharCode(event.which).toLowerCase();\n if ((event.ctrlKey || event.metaKey) && charCode === 'z') {\n return event.shiftKey ? 'Redo' : 'Undo';\n }\n return null;\n };\n\n handleOnKeyDown: React.KeyboardEventHandler<HTMLTextElement> = (event) => {\n event.persist();\n const { selectionStart, selectionEnd } = event.currentTarget;\n const { historyNavigator } = this.state;\n const { displayPattern } = this.props;\n\n // Unfortunately Undo and Redo don't trigger OnChange event so we need to handle some value logic here.\n let newFormattedValue = '';\n\n if (this.detectUndoRedo(event) === 'Undo') {\n newFormattedValue = formatWithPattern(historyNavigator.undo().toString(), displayPattern);\n this.setState({ value: newFormattedValue, triggerType: 'Undo' });\n } else if (this.detectUndoRedo(event) === 'Redo') {\n newFormattedValue = formatWithPattern(historyNavigator.redo().toString(), displayPattern);\n this.setState({ value: newFormattedValue, triggerType: 'Redo' });\n } else {\n this.setState({\n triggerEvent: event,\n triggerType: 'KeyDown',\n selectionStart: selectionStart ?? 0,\n selectionEnd: selectionEnd ?? 0,\n });\n }\n };\n\n handleOnPaste: React.ClipboardEventHandler<HTMLTextElement> = (event) => {\n const { displayPattern } = this.props;\n const pastedLength = unformatWithPattern(\n event.clipboardData.getData('Text'),\n displayPattern,\n ).length;\n\n this.setState({ triggerType: 'Paste', pastedLength });\n };\n\n handleOnCut: React.ClipboardEventHandler<HTMLTextElement> = () => {\n this.setState({ triggerType: 'Cut' });\n };\n\n isKeyAllowed = (action: EventType | string) => {\n const { displayPattern } = this.props;\n const symbolsInPattern = displayPattern.split('').filter((character) => character !== '*');\n\n return !symbolsInPattern.includes(action);\n };\n\n handleOnChange: React.ChangeEventHandler<HTMLTextElement> = (event) => {\n const { historyNavigator, triggerType } = this.state;\n const { displayPattern, onChange } = this.props;\n const { value } = event.target;\n let unformattedValue = unformatWithPattern(value, displayPattern);\n const action = this.getUserAction(unformattedValue);\n if (!this.isKeyAllowed(action) || triggerType === 'Undo' || triggerType === 'Redo') {\n return;\n }\n\n if (action === 'Backspace' || action === 'Delete') {\n unformattedValue = this.handleDelete(unformattedValue, action);\n }\n\n const newFormattedValue = formatWithPattern(unformattedValue, displayPattern);\n historyNavigator.add(unformattedValue);\n\n this.handleCursorPositioning(action);\n\n this.setState({ value: newFormattedValue }, () => {\n this.resetEvent();\n if (onChange) {\n const broadcastValue = unformatWithPattern(newFormattedValue, displayPattern);\n onChange(broadcastValue);\n }\n });\n };\n\n handleOnBlur: React.FocusEventHandler<HTMLTextElement> = (event) => {\n this.props.onBlur?.(unformatWithPattern(event.target.value, this.props.displayPattern));\n };\n\n handleOnFocus: React.FocusEventHandler<HTMLTextElement> = (event) => {\n const { displayPattern, onFocus } = this.props;\n if (onFocus) {\n this.handleOnChange(event);\n onFocus(unformatWithPattern(event.target.value, displayPattern));\n }\n };\n\n handleDelete = (unformattedValue: string, action: EventType) => {\n const { displayPattern } = this.props;\n const { selectionStart, selectionEnd } = this.state;\n const newStack = [...unformattedValue];\n if (selectionStart === selectionEnd) {\n let startPosition =\n selectionStart - getCountOfSymbolsInSelection(0, selectionStart, displayPattern);\n let toDelete = 0;\n\n let count = getDistanceToNextSymbol(selectionStart, displayPattern);\n if (action === 'Backspace') {\n startPosition -= 1;\n count = getDistanceToPreviousSymbol(selectionStart, displayPattern);\n }\n\n if (startPosition >= 0 && count) {\n toDelete = 1;\n }\n\n newStack.splice(startPosition, toDelete);\n }\n\n return newStack.join('');\n };\n\n handleCursorPositioning = (action: string) => {\n const { displayPattern } = this.props;\n const { triggerEvent, selectionStart, selectionEnd, pastedLength } = this.state;\n const target = triggerEvent?.currentTarget;\n\n const cursorPosition = getCursorPositionAfterKeystroke(\n action,\n selectionStart,\n selectionEnd,\n displayPattern,\n pastedLength,\n );\n\n setTimeout(() => {\n target?.setSelectionRange(cursorPosition, cursorPosition);\n this.setState({ selectionStart: cursorPosition, selectionEnd: cursorPosition });\n }, 0);\n };\n\n render() {\n const {\n inputMode,\n className,\n id,\n name,\n placeholder,\n readOnly,\n required,\n minLength,\n maxLength,\n disabled,\n autoComplete,\n } = this.props;\n const { value } = this.state;\n const renderProps: TextElementProps = {\n inputMode,\n className,\n id,\n name,\n placeholder,\n readOnly,\n required,\n minLength,\n maxLength,\n disabled,\n autoComplete,\n value,\n onFocus: this.handleOnFocus,\n onBlur: this.handleOnBlur,\n onPaste: this.handleOnPaste,\n onKeyDown: this.handleOnKeyDown,\n onChange: this.handleOnChange,\n onCut: this.handleOnCut,\n };\n return this.props.render(renderProps as T);\n }\n}\n\nexport default WithDisplayFormat;\n"],"names":["WithDisplayFormat","React","Component","defaultProps","autoComplete","displayPattern","value","constructor","props","unformattedValue","unformatWithPattern","state","formatWithPattern","historyNavigator","HistoryNavigator","prevDisplayPattern","triggerType","triggerEvent","selectionStart","selectionEnd","pastedLength","getDerivedStateFromProps","unFormattedValue","reset","getUserAction","charCode","String","fromCharCode","which","toLowerCase","ctrlKey","metaKey","shiftKey","key","length","resetEvent","setState","detectUndoRedo","event","handleOnKeyDown","persist","currentTarget","newFormattedValue","undo","toString","redo","handleOnPaste","clipboardData","getData","handleOnCut","isKeyAllowed","action","symbolsInPattern","split","filter","character","includes","handleOnChange","onChange","target","handleDelete","add","handleCursorPositioning","broadcastValue","handleOnBlur","onBlur","handleOnFocus","onFocus","newStack","startPosition","getCountOfSymbolsInSelection","toDelete","count","getDistanceToNextSymbol","getDistanceToPreviousSymbol","splice","join","cursorPosition","getCursorPositionAfterKeystroke","setTimeout","setSelectionRange","render","inputMode","className","id","name","placeholder","readOnly","required","minLength","maxLength","disabled","renderProps","onPaste","onKeyDown","onCut"],"mappings":"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"}
1
+ {"version":3,"file":"WithDisplayFormat.js","sources":["../../src/withDisplayFormat/WithDisplayFormat.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { HistoryNavigator } from '../common';\nimport {\n formatWithPattern,\n getCountOfSymbolsInSelection,\n getCursorPositionAfterKeystroke,\n unformatWithPattern,\n getDistanceToPreviousSymbol,\n getDistanceToNextSymbol,\n} from '../common/textFormat';\nimport { InputProps } from '../inputs/Input';\nimport { TextAreaProps } from '../inputs/TextArea';\n\ntype HTMLTextElement = HTMLInputElement | HTMLTextAreaElement;\ntype TextElementProps = InputProps | TextAreaProps;\n\nexport type EventType =\n | 'KeyDown'\n | 'Paste'\n | 'Cut'\n | 'Undo'\n | 'Redo'\n | 'Backspace'\n | 'Delete'\n | 'Initial';\n\ninterface WithDisplayFormatState {\n value: string;\n historyNavigator: HistoryNavigator;\n prevDisplayPattern: string;\n triggerType: EventType;\n triggerEvent: React.KeyboardEvent<HTMLTextElement> | null;\n pastedLength: number;\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface WithDisplayFormatProps<T extends TextElementProps = TextElementProps>\n extends Pick<\n TextElementProps,\n | 'className'\n | 'disabled'\n | 'id'\n | 'maxLength'\n | 'minLength'\n | 'name'\n | 'placeholder'\n | 'readOnly'\n | 'required'\n | 'inputMode'\n > {\n value?: string;\n displayPattern: string;\n /**\n * autocomplete hides our form help so we need to disable it when help text\n * is present. Chrome ignores autocomplete=off, the only way to disable it is\n * to provide an 'invalid' value, for which 'disabled' serves.\n */\n autoComplete?: TextElementProps['autoComplete'] | 'disabled';\n onChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n onFocus?: (value: string) => void;\n render: (renderProps: T) => React.JSX.Element;\n}\n\nclass WithDisplayFormat<T extends TextElementProps> extends React.Component<\n WithDisplayFormatProps<T>,\n WithDisplayFormatState\n> {\n declare props: WithDisplayFormatProps<T> &\n Required<Pick<WithDisplayFormatProps<T>, keyof typeof WithDisplayFormat.defaultProps>>;\n static defaultProps = {\n autoComplete: 'off',\n displayPattern: '',\n value: '',\n };\n\n constructor(props: WithDisplayFormatProps) {\n super(props);\n const unformattedValue = unformatWithPattern(props.value ?? '', props.displayPattern);\n this.state = {\n value: formatWithPattern(unformattedValue, props.displayPattern),\n historyNavigator: new HistoryNavigator(),\n prevDisplayPattern: props.displayPattern,\n triggerType: 'Initial',\n triggerEvent: null,\n selectionStart: 0,\n selectionEnd: 0,\n pastedLength: 0,\n };\n }\n\n static getDerivedStateFromProps(\n { displayPattern }: WithDisplayFormatProps,\n { prevDisplayPattern = displayPattern, value, historyNavigator }: WithDisplayFormatState,\n ) {\n if (prevDisplayPattern !== displayPattern) {\n const unFormattedValue = unformatWithPattern(value, prevDisplayPattern);\n historyNavigator.reset();\n\n return {\n prevDisplayPattern: displayPattern,\n value: formatWithPattern(unFormattedValue, displayPattern),\n triggerType: null,\n triggerEvent: null,\n pastedLength: 0,\n };\n }\n return null;\n }\n\n getUserAction = (unformattedValue: string): EventType | string => {\n const { triggerEvent, triggerType, value } = this.state;\n const { displayPattern } = this.props;\n\n if (triggerEvent) {\n const charCode = String.fromCharCode(triggerEvent.which).toLowerCase();\n\n if (triggerType === 'Paste' || triggerType === 'Cut') {\n return triggerType;\n }\n\n if ((triggerEvent.ctrlKey || triggerEvent.metaKey) && charCode === 'z') {\n return triggerEvent.shiftKey ? 'Redo' : 'Undo';\n }\n // Detect mouse event redo\n if (triggerEvent.ctrlKey && charCode === 'd') {\n return 'Delete';\n }\n\n // Android Fix.\n if (\n typeof triggerEvent.key === 'undefined' &&\n unformattedValue.length <= unformatWithPattern(value, displayPattern).length\n ) {\n return 'Backspace';\n }\n return triggerEvent.key;\n }\n // triggerEvent can be null only in case of \"autofilling\" (via password manager extension or browser build-in one) events\n return 'Paste';\n };\n\n resetEvent = () => {\n this.setState({\n triggerType: 'Initial',\n triggerEvent: null,\n pastedLength: 0,\n });\n };\n\n detectUndoRedo = (event: React.KeyboardEvent<HTMLTextElement>) => {\n const charCode = String.fromCharCode(event.which).toLowerCase();\n if ((event.ctrlKey || event.metaKey) && charCode === 'z') {\n return event.shiftKey ? 'Redo' : 'Undo';\n }\n return null;\n };\n\n handleOnKeyDown: React.KeyboardEventHandler<HTMLTextElement> = (event) => {\n event.persist();\n const { selectionStart, selectionEnd } = event.currentTarget;\n const { historyNavigator } = this.state;\n const { displayPattern } = this.props;\n\n // Unfortunately Undo and Redo don't trigger OnChange event so we need to handle some value logic here.\n let newFormattedValue = '';\n\n if (this.detectUndoRedo(event) === 'Undo') {\n newFormattedValue = formatWithPattern(historyNavigator.undo().toString(), displayPattern);\n this.setState({ value: newFormattedValue, triggerType: 'Undo' });\n } else if (this.detectUndoRedo(event) === 'Redo') {\n newFormattedValue = formatWithPattern(historyNavigator.redo().toString(), displayPattern);\n this.setState({ value: newFormattedValue, triggerType: 'Redo' });\n } else {\n this.setState({\n triggerEvent: event,\n triggerType: 'KeyDown',\n selectionStart: selectionStart ?? 0,\n selectionEnd: selectionEnd ?? 0,\n });\n }\n };\n\n handleOnPaste: React.ClipboardEventHandler<HTMLTextElement> = (event) => {\n const { displayPattern } = this.props;\n const pastedLength = unformatWithPattern(\n event.clipboardData.getData('Text'),\n displayPattern,\n ).length;\n\n this.setState({ triggerType: 'Paste', pastedLength });\n };\n\n handleOnCut: React.ClipboardEventHandler<HTMLTextElement> = () => {\n this.setState({ triggerType: 'Cut' });\n };\n\n isKeyAllowed = (action: EventType | string) => {\n const { displayPattern } = this.props;\n const symbolsInPattern = displayPattern.split('').filter((character) => character !== '*');\n\n return !symbolsInPattern.includes(action);\n };\n\n handleOnChange: React.ChangeEventHandler<HTMLTextElement> = (event) => {\n const { historyNavigator, triggerType } = this.state;\n const { displayPattern, onChange } = this.props;\n const { value } = event.target;\n let unformattedValue = unformatWithPattern(value, displayPattern);\n const action = this.getUserAction(unformattedValue);\n if (!this.isKeyAllowed(action) || triggerType === 'Undo' || triggerType === 'Redo') {\n return;\n }\n\n if (action === 'Backspace' || action === 'Delete') {\n unformattedValue = this.handleDelete(unformattedValue, action);\n }\n\n const newFormattedValue = formatWithPattern(unformattedValue, displayPattern);\n historyNavigator.add(unformattedValue);\n\n this.handleCursorPositioning(action);\n\n this.setState({ value: newFormattedValue }, () => {\n this.resetEvent();\n if (onChange) {\n const broadcastValue = unformatWithPattern(newFormattedValue, displayPattern);\n onChange(broadcastValue);\n }\n });\n };\n\n handleOnBlur: React.FocusEventHandler<HTMLTextElement> = (event) => {\n this.props.onBlur?.(unformatWithPattern(event.target.value, this.props.displayPattern));\n };\n\n handleOnFocus: React.FocusEventHandler<HTMLTextElement> = (event) => {\n const { displayPattern, onFocus } = this.props;\n if (onFocus) {\n this.handleOnChange(event);\n onFocus(unformatWithPattern(event.target.value, displayPattern));\n }\n };\n\n handleDelete = (unformattedValue: string, action: EventType) => {\n const { displayPattern } = this.props;\n const { selectionStart, selectionEnd } = this.state;\n const newStack = [...unformattedValue];\n if (selectionStart === selectionEnd) {\n let startPosition =\n selectionStart - getCountOfSymbolsInSelection(0, selectionStart, displayPattern);\n let toDelete = 0;\n\n let count = getDistanceToNextSymbol(selectionStart, displayPattern);\n if (action === 'Backspace') {\n startPosition -= 1;\n count = getDistanceToPreviousSymbol(selectionStart, displayPattern);\n }\n\n if (startPosition >= 0 && count) {\n toDelete = 1;\n }\n\n newStack.splice(startPosition, toDelete);\n }\n\n return newStack.join('');\n };\n\n handleCursorPositioning = (action: string) => {\n const { displayPattern } = this.props;\n const { triggerEvent, selectionStart, selectionEnd, pastedLength } = this.state;\n const target = triggerEvent?.currentTarget;\n\n const cursorPosition = getCursorPositionAfterKeystroke(\n action,\n selectionStart,\n selectionEnd,\n displayPattern,\n pastedLength,\n );\n\n setTimeout(() => {\n target?.setSelectionRange(cursorPosition, cursorPosition);\n this.setState({ selectionStart: cursorPosition, selectionEnd: cursorPosition });\n }, 0);\n };\n\n render() {\n const {\n inputMode,\n className,\n id,\n name,\n placeholder,\n readOnly,\n required,\n minLength,\n maxLength,\n disabled,\n autoComplete,\n } = this.props;\n const { value } = this.state;\n const renderProps: TextElementProps = {\n inputMode,\n className,\n id,\n name,\n placeholder,\n readOnly,\n required,\n minLength,\n maxLength,\n disabled,\n autoComplete,\n value,\n onFocus: this.handleOnFocus,\n onBlur: this.handleOnBlur,\n onPaste: this.handleOnPaste,\n onKeyDown: this.handleOnKeyDown,\n onChange: this.handleOnChange,\n onCut: this.handleOnCut,\n };\n return this.props.render(renderProps as T);\n }\n}\n\nexport default WithDisplayFormat;\n"],"names":["WithDisplayFormat","React","Component","defaultProps","autoComplete","displayPattern","value","constructor","props","unformattedValue","unformatWithPattern","state","formatWithPattern","historyNavigator","HistoryNavigator","prevDisplayPattern","triggerType","triggerEvent","selectionStart","selectionEnd","pastedLength","getDerivedStateFromProps","unFormattedValue","reset","getUserAction","charCode","String","fromCharCode","which","toLowerCase","ctrlKey","metaKey","shiftKey","key","length","resetEvent","setState","detectUndoRedo","event","handleOnKeyDown","persist","currentTarget","newFormattedValue","undo","toString","redo","handleOnPaste","clipboardData","getData","handleOnCut","isKeyAllowed","action","symbolsInPattern","split","filter","character","includes","handleOnChange","onChange","target","handleDelete","add","handleCursorPositioning","broadcastValue","handleOnBlur","onBlur","handleOnFocus","onFocus","newStack","startPosition","getCountOfSymbolsInSelection","toDelete","count","getDistanceToNextSymbol","getDistanceToPreviousSymbol","splice","join","cursorPosition","getCursorPositionAfterKeystroke","setTimeout","setSelectionRange","render","inputMode","className","id","name","placeholder","readOnly","required","minLength","maxLength","disabled","renderProps","onPaste","onKeyDown","onCut"],"mappings":"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"}
@@ -1,10 +1,29 @@
1
1
  import * as React from 'react';
2
+ import HistoryNavigator from '../common/historyNavigator/historyNavigator.mjs';
3
+ import '../common/theme.mjs';
4
+ import '../common/direction.mjs';
5
+ import '../common/propsValues/control.mjs';
6
+ import '../common/propsValues/breakpoint.mjs';
7
+ import '../common/propsValues/size.mjs';
8
+ import '../common/propsValues/typography.mjs';
9
+ import '../common/propsValues/width.mjs';
10
+ import '../common/propsValues/type.mjs';
11
+ import '../common/propsValues/dateMode.mjs';
12
+ import '../common/propsValues/monthFormat.mjs';
13
+ import '../common/propsValues/position.mjs';
14
+ import '../common/propsValues/layouts.mjs';
15
+ import '../common/propsValues/status.mjs';
16
+ import '../common/propsValues/sentiment.mjs';
17
+ import '../common/propsValues/profileType.mjs';
18
+ import '../common/propsValues/variant.mjs';
19
+ import '../common/propsValues/scroll.mjs';
20
+ import '../common/propsValues/markdownNodeType.mjs';
21
+ import '../common/fileType.mjs';
2
22
  import formatWithPattern from '../common/textFormat/formatWithPattern/formatWithPattern.mjs';
3
23
  import unformatWithPattern from '../common/textFormat/unformatWithPattern/unformatWithPattern.mjs';
4
24
  import getCountOfSymbolsInSelection from '../common/textFormat/getCountOfSymbolsInSelection/getCountOfSymbolsInSelection.mjs';
5
25
  import getCursorPositionAfterActionStroke from '../common/textFormat/getCursorPositionAfterKeystroke/getCursorPositionAfterKeystroke.mjs';
6
26
  import { getDistanceToNextSymbol, getDistanceToPreviousSymbol } from '../common/textFormat/getDistanceToSymbol/getDistanceToSymbol.mjs';
7
- import HistoryNavigator from '../common/historyNavigator/historyNavigator.mjs';
8
27
 
9
28
  class WithDisplayFormat extends React.Component {
10
29
  static defaultProps = {
@@ -1 +1 @@
1
- {"version":3,"file":"WithDisplayFormat.mjs","sources":["../../src/withDisplayFormat/WithDisplayFormat.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { HistoryNavigator } from '../common';\nimport {\n formatWithPattern,\n getCountOfSymbolsInSelection,\n getCursorPositionAfterKeystroke,\n unformatWithPattern,\n getDistanceToPreviousSymbol,\n getDistanceToNextSymbol,\n} from '../common/textFormat';\nimport { InputProps } from '../inputs/Input';\nimport { TextAreaProps } from '../inputs/TextArea';\n\ntype HTMLTextElement = HTMLInputElement | HTMLTextAreaElement;\ntype TextElementProps = InputProps | TextAreaProps;\n\nexport type EventType =\n | 'KeyDown'\n | 'Paste'\n | 'Cut'\n | 'Undo'\n | 'Redo'\n | 'Backspace'\n | 'Delete'\n | 'Initial';\n\ninterface WithDisplayFormatState {\n value: string;\n historyNavigator: HistoryNavigator;\n prevDisplayPattern: string;\n triggerType: EventType;\n triggerEvent: React.KeyboardEvent<HTMLTextElement> | null;\n pastedLength: number;\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface WithDisplayFormatProps<T extends TextElementProps = TextElementProps>\n extends Pick<\n TextElementProps,\n | 'className'\n | 'disabled'\n | 'id'\n | 'maxLength'\n | 'minLength'\n | 'name'\n | 'placeholder'\n | 'readOnly'\n | 'required'\n | 'inputMode'\n > {\n value?: string;\n displayPattern: string;\n /**\n * autocomplete hides our form help so we need to disable it when help text\n * is present. Chrome ignores autocomplete=off, the only way to disable it is\n * to provide an 'invalid' value, for which 'disabled' serves.\n */\n autoComplete?: TextElementProps['autoComplete'] | 'disabled';\n onChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n onFocus?: (value: string) => void;\n render: (renderProps: T) => React.JSX.Element;\n}\n\nclass WithDisplayFormat<T extends TextElementProps> extends React.Component<\n WithDisplayFormatProps<T>,\n WithDisplayFormatState\n> {\n declare props: WithDisplayFormatProps<T> &\n Required<Pick<WithDisplayFormatProps<T>, keyof typeof WithDisplayFormat.defaultProps>>;\n static defaultProps = {\n autoComplete: 'off',\n displayPattern: '',\n value: '',\n };\n\n constructor(props: WithDisplayFormatProps) {\n super(props);\n const unformattedValue = unformatWithPattern(props.value ?? '', props.displayPattern);\n this.state = {\n value: formatWithPattern(unformattedValue, props.displayPattern),\n historyNavigator: new HistoryNavigator(),\n prevDisplayPattern: props.displayPattern,\n triggerType: 'Initial',\n triggerEvent: null,\n selectionStart: 0,\n selectionEnd: 0,\n pastedLength: 0,\n };\n }\n\n static getDerivedStateFromProps(\n { displayPattern }: WithDisplayFormatProps,\n { prevDisplayPattern = displayPattern, value, historyNavigator }: WithDisplayFormatState,\n ) {\n if (prevDisplayPattern !== displayPattern) {\n const unFormattedValue = unformatWithPattern(value, prevDisplayPattern);\n historyNavigator.reset();\n\n return {\n prevDisplayPattern: displayPattern,\n value: formatWithPattern(unFormattedValue, displayPattern),\n triggerType: null,\n triggerEvent: null,\n pastedLength: 0,\n };\n }\n return null;\n }\n\n getUserAction = (unformattedValue: string): EventType | string => {\n const { triggerEvent, triggerType, value } = this.state;\n const { displayPattern } = this.props;\n\n if (triggerEvent) {\n const charCode = String.fromCharCode(triggerEvent.which).toLowerCase();\n\n if (triggerType === 'Paste' || triggerType === 'Cut') {\n return triggerType;\n }\n\n if ((triggerEvent.ctrlKey || triggerEvent.metaKey) && charCode === 'z') {\n return triggerEvent.shiftKey ? 'Redo' : 'Undo';\n }\n // Detect mouse event redo\n if (triggerEvent.ctrlKey && charCode === 'd') {\n return 'Delete';\n }\n\n // Android Fix.\n if (\n typeof triggerEvent.key === 'undefined' &&\n unformattedValue.length <= unformatWithPattern(value, displayPattern).length\n ) {\n return 'Backspace';\n }\n return triggerEvent.key;\n }\n // triggerEvent can be null only in case of \"autofilling\" (via password manager extension or browser build-in one) events\n return 'Paste';\n };\n\n resetEvent = () => {\n this.setState({\n triggerType: 'Initial',\n triggerEvent: null,\n pastedLength: 0,\n });\n };\n\n detectUndoRedo = (event: React.KeyboardEvent<HTMLTextElement>) => {\n const charCode = String.fromCharCode(event.which).toLowerCase();\n if ((event.ctrlKey || event.metaKey) && charCode === 'z') {\n return event.shiftKey ? 'Redo' : 'Undo';\n }\n return null;\n };\n\n handleOnKeyDown: React.KeyboardEventHandler<HTMLTextElement> = (event) => {\n event.persist();\n const { selectionStart, selectionEnd } = event.currentTarget;\n const { historyNavigator } = this.state;\n const { displayPattern } = this.props;\n\n // Unfortunately Undo and Redo don't trigger OnChange event so we need to handle some value logic here.\n let newFormattedValue = '';\n\n if (this.detectUndoRedo(event) === 'Undo') {\n newFormattedValue = formatWithPattern(historyNavigator.undo().toString(), displayPattern);\n this.setState({ value: newFormattedValue, triggerType: 'Undo' });\n } else if (this.detectUndoRedo(event) === 'Redo') {\n newFormattedValue = formatWithPattern(historyNavigator.redo().toString(), displayPattern);\n this.setState({ value: newFormattedValue, triggerType: 'Redo' });\n } else {\n this.setState({\n triggerEvent: event,\n triggerType: 'KeyDown',\n selectionStart: selectionStart ?? 0,\n selectionEnd: selectionEnd ?? 0,\n });\n }\n };\n\n handleOnPaste: React.ClipboardEventHandler<HTMLTextElement> = (event) => {\n const { displayPattern } = this.props;\n const pastedLength = unformatWithPattern(\n event.clipboardData.getData('Text'),\n displayPattern,\n ).length;\n\n this.setState({ triggerType: 'Paste', pastedLength });\n };\n\n handleOnCut: React.ClipboardEventHandler<HTMLTextElement> = () => {\n this.setState({ triggerType: 'Cut' });\n };\n\n isKeyAllowed = (action: EventType | string) => {\n const { displayPattern } = this.props;\n const symbolsInPattern = displayPattern.split('').filter((character) => character !== '*');\n\n return !symbolsInPattern.includes(action);\n };\n\n handleOnChange: React.ChangeEventHandler<HTMLTextElement> = (event) => {\n const { historyNavigator, triggerType } = this.state;\n const { displayPattern, onChange } = this.props;\n const { value } = event.target;\n let unformattedValue = unformatWithPattern(value, displayPattern);\n const action = this.getUserAction(unformattedValue);\n if (!this.isKeyAllowed(action) || triggerType === 'Undo' || triggerType === 'Redo') {\n return;\n }\n\n if (action === 'Backspace' || action === 'Delete') {\n unformattedValue = this.handleDelete(unformattedValue, action);\n }\n\n const newFormattedValue = formatWithPattern(unformattedValue, displayPattern);\n historyNavigator.add(unformattedValue);\n\n this.handleCursorPositioning(action);\n\n this.setState({ value: newFormattedValue }, () => {\n this.resetEvent();\n if (onChange) {\n const broadcastValue = unformatWithPattern(newFormattedValue, displayPattern);\n onChange(broadcastValue);\n }\n });\n };\n\n handleOnBlur: React.FocusEventHandler<HTMLTextElement> = (event) => {\n this.props.onBlur?.(unformatWithPattern(event.target.value, this.props.displayPattern));\n };\n\n handleOnFocus: React.FocusEventHandler<HTMLTextElement> = (event) => {\n const { displayPattern, onFocus } = this.props;\n if (onFocus) {\n this.handleOnChange(event);\n onFocus(unformatWithPattern(event.target.value, displayPattern));\n }\n };\n\n handleDelete = (unformattedValue: string, action: EventType) => {\n const { displayPattern } = this.props;\n const { selectionStart, selectionEnd } = this.state;\n const newStack = [...unformattedValue];\n if (selectionStart === selectionEnd) {\n let startPosition =\n selectionStart - getCountOfSymbolsInSelection(0, selectionStart, displayPattern);\n let toDelete = 0;\n\n let count = getDistanceToNextSymbol(selectionStart, displayPattern);\n if (action === 'Backspace') {\n startPosition -= 1;\n count = getDistanceToPreviousSymbol(selectionStart, displayPattern);\n }\n\n if (startPosition >= 0 && count) {\n toDelete = 1;\n }\n\n newStack.splice(startPosition, toDelete);\n }\n\n return newStack.join('');\n };\n\n handleCursorPositioning = (action: string) => {\n const { displayPattern } = this.props;\n const { triggerEvent, selectionStart, selectionEnd, pastedLength } = this.state;\n const target = triggerEvent?.currentTarget;\n\n const cursorPosition = getCursorPositionAfterKeystroke(\n action,\n selectionStart,\n selectionEnd,\n displayPattern,\n pastedLength,\n );\n\n setTimeout(() => {\n target?.setSelectionRange(cursorPosition, cursorPosition);\n this.setState({ selectionStart: cursorPosition, selectionEnd: cursorPosition });\n }, 0);\n };\n\n render() {\n const {\n inputMode,\n className,\n id,\n name,\n placeholder,\n readOnly,\n required,\n minLength,\n maxLength,\n disabled,\n autoComplete,\n } = this.props;\n const { value } = this.state;\n const renderProps: TextElementProps = {\n inputMode,\n className,\n id,\n name,\n placeholder,\n readOnly,\n required,\n minLength,\n maxLength,\n disabled,\n autoComplete,\n value,\n onFocus: this.handleOnFocus,\n onBlur: this.handleOnBlur,\n onPaste: this.handleOnPaste,\n onKeyDown: this.handleOnKeyDown,\n onChange: this.handleOnChange,\n onCut: this.handleOnCut,\n };\n return this.props.render(renderProps as T);\n }\n}\n\nexport default WithDisplayFormat;\n"],"names":["WithDisplayFormat","React","Component","defaultProps","autoComplete","displayPattern","value","constructor","props","unformattedValue","unformatWithPattern","state","formatWithPattern","historyNavigator","HistoryNavigator","prevDisplayPattern","triggerType","triggerEvent","selectionStart","selectionEnd","pastedLength","getDerivedStateFromProps","unFormattedValue","reset","getUserAction","charCode","String","fromCharCode","which","toLowerCase","ctrlKey","metaKey","shiftKey","key","length","resetEvent","setState","detectUndoRedo","event","handleOnKeyDown","persist","currentTarget","newFormattedValue","undo","toString","redo","handleOnPaste","clipboardData","getData","handleOnCut","isKeyAllowed","action","symbolsInPattern","split","filter","character","includes","handleOnChange","onChange","target","handleDelete","add","handleCursorPositioning","broadcastValue","handleOnBlur","onBlur","handleOnFocus","onFocus","newStack","startPosition","getCountOfSymbolsInSelection","toDelete","count","getDistanceToNextSymbol","getDistanceToPreviousSymbol","splice","join","cursorPosition","getCursorPositionAfterKeystroke","setTimeout","setSelectionRange","render","inputMode","className","id","name","placeholder","readOnly","required","minLength","maxLength","disabled","renderProps","onPaste","onKeyDown","onCut"],"mappings":"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"}
1
+ {"version":3,"file":"WithDisplayFormat.mjs","sources":["../../src/withDisplayFormat/WithDisplayFormat.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { HistoryNavigator } from '../common';\nimport {\n formatWithPattern,\n getCountOfSymbolsInSelection,\n getCursorPositionAfterKeystroke,\n unformatWithPattern,\n getDistanceToPreviousSymbol,\n getDistanceToNextSymbol,\n} from '../common/textFormat';\nimport { InputProps } from '../inputs/Input';\nimport { TextAreaProps } from '../inputs/TextArea';\n\ntype HTMLTextElement = HTMLInputElement | HTMLTextAreaElement;\ntype TextElementProps = InputProps | TextAreaProps;\n\nexport type EventType =\n | 'KeyDown'\n | 'Paste'\n | 'Cut'\n | 'Undo'\n | 'Redo'\n | 'Backspace'\n | 'Delete'\n | 'Initial';\n\ninterface WithDisplayFormatState {\n value: string;\n historyNavigator: HistoryNavigator;\n prevDisplayPattern: string;\n triggerType: EventType;\n triggerEvent: React.KeyboardEvent<HTMLTextElement> | null;\n pastedLength: number;\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface WithDisplayFormatProps<T extends TextElementProps = TextElementProps>\n extends Pick<\n TextElementProps,\n | 'className'\n | 'disabled'\n | 'id'\n | 'maxLength'\n | 'minLength'\n | 'name'\n | 'placeholder'\n | 'readOnly'\n | 'required'\n | 'inputMode'\n > {\n value?: string;\n displayPattern: string;\n /**\n * autocomplete hides our form help so we need to disable it when help text\n * is present. Chrome ignores autocomplete=off, the only way to disable it is\n * to provide an 'invalid' value, for which 'disabled' serves.\n */\n autoComplete?: TextElementProps['autoComplete'] | 'disabled';\n onChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n onFocus?: (value: string) => void;\n render: (renderProps: T) => React.JSX.Element;\n}\n\nclass WithDisplayFormat<T extends TextElementProps> extends React.Component<\n WithDisplayFormatProps<T>,\n WithDisplayFormatState\n> {\n declare props: WithDisplayFormatProps<T> &\n Required<Pick<WithDisplayFormatProps<T>, keyof typeof WithDisplayFormat.defaultProps>>;\n static defaultProps = {\n autoComplete: 'off',\n displayPattern: '',\n value: '',\n };\n\n constructor(props: WithDisplayFormatProps) {\n super(props);\n const unformattedValue = unformatWithPattern(props.value ?? '', props.displayPattern);\n this.state = {\n value: formatWithPattern(unformattedValue, props.displayPattern),\n historyNavigator: new HistoryNavigator(),\n prevDisplayPattern: props.displayPattern,\n triggerType: 'Initial',\n triggerEvent: null,\n selectionStart: 0,\n selectionEnd: 0,\n pastedLength: 0,\n };\n }\n\n static getDerivedStateFromProps(\n { displayPattern }: WithDisplayFormatProps,\n { prevDisplayPattern = displayPattern, value, historyNavigator }: WithDisplayFormatState,\n ) {\n if (prevDisplayPattern !== displayPattern) {\n const unFormattedValue = unformatWithPattern(value, prevDisplayPattern);\n historyNavigator.reset();\n\n return {\n prevDisplayPattern: displayPattern,\n value: formatWithPattern(unFormattedValue, displayPattern),\n triggerType: null,\n triggerEvent: null,\n pastedLength: 0,\n };\n }\n return null;\n }\n\n getUserAction = (unformattedValue: string): EventType | string => {\n const { triggerEvent, triggerType, value } = this.state;\n const { displayPattern } = this.props;\n\n if (triggerEvent) {\n const charCode = String.fromCharCode(triggerEvent.which).toLowerCase();\n\n if (triggerType === 'Paste' || triggerType === 'Cut') {\n return triggerType;\n }\n\n if ((triggerEvent.ctrlKey || triggerEvent.metaKey) && charCode === 'z') {\n return triggerEvent.shiftKey ? 'Redo' : 'Undo';\n }\n // Detect mouse event redo\n if (triggerEvent.ctrlKey && charCode === 'd') {\n return 'Delete';\n }\n\n // Android Fix.\n if (\n typeof triggerEvent.key === 'undefined' &&\n unformattedValue.length <= unformatWithPattern(value, displayPattern).length\n ) {\n return 'Backspace';\n }\n return triggerEvent.key;\n }\n // triggerEvent can be null only in case of \"autofilling\" (via password manager extension or browser build-in one) events\n return 'Paste';\n };\n\n resetEvent = () => {\n this.setState({\n triggerType: 'Initial',\n triggerEvent: null,\n pastedLength: 0,\n });\n };\n\n detectUndoRedo = (event: React.KeyboardEvent<HTMLTextElement>) => {\n const charCode = String.fromCharCode(event.which).toLowerCase();\n if ((event.ctrlKey || event.metaKey) && charCode === 'z') {\n return event.shiftKey ? 'Redo' : 'Undo';\n }\n return null;\n };\n\n handleOnKeyDown: React.KeyboardEventHandler<HTMLTextElement> = (event) => {\n event.persist();\n const { selectionStart, selectionEnd } = event.currentTarget;\n const { historyNavigator } = this.state;\n const { displayPattern } = this.props;\n\n // Unfortunately Undo and Redo don't trigger OnChange event so we need to handle some value logic here.\n let newFormattedValue = '';\n\n if (this.detectUndoRedo(event) === 'Undo') {\n newFormattedValue = formatWithPattern(historyNavigator.undo().toString(), displayPattern);\n this.setState({ value: newFormattedValue, triggerType: 'Undo' });\n } else if (this.detectUndoRedo(event) === 'Redo') {\n newFormattedValue = formatWithPattern(historyNavigator.redo().toString(), displayPattern);\n this.setState({ value: newFormattedValue, triggerType: 'Redo' });\n } else {\n this.setState({\n triggerEvent: event,\n triggerType: 'KeyDown',\n selectionStart: selectionStart ?? 0,\n selectionEnd: selectionEnd ?? 0,\n });\n }\n };\n\n handleOnPaste: React.ClipboardEventHandler<HTMLTextElement> = (event) => {\n const { displayPattern } = this.props;\n const pastedLength = unformatWithPattern(\n event.clipboardData.getData('Text'),\n displayPattern,\n ).length;\n\n this.setState({ triggerType: 'Paste', pastedLength });\n };\n\n handleOnCut: React.ClipboardEventHandler<HTMLTextElement> = () => {\n this.setState({ triggerType: 'Cut' });\n };\n\n isKeyAllowed = (action: EventType | string) => {\n const { displayPattern } = this.props;\n const symbolsInPattern = displayPattern.split('').filter((character) => character !== '*');\n\n return !symbolsInPattern.includes(action);\n };\n\n handleOnChange: React.ChangeEventHandler<HTMLTextElement> = (event) => {\n const { historyNavigator, triggerType } = this.state;\n const { displayPattern, onChange } = this.props;\n const { value } = event.target;\n let unformattedValue = unformatWithPattern(value, displayPattern);\n const action = this.getUserAction(unformattedValue);\n if (!this.isKeyAllowed(action) || triggerType === 'Undo' || triggerType === 'Redo') {\n return;\n }\n\n if (action === 'Backspace' || action === 'Delete') {\n unformattedValue = this.handleDelete(unformattedValue, action);\n }\n\n const newFormattedValue = formatWithPattern(unformattedValue, displayPattern);\n historyNavigator.add(unformattedValue);\n\n this.handleCursorPositioning(action);\n\n this.setState({ value: newFormattedValue }, () => {\n this.resetEvent();\n if (onChange) {\n const broadcastValue = unformatWithPattern(newFormattedValue, displayPattern);\n onChange(broadcastValue);\n }\n });\n };\n\n handleOnBlur: React.FocusEventHandler<HTMLTextElement> = (event) => {\n this.props.onBlur?.(unformatWithPattern(event.target.value, this.props.displayPattern));\n };\n\n handleOnFocus: React.FocusEventHandler<HTMLTextElement> = (event) => {\n const { displayPattern, onFocus } = this.props;\n if (onFocus) {\n this.handleOnChange(event);\n onFocus(unformatWithPattern(event.target.value, displayPattern));\n }\n };\n\n handleDelete = (unformattedValue: string, action: EventType) => {\n const { displayPattern } = this.props;\n const { selectionStart, selectionEnd } = this.state;\n const newStack = [...unformattedValue];\n if (selectionStart === selectionEnd) {\n let startPosition =\n selectionStart - getCountOfSymbolsInSelection(0, selectionStart, displayPattern);\n let toDelete = 0;\n\n let count = getDistanceToNextSymbol(selectionStart, displayPattern);\n if (action === 'Backspace') {\n startPosition -= 1;\n count = getDistanceToPreviousSymbol(selectionStart, displayPattern);\n }\n\n if (startPosition >= 0 && count) {\n toDelete = 1;\n }\n\n newStack.splice(startPosition, toDelete);\n }\n\n return newStack.join('');\n };\n\n handleCursorPositioning = (action: string) => {\n const { displayPattern } = this.props;\n const { triggerEvent, selectionStart, selectionEnd, pastedLength } = this.state;\n const target = triggerEvent?.currentTarget;\n\n const cursorPosition = getCursorPositionAfterKeystroke(\n action,\n selectionStart,\n selectionEnd,\n displayPattern,\n pastedLength,\n );\n\n setTimeout(() => {\n target?.setSelectionRange(cursorPosition, cursorPosition);\n this.setState({ selectionStart: cursorPosition, selectionEnd: cursorPosition });\n }, 0);\n };\n\n render() {\n const {\n inputMode,\n className,\n id,\n name,\n placeholder,\n readOnly,\n required,\n minLength,\n maxLength,\n disabled,\n autoComplete,\n } = this.props;\n const { value } = this.state;\n const renderProps: TextElementProps = {\n inputMode,\n className,\n id,\n name,\n placeholder,\n readOnly,\n required,\n minLength,\n maxLength,\n disabled,\n autoComplete,\n value,\n onFocus: this.handleOnFocus,\n onBlur: this.handleOnBlur,\n onPaste: this.handleOnPaste,\n onKeyDown: this.handleOnKeyDown,\n onChange: this.handleOnChange,\n onCut: this.handleOnCut,\n };\n return this.props.render(renderProps as T);\n }\n}\n\nexport default WithDisplayFormat;\n"],"names":["WithDisplayFormat","React","Component","defaultProps","autoComplete","displayPattern","value","constructor","props","unformattedValue","unformatWithPattern","state","formatWithPattern","historyNavigator","HistoryNavigator","prevDisplayPattern","triggerType","triggerEvent","selectionStart","selectionEnd","pastedLength","getDerivedStateFromProps","unFormattedValue","reset","getUserAction","charCode","String","fromCharCode","which","toLowerCase","ctrlKey","metaKey","shiftKey","key","length","resetEvent","setState","detectUndoRedo","event","handleOnKeyDown","persist","currentTarget","newFormattedValue","undo","toString","redo","handleOnPaste","clipboardData","getData","handleOnCut","isKeyAllowed","action","symbolsInPattern","split","filter","character","includes","handleOnChange","onChange","target","handleDelete","add","handleCursorPositioning","broadcastValue","handleOnBlur","onBlur","handleOnFocus","onFocus","newStack","startPosition","getCountOfSymbolsInSelection","toDelete","count","getDistanceToNextSymbol","getDistanceToPreviousSymbol","splice","join","cursorPosition","getCursorPositionAfterKeystroke","setTimeout","setSelectionRange","render","inputMode","className","id","name","placeholder","readOnly","required","minLength","maxLength","disabled","renderProps","onPaste","onKeyDown","onCut"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-e9f4151",
3
+ "version": "0.0.0-experimental-ffa47f4",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -93,8 +93,8 @@
93
93
  "rollup-preserve-directives": "^1.1.1",
94
94
  "storybook": "^8.2.2",
95
95
  "@transferwise/less-config": "3.1.0",
96
- "@transferwise/neptune-css": "14.18.0",
97
- "@wise/components-theming": "1.6.0"
96
+ "@wise/components-theming": "1.6.0",
97
+ "@transferwise/neptune-css": "14.18.0"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "@transferwise/icons": "^3.7.0",
@@ -4,7 +4,7 @@ export const fakeEvent = () => ({
4
4
  preventDefault() {},
5
5
  });
6
6
 
7
- export const fakeKeyDownEventForKey = (key) => ({
7
+ export const fakeKeyDownEventForKey = (key: string) => ({
8
8
  ...fakeEvent(),
9
9
  key,
10
10
  });
@@ -1,6 +1,6 @@
1
1
  import { useEffect, useState } from 'react';
2
2
 
3
- const ObserverParams = {
3
+ const ObserverParams: IntersectionObserverInit = {
4
4
  threshold: 0.1,
5
5
  };
6
6
 
@@ -9,13 +9,19 @@ const ObserverParams = {
9
9
  * Use this custom hook to detect when an element has became visible inside the viewport. This hook checks only if the intersection happend.
10
10
  * Once the intersection has happened the hook will not return false even if the element gets out of the viewport.
11
11
  *
12
- * @param elRef.elRef
13
- * @param {object} [elRef] - node object that contains a react reference to the element that needs to be observed.
14
- * @param {strimng} [loading = 'eager'] - string that contains the type of loading.
12
+ * @param {object} params
13
+ * @param {object} [params.elRef] - node object that contains a react reference to the element that needs to be observed.
14
+ * @param {string} [params.loading = 'eager'] - string that contains the type of loading.
15
15
  * @param elRef.loading
16
16
  * @usage `const [hasIntersected] = useHasIntersected({imageRef,loading});`
17
17
  */
18
- export const useHasIntersected = ({ elRef, loading }) => {
18
+ export const useHasIntersected = ({
19
+ elRef,
20
+ loading = 'eager',
21
+ }: {
22
+ elRef: React.RefObject<HTMLElement>;
23
+ loading?: 'eager' | 'lazy';
24
+ }) => {
19
25
  const [hasIntersected, setHasIntersected] = useState(false);
20
26
 
21
27
  const { current } = elRef || {};
@@ -24,29 +30,29 @@ export const useHasIntersected = ({ elRef, loading }) => {
24
30
  return elRef && current;
25
31
  };
26
32
 
27
- const handleOnIntersect = (entries, observer) => {
33
+ const handleOnIntersect: IntersectionObserverCallback = (entries, observer) => {
28
34
  entries.forEach((entry) => {
29
35
  if (entry.isIntersecting) {
30
36
  setHasIntersected(true);
31
- observer.unobserve(current);
37
+ observer.unobserve(current!);
32
38
  }
33
39
  });
34
40
  };
35
41
 
36
42
  useEffect(() => {
37
- let observer;
43
+ let observer: IntersectionObserver | undefined;
38
44
  let didCancel = false;
39
45
 
40
- // Check if window is define for SSR and Old browsers fallback
46
+ // Check if window is defined for SSR and Old browsers fallback
41
47
  if (typeof window === 'undefined' || !window.IntersectionObserver || !isValidReference()) {
42
48
  setHasIntersected(true);
43
- } else if (!didCancel) {
49
+ } else if (current && !didCancel) {
44
50
  observer = new IntersectionObserver(handleOnIntersect, ObserverParams);
45
51
  observer.observe(current);
46
52
  }
47
53
  return () => {
48
54
  didCancel = true;
49
- if (observer) {
55
+ if (observer && current) {
50
56
  observer.unobserve(current);
51
57
  }
52
58
  };
@@ -1,7 +1,67 @@
1
1
  /* eslint-disable no-unused-vars */
2
2
  /* eslint-disable no-param-reassign */
3
3
 
4
- const prepRequirements = (alternatives) => {
4
+ import { PrimitiveType } from 'react-intl';
5
+
6
+ type ValidationMessages = Record<string, string>;
7
+
8
+ type Value = {
9
+ label?: string;
10
+ title?: string;
11
+ name?: string;
12
+ value?: PrimitiveType;
13
+ code?: string | number;
14
+ key?: PrimitiveType;
15
+ };
16
+
17
+ type Field = {
18
+ name?: string;
19
+ title?: string;
20
+ type?: string;
21
+ control?: string;
22
+ format?: string;
23
+ pattern?: string;
24
+ minimum?: number;
25
+ maximum?: number;
26
+ max?: number;
27
+ min?: number;
28
+ width?: string;
29
+ example?: string;
30
+ placeholder?: string;
31
+ info?: string;
32
+ tooltip?: string;
33
+ help?: { message: string };
34
+ valuesAllowed?: Value[];
35
+ values?: Value[];
36
+ default?: Value;
37
+ value?: Value;
38
+ validationMessages?: ValidationMessages;
39
+ validationRegexp?: string;
40
+ properties: Record<string, Field>;
41
+ hidden?: boolean;
42
+ key?: string;
43
+ fields?: Field[];
44
+ groups?: Field[];
45
+ [otherKey: string]: any; // For additional fields
46
+ };
47
+
48
+ type FieldMapType = Record<string, Field>;
49
+
50
+ type Alternative = {
51
+ title?: string;
52
+ label?: string;
53
+ type?: string;
54
+ types: string[];
55
+ name?: string;
56
+ description?: string;
57
+ tooltip?: string;
58
+ fields?: Field[];
59
+ fieldGroups?: Field[];
60
+ properties?: Record<string, any>;
61
+ prepared?: boolean;
62
+ };
63
+
64
+ const prepRequirements = (alternatives: Alternative[]) => {
5
65
  if (!alternatives || alternatives.length === 0) {
6
66
  return [];
7
67
  }
@@ -15,7 +75,8 @@ const prepRequirements = (alternatives) => {
15
75
 
16
76
  prepLegacyAlternatives(alternative);
17
77
 
18
- alternative.properties = prepFields(alternative.properties || alternative.fields);
78
+ const fieldsToPrep = Array.isArray(alternative.fields) ? alternative.fields : [];
79
+ alternative.properties = prepFields(fieldsToPrep) || alternative.properties;
19
80
 
20
81
  // If we're still treating type as a special case, move it to a hidden value
21
82
  if (alternative.type && alternative.type !== 'object' && !alternative.types) {
@@ -35,16 +96,14 @@ const prepRequirements = (alternatives) => {
35
96
  return preppedAlternatives;
36
97
  };
37
98
 
38
- const prepFields = (fields, model, validationMessages) => {
99
+ const prepFields = (fields: Field[], model?: any, validationMessages?: any): FieldMapType => {
39
100
  if (!fields) {
40
101
  return {};
41
102
  }
42
103
 
43
- let preparedFields = copyOf(fields);
44
-
45
- preparedFields = flattenFieldsWithGroups(preparedFields);
46
- preparedFields = transformFieldArrayToMap(preparedFields);
47
- preparedFields = transformNestedKeysToNestedSpecs(preparedFields);
104
+ const preparedFields = transformNestedKeysToNestedSpecs(
105
+ transformFieldArrayToMap(flattenFieldsWithGroups(copyOf(fields))),
106
+ );
48
107
 
49
108
  Object.keys(preparedFields).forEach((key) => {
50
109
  preparedFields[key] = prepField(preparedFields[key], model, validationMessages);
@@ -53,7 +112,7 @@ const prepFields = (fields, model, validationMessages) => {
53
112
  return preparedFields;
54
113
  };
55
114
 
56
- const prepField = (field, model, validationMessages) => {
115
+ const prepField = (field: Field, model: unknown, validationMessages: ValidationMessages) => {
57
116
  const preparedField = copyOf(field);
58
117
 
59
118
  prepLegacyProps(preparedField);
@@ -71,9 +130,10 @@ const prepField = (field, model, validationMessages) => {
71
130
  *
72
131
  * @param fields
73
132
  */
74
- const flattenFieldsWithGroups = (fields) => {
133
+ const flattenFieldsWithGroups = (fields?: Field[]): Field[] => {
75
134
  if (Array.isArray(fields)) {
76
- let flattenedFields = [];
135
+ let flattenedFields: Field[] = [];
136
+
77
137
  fields.forEach((field) => {
78
138
  // If we've been given a group with nested fields, break them out.
79
139
  if (field.fields) {
@@ -87,10 +147,11 @@ const flattenFieldsWithGroups = (fields) => {
87
147
  });
88
148
  return flattenedFields;
89
149
  }
90
- return fields;
150
+
151
+ return fields || [];
91
152
  };
92
153
 
93
- const flattenFieldWithGroup = (field, subFields) => {
154
+ const flattenFieldWithGroup = (field: Field, subFields: Field[]): Field[] => {
94
155
  // If first field doesn't have a label, use the one from the group
95
156
  if (field.name && subFields.length > 0 && !subFields[0].name) {
96
157
  subFields[0].name = field.name;
@@ -129,18 +190,26 @@ const flattenFieldWithGroup = (field, subFields) => {
129
190
  * Some older requirements return an array of fields, where it should be a map
130
191
  * from the property name to the spec. This converts arrays to maps.
131
192
  */
132
- const transformFieldArrayToMap = (fields) => {
193
+ const transformFieldArrayToMap = (fields?: Field[]): FieldMapType => {
133
194
  if (Array.isArray(fields)) {
134
- const fieldMap = {};
135
- fields.forEach((field) => {
136
- const key = field.key || field.name;
137
- delete field.key;
195
+ const fieldMap: FieldMapType = {};
196
+
197
+ fields.forEach((field: Field) => {
198
+ const newKey = field.key || field.name;
199
+
200
+ if ('key' in field) {
201
+ delete field.key;
202
+ }
138
203
 
139
- fieldMap[key] = copyOf(field);
204
+ if (newKey) {
205
+ fieldMap[newKey] = copyOf(field);
206
+ }
140
207
  });
208
+
141
209
  return fieldMap;
142
210
  }
143
- return fields;
211
+
212
+ return fields ?? {};
144
213
  };
145
214
 
146
215
  /*
@@ -149,12 +218,13 @@ const transformFieldArrayToMap = (fields) => {
149
218
  * type 'object', and nests such fields inside of it. When we render we pass
150
219
  * this object spec to a nested fieldset.
151
220
  */
152
- const transformNestedKeysToNestedSpecs = (fieldMap) => {
221
+ const transformNestedKeysToNestedSpecs = (fieldMap: FieldMapType): Record<string, Field> => {
153
222
  if (Array.isArray(fieldMap)) {
154
223
  throw new TypeError('Expecting a map of fields, not an array');
155
224
  }
156
225
 
157
- const nestedFields = {};
226
+ const nestedFields: FieldMapType = {};
227
+
158
228
  Object.keys(fieldMap).forEach((key) => {
159
229
  if (key.indexOf('.') > 0) {
160
230
  // If the key contains a period we need to nest the fields in another object
@@ -176,8 +246,8 @@ const transformNestedKeysToNestedSpecs = (fieldMap) => {
176
246
  return nestedFields;
177
247
  };
178
248
 
179
- const prepType = (field) => {
180
- const type = field.type && field.type.toLowerCase && field.type.toLowerCase();
249
+ const prepType = (field: Field) => {
250
+ const type = field.type?.toLowerCase?.();
181
251
 
182
252
  switch (type) {
183
253
  case 'text':
@@ -224,7 +294,7 @@ const prepType = (field) => {
224
294
  }
225
295
  };
226
296
 
227
- const prepLegacyAlternatives = (alternative) => {
297
+ const prepLegacyAlternatives = (alternative: Alternative) => {
228
298
  if (!alternative.title && alternative.label) {
229
299
  alternative.title = alternative.label;
230
300
  }
@@ -243,7 +313,7 @@ const prepLegacyAlternatives = (alternative) => {
243
313
  }
244
314
  };
245
315
 
246
- const prepLegacyProps = (field) => {
316
+ const prepLegacyProps = (field: Field) => {
247
317
  if (field.name && !field.title) {
248
318
  field.title = field.name;
249
319
  delete field.name;
@@ -279,7 +349,7 @@ const prepLegacyProps = (field) => {
279
349
  delete field.valuesAllowed;
280
350
  }
281
351
 
282
- if (field.values && field.values.map) {
352
+ if (field.values && Array.isArray(field.values)) {
283
353
  field.values = prepLegacyValues(field.values);
284
354
  }
285
355
 
@@ -304,9 +374,9 @@ const prepLegacyProps = (field) => {
304
374
  }
305
375
  };
306
376
 
307
- const prepLegacyValues = (values) => values.map(prepLegacyValue);
377
+ const prepLegacyValues = (values: Value[]) => values.map(prepLegacyValue);
308
378
 
309
- const prepLegacyValue = (value) => {
379
+ const prepLegacyValue = (value: Value) => {
310
380
  if (!value.label && value.title) {
311
381
  value.label = value.title;
312
382
  delete value.title;
@@ -328,7 +398,7 @@ const prepLegacyValue = (value) => {
328
398
  return value;
329
399
  };
330
400
 
331
- const prepPattern = (field) => {
401
+ const prepPattern = (field: Field) => {
332
402
  if (field.pattern) {
333
403
  try {
334
404
  new RegExp(field.pattern);
@@ -342,7 +412,7 @@ const prepPattern = (field) => {
342
412
  }
343
413
  };
344
414
 
345
- const prepValidationMessages = (field, validationMessages) => {
415
+ const prepValidationMessages = (field: Field, validationMessages?: ValidationMessages) => {
346
416
  field.validationMessages = field.validationMessages
347
417
  ? field.validationMessages
348
418
  : validationMessages;
@@ -362,7 +432,7 @@ const prepValidationMessages = (field, validationMessages) => {
362
432
  }
363
433
  };
364
434
 
365
- const getControlType = (field) => {
435
+ const getControlType = (field: Field) => {
366
436
  if (field.control) {
367
437
  return field.control.toLowerCase();
368
438
  }
@@ -386,7 +456,7 @@ const getControlType = (field) => {
386
456
  }
387
457
  };
388
458
 
389
- const getControlForStringFormat = (format) => {
459
+ const getControlForStringFormat = (format?: string) => {
390
460
  switch (format) {
391
461
  case 'date':
392
462
  return 'date';
@@ -405,7 +475,7 @@ const getControlForStringFormat = (format) => {
405
475
  }
406
476
  };
407
477
 
408
- const getSelectionType = (field) => {
478
+ const getSelectionType = (field: Field) => {
409
479
  if (field.control) {
410
480
  return field.control;
411
481
  }
@@ -422,14 +492,14 @@ const getSelectionType = (field) => {
422
492
  return 'select';
423
493
  };
424
494
 
425
- const copyOf = (object) => JSON.parse(JSON.stringify(object));
495
+ const copyOf = <T>(object: T): T => JSON.parse(JSON.stringify(object)) as T;
426
496
 
427
497
  /**
428
498
  * Some older requirments formats do not include a label for alternatives
429
499
  *
430
500
  * @param tabType
431
501
  */
432
- const getNameFromType = (tabType) => {
502
+ const getNameFromType = (tabType?: string): string => {
433
503
  if (tabType && tabType.length > 0) {
434
504
  const tabNameWithSpaces = tabType.toLowerCase().split('_').join(' '); // String.replace method only replaces first instance
435
505
  return tabNameWithSpaces.charAt(0).toUpperCase() + tabNameWithSpaces.slice(1);