@axinom/mosaic-ui 0.69.0-rc.2 → 0.69.0-rc.21

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 (326) hide show
  1. package/dist/components/Buttons/Button/Button.d.ts +3 -3
  2. package/dist/components/Buttons/Button/Button.d.ts.map +1 -1
  3. package/dist/components/Buttons/Button.model.d.ts +2 -1
  4. package/dist/components/Buttons/Button.model.d.ts.map +1 -1
  5. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -1
  6. package/dist/components/ConfirmDialog/ConfirmDialog.models.d.ts +0 -1
  7. package/dist/components/ConfirmDialog/ConfirmDialog.models.d.ts.map +1 -1
  8. package/dist/components/DateTime/TimePicker/ScrollColumn/ScrollColumn.d.ts +2 -2
  9. package/dist/components/DateTime/TimePicker/ScrollColumn/ScrollColumn.d.ts.map +1 -1
  10. package/dist/components/DynamicDataList/DynamicDataList.d.ts +1 -1
  11. package/dist/components/DynamicDataList/DynamicDataList.d.ts.map +1 -1
  12. package/dist/components/DynamicDataList/DynamicDataList.model.d.ts +0 -1
  13. package/dist/components/DynamicDataList/DynamicDataList.model.d.ts.map +1 -1
  14. package/dist/components/DynamicDataList/DynamicListDataEntry/DynamicListDataEntry.d.ts +2 -2
  15. package/dist/components/DynamicDataList/DynamicListDataEntry/DynamicListDataEntry.d.ts.map +1 -1
  16. package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/createInputRenderer/createInputRenderer.d.ts +1 -1
  17. package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/createInputRenderer/createInputRenderer.d.ts.map +1 -1
  18. package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/createSelectRenderer/createSelectRenderer.d.ts +1 -1
  19. package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/createSelectRenderer/createSelectRenderer.d.ts.map +1 -1
  20. package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/renderers.model.d.ts +2 -0
  21. package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/renderers.model.d.ts.map +1 -1
  22. package/dist/components/DynamicDataList/DynamicListHeader/DynamicListHeader.d.ts +2 -2
  23. package/dist/components/DynamicDataList/DynamicListHeader/DynamicListHeader.d.ts.map +1 -1
  24. package/dist/components/DynamicDataList/DynamicListRow/DynamicListRow.d.ts +2 -2
  25. package/dist/components/DynamicDataList/DynamicListRow/DynamicListRow.d.ts.map +1 -1
  26. package/dist/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.actions.d.ts +2 -2
  27. package/dist/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.actions.d.ts.map +1 -1
  28. package/dist/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.d.ts.map +1 -1
  29. package/dist/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.init.d.ts.map +1 -1
  30. package/dist/components/DynamicDataList/helpers/useColumnDefs.d.ts +1 -1
  31. package/dist/components/DynamicDataList/helpers/useColumnDefs.d.ts.map +1 -1
  32. package/dist/components/DynamicDataList/helpers/useDataHandler.d.ts +1 -1
  33. package/dist/components/DynamicDataList/helpers/useDataHandler.d.ts.map +1 -1
  34. package/dist/components/DynamicDataList/helpers/useRowAnimation.d.ts.map +1 -1
  35. package/dist/components/DynamicDataList/helpers/useRowEditing.d.ts.map +1 -1
  36. package/dist/components/EmptyStation/EmptyStation.d.ts.map +1 -1
  37. package/dist/components/Explorer/BulkEdit/FormFieldsConfigConverter.d.ts.map +1 -1
  38. package/dist/components/Explorer/BulkEdit/GenerateMutation.d.ts.map +1 -1
  39. package/dist/components/Explorer/BulkEdit/helpers/FieldWrapper.d.ts.map +1 -1
  40. package/dist/components/Explorer/BulkEdit/useBulkEdit.d.ts.map +1 -1
  41. package/dist/components/Explorer/Explorer.d.ts +1 -1
  42. package/dist/components/Explorer/Explorer.d.ts.map +1 -1
  43. package/dist/components/Explorer/Explorer.model.d.ts +0 -1
  44. package/dist/components/Explorer/Explorer.model.d.ts.map +1 -1
  45. package/dist/components/Explorer/NavigationExplorer/NavigationExplorer.d.ts +1 -1
  46. package/dist/components/Explorer/NavigationExplorer/NavigationExplorer.d.ts.map +1 -1
  47. package/dist/components/Explorer/QuickEdit/useQuickEdit.d.ts.map +1 -1
  48. package/dist/components/Explorer/SelectionExplorer/SelectionExplorer.d.ts +1 -1
  49. package/dist/components/Explorer/SelectionExplorer/SelectionExplorer.d.ts.map +1 -1
  50. package/dist/components/Explorer/helpers/useActions.d.ts +0 -1
  51. package/dist/components/Explorer/helpers/useActions.d.ts.map +1 -1
  52. package/dist/components/Explorer/helpers/useDataProvider.d.ts +0 -1
  53. package/dist/components/Explorer/helpers/useDataProvider.d.ts.map +1 -1
  54. package/dist/components/Explorer/helpers/useFilters.d.ts +0 -1
  55. package/dist/components/Explorer/helpers/useFilters.d.ts.map +1 -1
  56. package/dist/components/FieldSelection/FieldSelection.d.ts +1 -0
  57. package/dist/components/FieldSelection/FieldSelection.d.ts.map +1 -1
  58. package/dist/components/Filters/Filter/Filter.d.ts +2 -2
  59. package/dist/components/Filters/Filter/Filter.d.ts.map +1 -1
  60. package/dist/components/Filters/Filters.d.ts +2 -2
  61. package/dist/components/Filters/Filters.d.ts.map +1 -1
  62. package/dist/components/Filters/Filters.model.d.ts +0 -1
  63. package/dist/components/Filters/Filters.model.d.ts.map +1 -1
  64. package/dist/components/Filters/Validators/DateRangeFilterValidator.d.ts.map +1 -1
  65. package/dist/components/Filters/Validators/NumberRangeFilterValidator.d.ts.map +1 -1
  66. package/dist/components/FormElements/DynamicDataListControl/DynamicDataListControl.d.ts +0 -1
  67. package/dist/components/FormElements/DynamicDataListControl/DynamicDataListControl.d.ts.map +1 -1
  68. package/dist/components/FormElements/DynamicDataListControl/DynamicDataListField.d.ts +2 -2
  69. package/dist/components/FormElements/DynamicDataListControl/DynamicDataListField.d.ts.map +1 -1
  70. package/dist/components/FormElements/FormGroup/FormGroup.d.ts +12 -0
  71. package/dist/components/FormElements/FormGroup/FormGroup.d.ts.map +1 -0
  72. package/dist/components/FormElements/FormGroupTitle/FormGroupTitle.d.ts +5 -0
  73. package/dist/components/FormElements/FormGroupTitle/FormGroupTitle.d.ts.map +1 -1
  74. package/dist/components/FormElements/FormikDebug/FormikDebug.d.ts +0 -1
  75. package/dist/components/FormElements/FormikDebug/FormikDebug.d.ts.map +1 -1
  76. package/dist/components/FormElements/ReadOnly/ReadOnlyField.d.ts +2 -2
  77. package/dist/components/FormElements/ReadOnly/ReadOnlyField.d.ts.map +1 -1
  78. package/dist/components/FormElements/ReadOnlyText/ReadOnlyTextField.d.ts +2 -2
  79. package/dist/components/FormElements/ReadOnlyText/ReadOnlyTextField.d.ts.map +1 -1
  80. package/dist/components/FormElements/Tags/Tags.d.ts +2 -2
  81. package/dist/components/FormElements/Tags/Tags.d.ts.map +1 -1
  82. package/dist/components/FormElements/Tags/TagsField.d.ts +2 -2
  83. package/dist/components/FormElements/Tags/TagsField.d.ts.map +1 -1
  84. package/dist/components/FormElements/formStoryHelper.d.ts.map +1 -1
  85. package/dist/components/FormElements/index.d.ts +1 -0
  86. package/dist/components/FormElements/index.d.ts.map +1 -1
  87. package/dist/components/FormElements/useFormikError.d.ts.map +1 -1
  88. package/dist/components/FormStation/Create/Create.d.ts +2 -2
  89. package/dist/components/FormStation/Create/Create.d.ts.map +1 -1
  90. package/dist/components/FormStation/Details/Details.d.ts +2 -2
  91. package/dist/components/FormStation/Details/Details.d.ts.map +1 -1
  92. package/dist/components/FormStation/FormStation.d.ts +2 -2
  93. package/dist/components/FormStation/FormStation.d.ts.map +1 -1
  94. package/dist/components/FormStation/FormStationActions/FormStationActions.d.ts +1 -1
  95. package/dist/components/FormStation/FormStationActions/FormStationActions.d.ts.map +1 -1
  96. package/dist/components/FormStation/FormStationHeader/FormStationHeader.d.ts.map +1 -1
  97. package/dist/components/FormStation/SaveOnDemand/SaveOnDemand.d.ts +0 -1
  98. package/dist/components/FormStation/SaveOnDemand/SaveOnDemand.d.ts.map +1 -1
  99. package/dist/components/FormStation/SaveOnNavigate/handleNavigationAttempt.d.ts.map +1 -1
  100. package/dist/components/FormStation/helpers/useTitle.d.ts.map +1 -1
  101. package/dist/components/InfoPanel/hooks/useCollapse.d.ts +0 -1
  102. package/dist/components/InfoPanel/hooks/useCollapse.d.ts.map +1 -1
  103. package/dist/components/InlineMenu/InlineMenu.d.ts.map +1 -1
  104. package/dist/components/List/List.d.ts +2 -2
  105. package/dist/components/List/List.d.ts.map +1 -1
  106. package/dist/components/List/List.model.d.ts +0 -1
  107. package/dist/components/List/List.model.d.ts.map +1 -1
  108. package/dist/components/List/List.stories.helper.d.ts.map +1 -1
  109. package/dist/components/List/ListHeader/ColumnLabel/ColumnLabel.d.ts +2 -2
  110. package/dist/components/List/ListHeader/ColumnLabel/ColumnLabel.d.ts.map +1 -1
  111. package/dist/components/List/ListHeader/ListHeader.d.ts +2 -2
  112. package/dist/components/List/ListHeader/ListHeader.d.ts.map +1 -1
  113. package/dist/components/List/ListRow/ListRow.d.ts +2 -4
  114. package/dist/components/List/ListRow/ListRow.d.ts.map +1 -1
  115. package/dist/components/List/ListRow/ListRowCell/ListRowCell.d.ts +0 -1
  116. package/dist/components/List/ListRow/ListRowCell/ListRowCell.d.ts.map +1 -1
  117. package/dist/components/List/ListRow/ListRowCell/renderData.d.ts.map +1 -1
  118. package/dist/components/List/ListRow/ListRowLoader.d.ts +2 -2
  119. package/dist/components/List/ListRow/ListRowLoader.d.ts.map +1 -1
  120. package/dist/components/List/ListRow/Renderers/BooleanDotRenderer/BooleanDotRenderer.d.ts +0 -1
  121. package/dist/components/List/ListRow/Renderers/BooleanDotRenderer/BooleanDotRenderer.d.ts.map +1 -1
  122. package/dist/components/List/ListRow/Renderers/DateRenderer/DateRenderer.d.ts.map +1 -1
  123. package/dist/components/List/ListRow/Renderers/ExternalLinkRenderer/ExternalLinkRenderer.d.ts.map +1 -1
  124. package/dist/components/List/ListRow/Renderers/StateRenderer/StateRenderer.d.ts +1 -1
  125. package/dist/components/List/ListRow/Renderers/StateRenderer/StateRenderer.d.ts.map +1 -1
  126. package/dist/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.d.ts +0 -1
  127. package/dist/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.d.ts.map +1 -1
  128. package/dist/components/List/ListRow/Renderers/TimestampRenderer/TimestampRenderer.d.ts.map +1 -1
  129. package/dist/components/List/ListRowRenderer/ListRowRenderer.d.ts.map +1 -1
  130. package/dist/components/List/helpers.d.ts.map +1 -1
  131. package/dist/components/List/useColumnsSize.d.ts +0 -2
  132. package/dist/components/List/useColumnsSize.d.ts.map +1 -1
  133. package/dist/components/Loaders/skeletons.d.ts +0 -1
  134. package/dist/components/Loaders/skeletons.d.ts.map +1 -1
  135. package/dist/components/Modal/useModal.d.ts.map +1 -1
  136. package/dist/components/PageHeader/PageHeaderActionsGroup/PageHeaderActionsGroupsContext.d.ts +0 -1
  137. package/dist/components/PageHeader/PageHeaderActionsGroup/PageHeaderActionsGroupsContext.d.ts.map +1 -1
  138. package/dist/components/PageHeader/helpers/useElementWidthObserver.d.ts +1 -2
  139. package/dist/components/PageHeader/helpers/useElementWidthObserver.d.ts.map +1 -1
  140. package/dist/components/Tabs/TabList/ScrollContainer/useScroll.d.ts.map +1 -1
  141. package/dist/components/Utils/Postgraphile/FilterTransformer.d.ts.map +1 -1
  142. package/dist/components/Utils/Postgraphile/SortTransformer.d.ts.map +1 -1
  143. package/dist/components/Utils/State/GlobalState.d.ts.map +1 -1
  144. package/dist/helpers/idleCallbackHelpers.d.ts +0 -1
  145. package/dist/helpers/idleCallbackHelpers.d.ts.map +1 -1
  146. package/dist/helpers/storybook.d.ts.map +1 -1
  147. package/dist/helpers/testing.d.ts +6 -21
  148. package/dist/helpers/testing.d.ts.map +1 -1
  149. package/dist/helpers/utils.d.ts +1 -2
  150. package/dist/helpers/utils.d.ts.map +1 -1
  151. package/dist/hooks/useDEBUGDetectChanges/useDEBUGDetectChanges.d.ts.map +1 -1
  152. package/dist/hooks/useDEBUGRenderCount/useDEBUGRenderCount.d.ts.map +1 -1
  153. package/dist/hooks/useDebounce/useDebounce.d.ts +1 -2
  154. package/dist/hooks/useDebounce/useDebounce.d.ts.map +1 -1
  155. package/dist/hooks/useExpand/useExpand.d.ts.map +1 -1
  156. package/dist/hooks/useReactRouterPause/utils.d.ts.map +1 -1
  157. package/dist/hooks/useResize/useResize.d.ts +0 -1
  158. package/dist/hooks/useResize/useResize.d.ts.map +1 -1
  159. package/dist/hooks/useTabTitle/useTabTitle.d.ts.map +1 -1
  160. package/dist/hooks/useValueOrOnDemand/useValueOrOnDemand.d.ts +1 -1
  161. package/dist/hooks/useValueOrOnDemand/useValueOrOnDemand.d.ts.map +1 -1
  162. package/dist/index.es.js +4 -4
  163. package/dist/index.es.js.map +1 -1
  164. package/dist/index.js +4 -4
  165. package/dist/index.js.map +1 -1
  166. package/dist/utils/ErrorMapper/ErrorMapper.d.ts.map +1 -1
  167. package/dist/utils/ErrorTypeToStationError.d.ts.map +1 -1
  168. package/dist/utils/ToolTipHelpers.d.ts.map +1 -1
  169. package/dist/validators/timestamp/timestamp.d.ts.map +1 -1
  170. package/package.json +11 -10
  171. package/src/components/Accordion/Accordion.spec.tsx +1 -1
  172. package/src/components/Accordion/AccordionItem/AccordionItem.spec.tsx +2 -2
  173. package/src/components/Actions/Action/Action.spec.tsx +189 -228
  174. package/src/components/Actions/Actions.spec.tsx +42 -32
  175. package/src/components/Buttons/Button/Button.spec.tsx +110 -115
  176. package/src/components/Buttons/Button/Button.tsx +4 -0
  177. package/src/components/Buttons/Button.model.ts +2 -0
  178. package/src/components/Buttons/CompositeButton/CompositeButton.spec.tsx +122 -121
  179. package/src/components/Buttons/TextButton/TextButton.spec.tsx +85 -90
  180. package/src/components/ConfirmDialog/ConfirmDialog.spec.tsx +75 -79
  181. package/src/components/DateTime/DatePicker/DatePicker.spec.tsx +8 -7
  182. package/src/components/DateTime/DateTimePicker.spec.tsx +43 -62
  183. package/src/components/DateTime/TimePicker/ScrollColumn/ScrollColumn.spec.tsx +19 -16
  184. package/src/components/DateTime/TimePicker/TimePicker.spec.tsx +44 -73
  185. package/src/components/DynamicDataList/DynamicDataList.spec.tsx +112 -107
  186. package/src/components/DynamicDataList/DynamicListDataEntry/DynamicListDataEntry.spec.tsx +91 -144
  187. package/src/components/DynamicDataList/DynamicListDataEntry/DynamicListDataEntry.tsx +38 -20
  188. package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/createInputRenderer/createInputRenderer.spec.tsx +18 -15
  189. package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/createInputRenderer/createInputRenderer.tsx +2 -0
  190. package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/createSelectRenderer/createSelectRenderer.spec.tsx +53 -28
  191. package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/createSelectRenderer/createSelectRenderer.tsx +2 -0
  192. package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/renderers.model.ts +2 -0
  193. package/src/components/DynamicDataList/DynamicListHeader/DynamicListHeader.scss +19 -5
  194. package/src/components/DynamicDataList/DynamicListHeader/DynamicListHeader.spec.tsx +72 -76
  195. package/src/components/DynamicDataList/DynamicListRow/DynamicListRow.scss +9 -2
  196. package/src/components/DynamicDataList/DynamicListRow/DynamicListRow.spec.tsx +86 -113
  197. package/src/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.actions.spec.ts +1 -0
  198. package/src/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.init.spec.ts +1 -0
  199. package/src/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.spec.ts +6 -5
  200. package/src/components/EmptyStation/EmptyStation.spec.tsx +41 -37
  201. package/src/components/Explorer/BulkEdit/FormFieldsConfigConverter.spec.tsx +29 -28
  202. package/src/components/Explorer/BulkEdit/FormFieldsConfigConverter.tsx +1 -0
  203. package/src/components/Explorer/BulkEdit/GenerateMutation.spec.tsx +1 -0
  204. package/src/components/Explorer/BulkEdit/helpers/FieldWrapper.scss +1 -0
  205. package/src/components/Explorer/BulkEdit/helpers/FieldWrapper.tsx +1 -0
  206. package/src/components/Explorer/Explorer.spec.tsx +513 -825
  207. package/src/components/Explorer/NavigationExplorer/NavigationExplorer.spec.tsx +90 -131
  208. package/src/components/Explorer/QuickEdit/useQuickEdit.spec.tsx +36 -56
  209. package/src/components/Explorer/SelectionExplorer/SelectionExplorer.spec.tsx +59 -65
  210. package/src/components/Explorer/helpers/InMemoryDataProvider.spec.ts +1 -0
  211. package/src/components/Explorer/helpers/useFilters.spec.tsx +13 -11
  212. package/src/components/Explorer/helpers/useStationMessage.spec.tsx +4 -3
  213. package/src/components/Explorer/helpers/useSubtitle.spec.tsx +1 -0
  214. package/src/components/FieldSelection/FieldSelection.scss +1 -1
  215. package/src/components/FieldSelection/FieldSelection.spec.tsx +1 -1
  216. package/src/components/FieldSelection/FieldSelection.tsx +6 -2
  217. package/src/components/Filters/Filter/Filter.spec.tsx +78 -47
  218. package/src/components/Filters/Filters.spec.tsx +56 -58
  219. package/src/components/Filters/SelectionTypes/DateTimeFilter/DateTimeFilter.spec.tsx +45 -46
  220. package/src/components/Filters/SelectionTypes/FreeTextFilter/FreeTextFilter.spec.tsx +23 -23
  221. package/src/components/Filters/SelectionTypes/NumericTextFilter/NumericTextFilter.spec.tsx +37 -28
  222. package/src/components/Filters/SelectionTypes/OptionsFilter/OptionsFilter.spec.tsx +14 -12
  223. package/src/components/Filters/Validators/DateRangeFilterValidator.spec.ts +1 -0
  224. package/src/components/Filters/Validators/NumberRangeFilterValidator.spec.ts +1 -0
  225. package/src/components/FormElements/BooleanView/BooleanViewField.spec.tsx +34 -31
  226. package/src/components/FormElements/Checkbox/Checkbox.spec.tsx +129 -128
  227. package/src/components/FormElements/CustomTags/CustomTags.spec.tsx +312 -446
  228. package/src/components/FormElements/DateTimeField/DateTimeText.spec.tsx +61 -52
  229. package/src/components/FormElements/DynamicDataListControl/DynamicDataListControl.spec.tsx +19 -24
  230. package/src/components/FormElements/FileUploadControl/FileUploadControl.spec.tsx +67 -60
  231. package/src/components/FormElements/FormElementContainer/FormElementContainer.spec.tsx +13 -12
  232. package/src/components/FormElements/FormGroup/FormGroup.scss +62 -0
  233. package/src/components/FormElements/FormGroup/FormGroup.stories.tsx +25 -0
  234. package/src/components/FormElements/FormGroup/FormGroup.tsx +60 -0
  235. package/src/components/FormElements/FormGroupTitle/FormGroupTitle.tsx +5 -0
  236. package/src/components/FormElements/Link/LinkField.spec.tsx +24 -23
  237. package/src/components/FormElements/MaskedSingleLineText/MaskedSingleLineText.spec.tsx +4 -3
  238. package/src/components/FormElements/Radio/Radio.spec.tsx +170 -172
  239. package/src/components/FormElements/ReadOnly/ReadOnlyField.spec.tsx +23 -22
  240. package/src/components/FormElements/ReadOnlyText/ReadOnlyTextField.spec.tsx +23 -22
  241. package/src/components/FormElements/Select/Select.spec.tsx +30 -29
  242. package/src/components/FormElements/SingleLineText/SingleLineText.spec.tsx +46 -42
  243. package/src/components/FormElements/Tags/Tags.spec.tsx +59 -53
  244. package/src/components/FormElements/TextArea/TextArea.spec.tsx +44 -29
  245. package/src/components/FormElements/ToggleButton/ToggleButton.spec.tsx +188 -165
  246. package/src/components/FormElements/index.ts +1 -0
  247. package/src/components/FormStation/FormStation.spec.tsx +273 -198
  248. package/src/components/FormStation/FormStation.stories.tsx +15 -13
  249. package/src/components/FormStation/FormStationHeader/FormStationHeader.tsx +5 -3
  250. package/src/components/FormStation/SaveOnNavigate/SaveOnNavigate.spec.tsx +23 -20
  251. package/src/components/FormStation/SaveOnNavigate/handleNavigationAttempt.spec.ts +25 -24
  252. package/src/components/FormStation/helpers/useTitle.spec.ts +9 -7
  253. package/src/components/Hub/Hub.spec.tsx +13 -10
  254. package/src/components/Hub/Tile/Tile.spec.tsx +29 -25
  255. package/src/components/Icons/Icons.spec.tsx +25 -27
  256. package/src/components/Icons/Icons.tsx +1 -1
  257. package/src/components/InfoPanel/InfoImage/InfoImage.spec.tsx +4 -3
  258. package/src/components/InfoPanel/InfoPanel.scss +2 -0
  259. package/src/components/InfoPanel/InfoPanel.spec.tsx +4 -3
  260. package/src/components/InfoPanel/Paragraph/Paragraph.spec.tsx +4 -3
  261. package/src/components/InfoPanel/Section/Section.spec.tsx +39 -46
  262. package/src/components/InfoPanel/hooks/useCollapse.ts +9 -7
  263. package/src/components/InlineMenu/InlineMenu.spec.tsx +24 -23
  264. package/src/components/InlineMenu/InlineMenu.tsx +3 -0
  265. package/src/components/LandingPageHeader/LandingPageHeader.spec.tsx +9 -8
  266. package/src/components/LandingPageTiles/LandingPageTiles.spec.tsx +29 -28
  267. package/src/components/LandingPageTiles/TileLarge/TileLarge.spec.tsx +68 -61
  268. package/src/components/LandingPageTiles/TileSmall/TileSmall.spec.tsx +50 -32
  269. package/src/components/List/List.spec.tsx +337 -241
  270. package/src/components/List/ListCheckBox/ListCheckBox.spec.tsx +54 -48
  271. package/src/components/List/ListHeader/ColumnLabel/ColumnLabel.scss +4 -1
  272. package/src/components/List/ListHeader/ColumnLabel/ColumnLabel.spec.tsx +46 -43
  273. package/src/components/List/ListHeader/ListHeader.spec.tsx +82 -66
  274. package/src/components/List/ListRow/ListRow.spec.tsx +125 -130
  275. package/src/components/List/ListRow/ListRowCell/ListRowCell.spec.tsx +57 -100
  276. package/src/components/List/ListRow/ListRowLoader.spec.tsx +16 -12
  277. package/src/components/List/ListRow/Renderers/BooleanDotRenderer/BooleanDotRenderer.spec.tsx +12 -9
  278. package/src/components/List/ListRow/Renderers/ExternalLinkRenderer/ExternalLinkRenderer.spec.tsx +40 -35
  279. package/src/components/List/ListRow/Renderers/StateRenderer/StateRenderer.spec.tsx +14 -17
  280. package/src/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.spec.tsx +18 -17
  281. package/src/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.tsx +2 -2
  282. package/src/components/List/ListRowRenderer/ListRowRenderer.spec.tsx +82 -68
  283. package/src/components/Loaders/ImageLoader/ImageLoader.spec.tsx +88 -96
  284. package/src/components/Loaders/Loader/Loader.spec.tsx +51 -24
  285. package/src/components/Message/Message.spec.tsx +56 -44
  286. package/src/components/MessageBar/MessageBar.scss +3 -0
  287. package/src/components/MessageBar/MessageBar.spec.tsx +88 -85
  288. package/src/components/Modal/Modal.spec.tsx +92 -87
  289. package/src/components/NavigationAwareStation/NavigationAwareStation.spec.tsx +23 -22
  290. package/src/components/PageHeader/PageHeader.spec.tsx +22 -21
  291. package/src/components/PageHeader/PageHeaderAction/PageHeaderAction.spec.tsx +275 -193
  292. package/src/components/PageHeader/PageHeaderActionsGroup/PageHeaderActionsGroup.spec.tsx +39 -34
  293. package/src/components/ProgressBar/ProgressBar.spec.tsx +18 -15
  294. package/src/components/Utils/Postgraphile/CreateConnectionRenderer.spec.ts +1 -0
  295. package/src/components/Utils/Postgraphile/FilterTransformer.spec.ts +1 -0
  296. package/src/components/Utils/Postgraphile/RangeTransformer.spec.ts +1 -0
  297. package/src/components/Utils/Postgraphile/SortTransformer.spec.ts +1 -0
  298. package/src/components/Utils/Postgraphile/UpdateGQLFragmentGenerator.spec.ts +1 -0
  299. package/src/components/Utils/Postgraphile/generateArrayMutations.spec.ts +1 -0
  300. package/src/components/Utils/Postgraphile/getArrayDiff.spec.ts +1 -0
  301. package/src/components/Utils/Postgraphile/getFormDiff.spec.ts +1 -0
  302. package/src/components/Utils/State/GlobalState.spec.ts +4 -2
  303. package/src/components/Utils/Transformers/Boolean.spec.ts +1 -0
  304. package/src/components/Utils/Transformers/DateTime.spec.ts +2 -1
  305. package/src/components/Utils/Transformers/FileSize.spec.ts +1 -0
  306. package/src/components/Utils/Transformers/SortArray.spec.ts +1 -0
  307. package/src/components/Utils/Transformers/Timestamp.spec.ts +3 -2
  308. package/src/components/Utils/Transformers/TitleCase.spec.ts +1 -0
  309. package/src/components/VisualElements/ImgElement.spec.tsx +34 -35
  310. package/src/components/VisualElements/SvgElement.spec.tsx +72 -69
  311. package/src/helpers/testing.ts +9 -76
  312. package/src/hooks/useBusy/useBusy.spec.tsx +8 -9
  313. package/src/hooks/useClickOutside/useClickOutside.spec.tsx +19 -51
  314. package/src/hooks/useDebounce/useDebounce.spec.tsx +31 -26
  315. package/src/hooks/useExpand/useExpand.spec.tsx +30 -21
  316. package/src/hooks/useTabTitle/useTabTitle.spec.tsx +18 -18
  317. package/src/hooks/useValueOrOnDemand/useValueOrOnDemand.spec.tsx +31 -52
  318. package/src/styles/variables.scss +3 -1
  319. package/src/utils/ErrorMapper/ApolloClient/ApolloErrorMapper.spec.ts +1 -0
  320. package/src/utils/ErrorMapper/ErrorMapper.spec.ts +1 -0
  321. package/src/utils/ErrorTypeToStationError.spec.tsx +12 -11
  322. package/src/utils/ToolTipHelpers.spec.ts +1 -0
  323. package/src/validators/timestamp/timestamp.spec.ts +1 -0
  324. package/dist/helpers/hooksTestingHelpers.d.ts +0 -7
  325. package/dist/helpers/hooksTestingHelpers.d.ts.map +0 -1
  326. package/src/helpers/hooksTestingHelpers.tsx +0 -22
@@ -1,24 +1,22 @@
1
- import { mount, shallow } from 'enzyme';
1
+ import { fireEvent, render, waitFor } from '@testing-library/react';
2
2
  import { useFormikContext } from 'formik';
3
3
  import React, { useEffect } from 'react';
4
4
  import { act } from 'react-dom/test-utils';
5
5
  import { MemoryRouter, Route } from 'react-router-dom';
6
+ import type { Mock } from 'vitest';
7
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
6
8
  import * as Yup from 'yup';
7
9
  import { noop } from '../../helpers/utils';
8
10
  import { initializeUi } from '../../initialize';
9
- import { ActionData, Actions } from '../Actions';
10
- import { Action } from '../Actions/Action';
11
- import { MessageBar } from '../MessageBar/MessageBar';
12
- import { PageHeader, PageHeaderAction } from '../PageHeader';
11
+ import { ActionData } from '../Actions';
13
12
  import { FormStation } from './FormStation';
14
13
  import { ObjectSchemaDefinition } from './FormStation.models';
15
- import { SaveOnNavigate } from './SaveOnNavigate/SaveOnNavigate';
16
14
 
17
- jest.mock('../../initialize');
15
+ vi.mock('../../initialize');
18
16
 
19
17
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
20
18
 
21
- const mockActions = (onActionSelected: jest.Mock): ActionData[] => [
19
+ const mockActions = (onActionSelected: Mock): ActionData[] => [
22
20
  {
23
21
  label: 'Action One',
24
22
  onActionSelected: onActionSelected,
@@ -31,8 +29,8 @@ const defaultProps = {
31
29
  };
32
30
 
33
31
  // Temporarily disable console.log() from FormStation until proper error handling
34
- // jest.spyOn(console, 'log').mockImplementation(() => null);
35
- jest.spyOn(console, 'error').mockImplementation(() => null);
32
+ // vi.spyOn(console, 'log').mockImplementation(() => null);
33
+ vi.spyOn(console, 'error').mockImplementation(() => null);
36
34
 
37
35
  const MakeDirty: React.FC = () => {
38
36
  const context = useFormikContext();
@@ -45,14 +43,12 @@ const MakeDirty: React.FC = () => {
45
43
  };
46
44
 
47
45
  describe('Details', () => {
48
- global.ResizeObserver = jest.fn().mockImplementation(() => ({
49
- observe: jest.fn(),
50
- unobserve: jest.fn(),
51
- disconnect: jest.fn(),
52
- }));
46
+ global.ResizeObserver = vi.fn().mockImplementation(function () {
47
+ return { observe: vi.fn(), unobserve: vi.fn(), disconnect: vi.fn() };
48
+ }) as unknown as typeof ResizeObserver;
53
49
 
54
50
  beforeEach(() => {
55
- jest.clearAllMocks();
51
+ vi.clearAllMocks();
56
52
 
57
53
  initializeUi({
58
54
  showNotification: () => {
@@ -70,74 +66,105 @@ describe('Details', () => {
70
66
  });
71
67
 
72
68
  it('renders the component without crashing', () => {
73
- const wrapper = shallow(<FormStation {...defaultProps} />);
69
+ const { container } = render(<FormStation {...defaultProps} />);
74
70
 
75
- expect(wrapper).toBeTruthy();
71
+ expect(container).toBeTruthy();
76
72
  });
77
73
 
78
74
  describe('Actions', () => {
79
75
  it('hides actions by default', () => {
80
- const wrapper = mount(
76
+ const { container } = render(
81
77
  <MemoryRouter>
82
78
  <FormStation {...defaultProps} />
83
79
  </MemoryRouter>,
84
80
  );
85
81
 
86
- const actions = wrapper.find(Actions);
82
+ const actionsPanel = container.querySelector('[data-test-id="actions"]');
87
83
 
88
- expect(actions.exists()).toBe(false);
84
+ expect(actionsPanel).not.toBeInTheDocument();
89
85
  });
90
86
 
91
- it.each([
92
- [true, true],
93
- [false, false],
94
- [undefined, false],
95
- ])('alwaysShowActionsPanel working correctly', (value, isVisible) => {
96
- const wrapper = mount(
87
+ it('shows actions panel when alwaysShowActionsPanel is true', () => {
88
+ const { container } = render(
97
89
  <MemoryRouter>
98
- <FormStation {...defaultProps} alwaysShowActionsPanel={value} />,
90
+ <FormStation {...defaultProps} alwaysShowActionsPanel={true} />,
99
91
  </MemoryRouter>,
100
92
  );
101
93
 
102
- const actions = wrapper.find(Actions);
94
+ const actionsPanel = container.querySelector('[data-test-id="actions"]');
103
95
 
104
- expect(actions.exists()).toBe(isVisible);
96
+ expect(actionsPanel).toBeInTheDocument();
97
+ });
98
+
99
+ it('does not show actions panel when alwaysShowActionsPanel is false', () => {
100
+ const { container } = render(
101
+ <MemoryRouter>
102
+ <FormStation {...defaultProps} alwaysShowActionsPanel={false} />,
103
+ </MemoryRouter>,
104
+ );
105
+
106
+ const actionsPanel = container.querySelector('[data-test-id="actions"]');
107
+
108
+ expect(actionsPanel).not.toBeInTheDocument();
109
+ });
110
+
111
+ it('does not show actions panel when alwaysShowActionsPanel is undefined', () => {
112
+ const { container } = render(
113
+ <MemoryRouter>
114
+ <FormStation {...defaultProps} alwaysShowActionsPanel={undefined} />,
115
+ </MemoryRouter>,
116
+ );
117
+
118
+ const actionsPanel = container.querySelector('[data-test-id="actions"]');
119
+
120
+ expect(actionsPanel).not.toBeInTheDocument();
105
121
  });
106
122
 
107
123
  it('always shows Actions when at least one action is passed into prop "actions"', () => {
108
- const sampleActions = mockActions(jest.fn());
109
- const wrapper = mount(
124
+ const sampleActions = mockActions(vi.fn());
125
+ const { container } = render(
110
126
  <MemoryRouter>
111
127
  <FormStation {...defaultProps} actions={sampleActions} />
112
128
  </MemoryRouter>,
113
129
  );
114
- const actions = wrapper.find(Actions);
130
+ const actions = container.querySelector('.actions');
115
131
 
116
- expect(actions.exists()).toBe(true);
132
+ expect(actions).toBeInTheDocument();
117
133
  });
118
134
 
119
135
  describe('raising logic', () => {
120
136
  it('raises the action selected event if form is valid', async () => {
121
- const spy = jest.fn();
137
+ const spy = vi.fn();
122
138
  const sampleActions = mockActions(spy);
123
- const wrapper = mount(
139
+ const { container } = render(
124
140
  <MemoryRouter>
125
141
  <FormStation {...defaultProps} actions={sampleActions} />
126
142
  </MemoryRouter>,
127
143
  );
128
144
 
129
- const actionSelected = wrapper
130
- .find(Action)
131
- .prop('action').onActionSelected;
145
+ await waitFor(() => {
146
+ const actionsPanel = container.querySelector(
147
+ '[data-test-id="actions"]',
148
+ );
149
+ expect(actionsPanel).toBeInTheDocument();
150
+ });
151
+
152
+ const actionsPanel = container.querySelector(
153
+ '[data-test-id="actions"]',
154
+ );
155
+ const actionButton = actionsPanel?.querySelector(
156
+ '[data-test-id="action"]',
157
+ ) as HTMLElement;
158
+
132
159
  await act(async () => {
133
- actionSelected && actionSelected();
160
+ fireEvent.click(actionButton);
134
161
  });
135
162
 
136
163
  expect(spy).toHaveBeenCalledTimes(1);
137
164
  });
138
165
 
139
166
  it("doesn't raise the action selected event if the form is invalid", async () => {
140
- const spy = jest.fn();
167
+ const spy = vi.fn();
141
168
  const sampleActions = mockActions(spy);
142
169
  const ForceValidation: React.FC = () => {
143
170
  const context = useFormikContext();
@@ -148,7 +175,7 @@ describe('Details', () => {
148
175
  return null;
149
176
  };
150
177
 
151
- const wrapper = mount(
178
+ const { container } = render(
152
179
  <MemoryRouter>
153
180
  <FormStation
154
181
  {...defaultProps}
@@ -165,27 +192,35 @@ describe('Details', () => {
165
192
  );
166
193
 
167
194
  await act(async () => {
168
- wrapper.update();
195
+ // Wait for validation
196
+ await new Promise((resolve) => setTimeout(resolve, 0));
169
197
  });
170
198
 
171
- await act(async () => {
172
- wrapper.update();
199
+ await waitFor(() => {
200
+ const actionsPanel = container.querySelector(
201
+ '[data-test-id="actions"]',
202
+ );
203
+ expect(actionsPanel).toBeInTheDocument();
173
204
  });
174
205
 
175
- const actionSelected = wrapper
176
- .find(Action)
177
- .prop('action').onActionSelected;
206
+ const actionsPanel = container.querySelector(
207
+ '[data-test-id="actions"]',
208
+ );
209
+ const actionButton = actionsPanel?.querySelector(
210
+ '[data-test-id="action"]',
211
+ ) as HTMLElement;
212
+
178
213
  await act(async () => {
179
- actionSelected && actionSelected();
214
+ fireEvent.click(actionButton);
180
215
  });
181
216
 
182
217
  expect(spy).not.toHaveBeenCalled();
183
218
  });
184
219
 
185
220
  it('does not raise the action selected event if saveData throws', async () => {
186
- const spy = jest.fn();
221
+ const spy = vi.fn();
187
222
  const sampleActions = mockActions(spy);
188
- const wrapper = mount(
223
+ const { container } = render(
189
224
  <MemoryRouter>
190
225
  <FormStation
191
226
  {...defaultProps}
@@ -200,21 +235,32 @@ describe('Details', () => {
200
235
  </MemoryRouter>,
201
236
  );
202
237
 
203
- const actionSelected = wrapper
204
- .find(Action)
205
- .prop('action').onActionSelected;
238
+ await waitFor(() => {
239
+ const actionsPanel = container.querySelector(
240
+ '[data-test-id="actions"]',
241
+ );
242
+ expect(actionsPanel).toBeInTheDocument();
243
+ });
244
+
245
+ const actionsPanel = container.querySelector(
246
+ '[data-test-id="actions"]',
247
+ );
248
+ const actionButton = actionsPanel?.querySelector(
249
+ '[data-test-id="action"]',
250
+ ) as HTMLElement;
251
+
206
252
  await act(async () => {
207
- actionSelected && actionSelected();
253
+ fireEvent.click(actionButton);
208
254
  });
209
255
 
210
256
  expect(spy).not.toHaveBeenCalled();
211
257
  });
212
258
 
213
259
  it('does not attempt to save and call the action directly when form untouched', async () => {
214
- const spy = jest.fn();
260
+ const spy = vi.fn();
215
261
  const sampleActions = mockActions(spy);
216
- const saveSpy = jest.fn();
217
- const wrapper = mount(
262
+ const saveSpy = vi.fn();
263
+ const { container } = render(
218
264
  <MemoryRouter>
219
265
  <FormStation
220
266
  {...defaultProps}
@@ -225,11 +271,19 @@ describe('Details', () => {
225
271
  </MemoryRouter>,
226
272
  );
227
273
 
228
- const actionSelected = wrapper
229
- .find(Action)
230
- .prop('action').onActionSelected;
274
+ let actionButton: HTMLElement | null = null;
275
+ await waitFor(() => {
276
+ const actionsPanel = container.querySelector(
277
+ '[data-test-id="actions"]',
278
+ );
279
+ actionButton = actionsPanel?.querySelector(
280
+ '[data-test-id="action"]',
281
+ ) as HTMLElement;
282
+ expect(actionButton).toBeInTheDocument();
283
+ });
284
+
231
285
  await act(async () => {
232
- actionSelected && actionSelected();
286
+ fireEvent.click(actionButton!);
233
287
  });
234
288
 
235
289
  expect(saveSpy).not.toHaveBeenCalled();
@@ -240,7 +294,7 @@ describe('Details', () => {
240
294
 
241
295
  describe('Header', () => {
242
296
  it('uses titleProperty as preferred header', () => {
243
- const wrapper = mount(
297
+ const { container } = render(
244
298
  <MemoryRouter>
245
299
  <FormStation
246
300
  {...defaultProps}
@@ -254,12 +308,14 @@ describe('Details', () => {
254
308
  </MemoryRouter>,
255
309
  );
256
310
 
257
- const header = wrapper.find(PageHeader);
258
- expect(header.prop('title')).toBe('Test title');
311
+ const header = container.querySelector(
312
+ '[data-test-id="page-header-title"]',
313
+ );
314
+ expect(header?.textContent).toContain('Test title');
259
315
  });
260
316
 
261
317
  it('uses defaultTitle as fallback', () => {
262
- const wrapper = mount(
318
+ const { container } = render(
263
319
  <MemoryRouter>
264
320
  <FormStation
265
321
  {...defaultProps}
@@ -276,8 +332,10 @@ describe('Details', () => {
276
332
  </MemoryRouter>,
277
333
  );
278
334
 
279
- const header = wrapper.find(PageHeader);
280
- expect(header.prop('title')).toBe('default');
335
+ const header = container.querySelector(
336
+ '[data-test-id="page-header-title"]',
337
+ );
338
+ expect(header?.textContent).toContain('default');
281
339
  });
282
340
 
283
341
  describe('Reset Save and Cancel operations', () => {
@@ -301,7 +359,7 @@ describe('Details', () => {
301
359
  return null;
302
360
  };
303
361
 
304
- const wrapper = mount(
362
+ const { container } = render(
305
363
  <MemoryRouter>
306
364
  <FormStation
307
365
  {...defaultProps}
@@ -314,13 +372,15 @@ describe('Details', () => {
314
372
  );
315
373
 
316
374
  await act(async () => {
317
- wrapper.update();
375
+ await new Promise((resolve) => setTimeout(resolve, 0));
318
376
  });
319
377
 
320
- const headerActions = wrapper.find(PageHeaderAction);
378
+ const headerActions = container.querySelectorAll(
379
+ '[data-test-id="page-header-actions"] [data-test-id="action"]',
380
+ );
321
381
  expect(headerActions).toHaveLength(2);
322
382
 
323
- headerActions.at(0).simulate('click');
383
+ fireEvent.click(headerActions[0]);
324
384
 
325
385
  expect(value).toBe('initial');
326
386
  });
@@ -328,7 +388,7 @@ describe('Details', () => {
328
388
  it('allows saving of a dirty form', async () => {
329
389
  let path: string;
330
390
 
331
- const wrapper = mount(
391
+ const { container } = render(
332
392
  <MemoryRouter>
333
393
  <FormStation
334
394
  {...defaultProps}
@@ -346,16 +406,18 @@ describe('Details', () => {
346
406
  </MemoryRouter>,
347
407
  );
348
408
  await act(async () => {
349
- wrapper.update();
409
+ await new Promise((resolve) => setTimeout(resolve, 0));
350
410
  });
351
411
 
352
- const headerActions = wrapper.find(PageHeaderAction);
412
+ const headerActions = container.querySelectorAll(
413
+ '[data-test-id="page-header-actions"] [data-test-id="action"]',
414
+ );
353
415
  expect(headerActions).toHaveLength(2);
354
416
 
355
- headerActions.at(1).simulate('click');
417
+ fireEvent.click(headerActions[1]);
356
418
 
357
419
  await act(async () => {
358
- wrapper.update();
420
+ await new Promise((resolve) => setTimeout(resolve, 0));
359
421
  });
360
422
 
361
423
  expect(path!).toBe('/');
@@ -364,7 +426,7 @@ describe('Details', () => {
364
426
  it('allows cancellation if wanted', async () => {
365
427
  let path: string;
366
428
 
367
- const wrapper = mount(
429
+ const { container } = render(
368
430
  <MemoryRouter>
369
431
  <FormStation
370
432
  {...defaultProps}
@@ -388,16 +450,18 @@ describe('Details', () => {
388
450
  );
389
451
 
390
452
  await act(async () => {
391
- wrapper.update();
453
+ await new Promise((resolve) => setTimeout(resolve, 0));
392
454
  });
393
455
 
394
- const headerActions = wrapper.find(PageHeaderAction);
456
+ const headerActions = container.querySelectorAll(
457
+ '[data-test-id="page-header-actions"] [data-test-id="action"]',
458
+ );
395
459
  expect(headerActions).toHaveLength(3);
396
460
 
397
- headerActions.at(2).simulate('click');
461
+ fireEvent.click(headerActions[2]);
398
462
 
399
463
  await act(async () => {
400
- wrapper.update();
464
+ await new Promise((resolve) => setTimeout(resolve, 0));
401
465
  });
402
466
 
403
467
  expect(path!).toBe('/home');
@@ -407,15 +471,17 @@ describe('Details', () => {
407
471
 
408
472
  describe('station message', () => {
409
473
  it('station message is not rendered by default', () => {
410
- const wrapper = shallow(<FormStation {...defaultProps} />);
474
+ const { container } = render(<FormStation {...defaultProps} />);
411
475
 
412
- const messageBar = wrapper.find(MessageBar);
476
+ const messageBar = container.querySelector(
477
+ '[data-test-id="message-bar"]',
478
+ );
413
479
 
414
- expect(messageBar.exists()).toBe(false);
480
+ expect(messageBar).not.toBeInTheDocument();
415
481
  });
416
482
 
417
483
  it('renders a MessageBar component if stationMessage is set', () => {
418
- const wrapper = mount(
484
+ const { container } = render(
419
485
  <MemoryRouter>
420
486
  <FormStation
421
487
  {...defaultProps}
@@ -428,14 +494,16 @@ describe('Details', () => {
428
494
  </MemoryRouter>,
429
495
  );
430
496
 
431
- const messageBar = wrapper.find(MessageBar);
497
+ const messageBar = container.querySelector(
498
+ '[data-test-id="message-bar"]',
499
+ );
432
500
 
433
- expect(messageBar.exists()).toBe(true);
501
+ expect(messageBar).toBeInTheDocument();
434
502
  });
435
503
 
436
504
  it(`raises MessageBar's 'onClose' callback`, () => {
437
- const spy = jest.fn();
438
- const wrapper = mount(
505
+ const spy = vi.fn();
506
+ const { container } = render(
439
507
  <MemoryRouter>
440
508
  <FormStation
441
509
  {...defaultProps}
@@ -452,9 +520,11 @@ describe('Details', () => {
452
520
  </MemoryRouter>,
453
521
  );
454
522
 
455
- const messageBar = wrapper.find(MessageBar);
523
+ const closeButton = container.querySelector(
524
+ '[data-test-id="message-bar-close-button"]',
525
+ ) as HTMLButtonElement;
456
526
 
457
- messageBar.prop('onClose')!();
527
+ fireEvent.click(closeButton);
458
528
 
459
529
  expect(spy).toHaveBeenCalledTimes(1);
460
530
  });
@@ -463,10 +533,10 @@ describe('Details', () => {
463
533
  describe('station error', () => {
464
534
  it(`displays an error message when submitting throws an error and closes the message when 'X' is clicked`, async () => {
465
535
  const formError = new Error('Error on saving, not executing action');
466
- const spy = jest.fn();
536
+ const spy = vi.fn();
467
537
  const sampleActions = mockActions(spy);
468
538
 
469
- const wrapper = mount(
539
+ const { container } = render(
470
540
  <MemoryRouter>
471
541
  <FormStation
472
542
  {...defaultProps}
@@ -481,44 +551,54 @@ describe('Details', () => {
481
551
  </MemoryRouter>,
482
552
  );
483
553
 
484
- const actionSelected = wrapper
485
- .find(Action)
486
- .prop('action').onActionSelected;
487
- await act(async () => {
488
- actionSelected && actionSelected();
554
+ await waitFor(() => {
555
+ const actionsPanel = container.querySelector(
556
+ '[data-test-id="actions"]',
557
+ );
558
+ expect(actionsPanel).toBeInTheDocument();
489
559
  });
490
560
 
491
- wrapper.update();
492
-
493
- let messageBar = wrapper.find(MessageBar);
494
-
495
- expect(messageBar.exists()).toBe(true);
561
+ const actionsPanel = container.querySelector('[data-test-id="actions"]');
562
+ const actionButton = actionsPanel?.querySelector(
563
+ '[data-test-id="action"]',
564
+ ) as HTMLElement;
496
565
 
497
- const toggle = wrapper.find('.detailsIcon');
566
+ await act(async () => {
567
+ fireEvent.click(actionButton);
568
+ });
498
569
 
499
- toggle.simulate('click');
570
+ let messageBar: Element | null = null;
571
+ await waitFor(() => {
572
+ messageBar = container.querySelector('[data-test-id="message-bar"]');
573
+ expect(messageBar).toBeInTheDocument();
574
+ });
500
575
 
501
- wrapper.update();
576
+ const toggle = container.querySelector(
577
+ '[data-test-id="message-bar-details-button"]',
578
+ ) as HTMLElement;
502
579
 
503
- const body = wrapper.find('.body').first();
580
+ fireEvent.click(toggle);
504
581
 
505
- expect(body.text()).toContain(formError.message);
582
+ const body = container.querySelector('.body') as HTMLElement;
506
583
 
507
- messageBar.prop('onClose')!();
584
+ expect(body.textContent).toContain(formError.message);
508
585
 
509
- wrapper.update();
586
+ const closeButton = container.querySelector(
587
+ '[data-test-id="message-bar-close-button"]',
588
+ ) as HTMLButtonElement;
589
+ fireEvent.click(closeButton);
510
590
 
511
- messageBar = wrapper.find(MessageBar);
591
+ messageBar = container.querySelector('.messageBar');
512
592
 
513
- expect(messageBar.exists()).toBe(false);
593
+ expect(messageBar).not.toBeInTheDocument();
514
594
  });
515
595
 
516
596
  it(`displays an error body when a body is attached to the error object`, async () => {
517
597
  const formError = new Error('Submitting failed');
518
- const spy = jest.fn();
598
+ const spy = vi.fn();
519
599
  const sampleActions = mockActions(spy);
520
600
 
521
- const wrapper = mount(
601
+ const { container } = render(
522
602
  <MemoryRouter>
523
603
  <FormStation
524
604
  {...defaultProps}
@@ -533,31 +613,42 @@ describe('Details', () => {
533
613
  </MemoryRouter>,
534
614
  );
535
615
 
536
- const actionSelected = wrapper
537
- .find(Action)
538
- .prop('action').onActionSelected;
539
- await act(async () => {
540
- actionSelected && actionSelected();
616
+ await waitFor(() => {
617
+ const actionsPanel = container.querySelector(
618
+ '[data-test-id="actions"]',
619
+ );
620
+ expect(actionsPanel).toBeInTheDocument();
541
621
  });
542
622
 
543
- wrapper.update();
623
+ const actionsPanel = container.querySelector('[data-test-id="actions"]');
624
+ const actionButton = actionsPanel?.querySelector(
625
+ '[data-test-id="action"]',
626
+ ) as HTMLElement;
544
627
 
545
- const toggle = wrapper.find('.detailsIcon');
628
+ await act(async () => {
629
+ fireEvent.click(actionButton);
630
+ });
546
631
 
547
- toggle.simulate('click');
632
+ let toggle: HTMLElement | null = null;
633
+ await waitFor(() => {
634
+ toggle = container.querySelector(
635
+ '[data-test-id="message-bar-details-button"]',
636
+ ) as HTMLElement;
637
+ expect(toggle).toBeInTheDocument();
638
+ });
548
639
 
549
- wrapper.update();
640
+ fireEvent.click(toggle!);
550
641
 
551
- const body = wrapper.find('.body').first();
642
+ const body = container.querySelector('.body') as HTMLElement;
552
643
 
553
- expect(body.text()).toContain(formError.message);
644
+ expect(body.textContent).toContain(formError.message);
554
645
  });
555
646
  });
556
647
 
557
648
  describe('Prevent multiple form submissions', () => {
558
649
  it(`disables actions and 'SaveOnNavigate' while a form is being submitted`, async () => {
559
- jest.useFakeTimers();
560
- const spy = jest.fn();
650
+ vi.useFakeTimers();
651
+ const spy = vi.fn();
561
652
  const sampleActions = mockActions(spy);
562
653
  const onSubmit = (): Promise<{ id: number }> => {
563
654
  return new Promise((resolve) => {
@@ -567,7 +658,7 @@ describe('Details', () => {
567
658
  });
568
659
  };
569
660
 
570
- const wrapper = mount(
661
+ const { container } = render(
571
662
  <MemoryRouter>
572
663
  <FormStation
573
664
  {...defaultProps}
@@ -580,61 +671,53 @@ describe('Details', () => {
580
671
  </MemoryRouter>,
581
672
  );
582
673
 
583
- let saveOnNavigate = wrapper.find(SaveOnNavigate);
584
- let action = wrapper.find(Action);
585
- let isDisabled = action.prop('action').isDisabled;
586
-
587
- // assert SaveOnNavigate is aware the form is not being submitted
588
- saveOnNavigate = wrapper.find(SaveOnNavigate);
589
- expect(saveOnNavigate.prop('isSubmitting')).toBe(false);
590
-
591
674
  // assert form actions are initially enabled
592
- action = wrapper.find(Action);
593
- isDisabled = action.prop('action').isDisabled;
594
- expect(isDisabled).toBe(false);
675
+ await waitFor(() => {
676
+ const actionsPanel = container.querySelector(
677
+ '[data-test-id="actions"]',
678
+ );
679
+ expect(actionsPanel).toBeInTheDocument();
680
+ });
681
+
682
+ let actionsPanel = container.querySelector('[data-test-id="actions"]');
683
+ let actionButton = actionsPanel?.querySelector(
684
+ '[data-test-id="action"]',
685
+ ) as HTMLElement;
686
+ expect(actionButton).toBeInTheDocument();
595
687
 
596
688
  // submit form
597
- const actionSelected = wrapper
598
- .find(Action)
599
- .prop('action').onActionSelected;
600
689
  await act(async () => {
601
- actionSelected && actionSelected();
690
+ fireEvent.click(actionButton);
602
691
  });
603
692
 
604
693
  // place form into 'submitting' state
605
694
  await act(async () => {
606
- jest.advanceTimersByTime(500);
695
+ vi.advanceTimersByTime(500);
607
696
  });
608
- wrapper.update();
609
-
610
- // assert SaveOnNavigate is aware the form is currently being submitted
611
- saveOnNavigate = wrapper.find(SaveOnNavigate);
612
- expect(saveOnNavigate.prop('isSubmitting')).toBe(true);
613
697
 
614
698
  // assert form actions are disabled while form is being submitted
615
- action = wrapper.find(Action);
616
- isDisabled = action.prop('action').isDisabled;
617
- expect(isDisabled).toBe(true);
699
+ actionsPanel = container.querySelector('[data-test-id="actions"]');
700
+ actionButton = actionsPanel?.querySelector(
701
+ '[data-test-id="action"]',
702
+ ) as HTMLElement;
703
+ expect(actionButton).toHaveClass('isDisabled');
618
704
 
619
705
  // complete form submission
620
706
  await act(async () => {
621
- jest.runAllTimers();
707
+ vi.runAllTimers();
622
708
  });
623
- wrapper.update();
624
-
625
- // assert SaveOnNavigate is aware the form is no longer being submitted
626
- saveOnNavigate = wrapper.find(SaveOnNavigate);
627
- expect(saveOnNavigate.prop('isSubmitting')).toBe(false);
628
709
 
629
710
  // assert form actions are enabled again after form is submitted
630
- action = wrapper.find(Action);
631
- isDisabled = action.prop('action').isDisabled;
632
- expect(isDisabled).toBe(false);
711
+ actionsPanel = container.querySelector('[data-test-id="actions"]');
712
+ actionButton = actionsPanel?.querySelector(
713
+ '[data-test-id="action"]',
714
+ ) as HTMLElement;
715
+ expect(actionButton).not.toHaveClass('isDisabled');
633
716
  });
634
717
 
635
718
  it(`enables actions and 'SaveOnNavigate' if form submission fails`, async () => {
636
- jest.useFakeTimers();
637
- const spy = jest.fn();
719
+ vi.useFakeTimers();
720
+ const spy = vi.fn();
638
721
  const sampleActions = mockActions(spy);
639
722
  const onSubmit = (): Promise<{ id: number }> => {
640
723
  return new Promise((_resolve, reject) => {
@@ -644,7 +727,7 @@ describe('Details', () => {
644
727
  });
645
728
  };
646
729
 
647
- const wrapper = mount(
730
+ const { container } = render(
648
731
  <MemoryRouter>
649
732
  <FormStation
650
733
  {...defaultProps}
@@ -657,56 +740,48 @@ describe('Details', () => {
657
740
  </MemoryRouter>,
658
741
  );
659
742
 
660
- let saveOnNavigate = wrapper.find(SaveOnNavigate);
661
- let action = wrapper.find(Action);
662
- let isDisabled = action.prop('action').isDisabled;
663
-
664
- // assert SaveOnNavigate is aware the form is not being submitted
665
- saveOnNavigate = wrapper.find(SaveOnNavigate);
666
- expect(saveOnNavigate.prop('isSubmitting')).toBe(false);
667
-
668
743
  // assert form actions are initially enabled
669
- action = wrapper.find(Action);
670
- isDisabled = action.prop('action').isDisabled;
671
- expect(isDisabled).toBe(false);
744
+ let actionButton: HTMLElement | null = null;
745
+ await waitFor(() => {
746
+ const actionsPanel = container.querySelector(
747
+ '[data-test-id="actions"]',
748
+ );
749
+ actionButton = actionsPanel?.querySelector(
750
+ '[data-test-id="action"]',
751
+ ) as HTMLElement;
752
+ expect(actionButton).toBeInTheDocument();
753
+ });
754
+
755
+ expect(actionButton).toBeInTheDocument();
672
756
 
673
757
  // submit form
674
- const actionSelected = wrapper
675
- .find(Action)
676
- .prop('action').onActionSelected;
677
758
  await act(async () => {
678
- actionSelected && actionSelected();
759
+ fireEvent.click(actionButton!);
679
760
  });
680
761
 
681
762
  // place form into 'submitting' state
682
763
  await act(async () => {
683
- jest.advanceTimersByTime(500);
764
+ vi.advanceTimersByTime(500);
684
765
  });
685
- wrapper.update();
686
-
687
- // assert SaveOnNavigate is aware the form is currently being submitted
688
- saveOnNavigate = wrapper.find(SaveOnNavigate);
689
- expect(saveOnNavigate.prop('isSubmitting')).toBe(true);
690
766
 
691
767
  // assert form actions are disabled while form is being submitted
692
- action = wrapper.find(Action);
693
- isDisabled = action.prop('action').isDisabled;
694
- expect(isDisabled).toBe(true);
768
+ const actionsPanel2 = container.querySelector('[data-test-id="actions"]');
769
+ actionButton = actionsPanel2?.querySelector(
770
+ '[data-test-id="action"]',
771
+ ) as HTMLElement;
772
+ expect(actionButton).toHaveClass('isDisabled');
695
773
 
696
774
  // complete form submission
697
775
  await act(async () => {
698
- jest.runAllTimers();
776
+ vi.runAllTimers();
699
777
  });
700
- wrapper.update();
701
-
702
- // assert SaveOnNavigate is aware the form is no longer being submitted
703
- saveOnNavigate = wrapper.find(SaveOnNavigate);
704
- expect(saveOnNavigate.prop('isSubmitting')).toBe(false);
705
778
 
706
779
  // assert form actions are enabled again after form is submitted
707
- action = wrapper.find(Action);
708
- isDisabled = action.prop('action').isDisabled;
709
- expect(isDisabled).toBe(false);
780
+ const actionsPanel3 = container.querySelector('[data-test-id="actions"]');
781
+ actionButton = actionsPanel3?.querySelector(
782
+ '[data-test-id="action"]',
783
+ ) as HTMLElement;
784
+ expect(actionButton).not.toHaveClass('isDisabled');
710
785
  });
711
786
  });
712
787
  });