@dhis2/analytics 28.0.4 → 28.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/build/cjs/__demo__/OpenFileDialog.stories.js +19 -1
  2. package/build/cjs/__demo__/{PivotTable.stories.js → PivotTable.aggregate.stories.js} +38 -38
  3. package/build/cjs/__demo__/PivotTable.event.stories.js +440 -0
  4. package/build/cjs/__demo__/data/event/boolean.data.hidena.json +115 -0
  5. package/build/cjs/__demo__/data/event/boolean.data.json +125 -0
  6. package/build/cjs/__demo__/data/event/boolean.data.org.json +106 -0
  7. package/build/cjs/__demo__/data/event/boolean.visualization.json +160 -0
  8. package/build/cjs/__demo__/data/event/date.data.hidena.json +205 -0
  9. package/build/cjs/__demo__/data/event/date.data.json +215 -0
  10. package/build/cjs/__demo__/data/event/date.data.org.json +123 -0
  11. package/build/cjs/__demo__/data/event/date.visualization.json +160 -0
  12. package/build/cjs/__demo__/data/event/datetime.data.hidena.json +215 -0
  13. package/build/cjs/__demo__/data/event/datetime.data.json +225 -0
  14. package/build/cjs/__demo__/data/event/datetime.data.org.json +124 -0
  15. package/build/cjs/__demo__/data/event/datetime.visualization.json +148 -0
  16. package/build/cjs/__demo__/data/event/email.data.hidena.json +192 -0
  17. package/build/cjs/__demo__/data/event/email.data.json +202 -0
  18. package/build/cjs/__demo__/data/event/email.data.org.json +123 -0
  19. package/build/cjs/__demo__/data/event/email.visualization.json +148 -0
  20. package/build/cjs/__demo__/data/event/integer.data.hidena.json +165 -0
  21. package/build/cjs/__demo__/data/event/integer.data.json +175 -0
  22. package/build/cjs/__demo__/data/event/integer.data.org.json +120 -0
  23. package/build/cjs/__demo__/data/event/integer.visualization.json +163 -0
  24. package/build/cjs/__demo__/data/event/legendset.data.hidena.json +154 -0
  25. package/build/cjs/__demo__/data/event/legendset.data.json +164 -0
  26. package/build/cjs/__demo__/data/event/legendset.visualization.json +166 -0
  27. package/build/cjs/__demo__/data/event/optionset.data.hidena.json +125 -0
  28. package/build/cjs/__demo__/data/event/optionset.data.json +134 -0
  29. package/build/cjs/__demo__/data/event/optionset.data.org.json +125 -0
  30. package/build/cjs/__demo__/data/event/optionset.visualization.json +158 -0
  31. package/build/cjs/__demo__/data/event/time.data.hidena.json +165 -0
  32. package/build/cjs/__demo__/data/event/time.data.json +175 -0
  33. package/build/cjs/__demo__/data/event/time.data.org.json +128 -0
  34. package/build/cjs/__demo__/data/event/time.visualization.json +148 -0
  35. package/build/cjs/__demo__/data/event/yesonly.data.hidena.json +127 -0
  36. package/build/cjs/__demo__/data/event/yesonly.data.json +136 -0
  37. package/build/cjs/__demo__/data/event/yesonly.data.org.json +124 -0
  38. package/build/cjs/__demo__/data/event/yesonly.visualization.json +161 -0
  39. package/build/cjs/components/DataDimension/ItemSelector/ItemSelector.js +19 -22
  40. package/build/cjs/components/DimensionsPanel/List/DimensionList.js +3 -1
  41. package/build/cjs/components/DimensionsPanel/List/__tests__/DimensionItem.spec.js +48 -41
  42. package/build/cjs/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +110 -114
  43. package/build/cjs/components/DimensionsPanel/__tests__/DimensionsPanel.spec.js +36 -33
  44. package/build/cjs/components/FileMenu/__tests__/DeleteDialog.spec.js +24 -27
  45. package/build/cjs/components/FileMenu/__tests__/FileMenu.spec.js +51 -31
  46. package/build/cjs/components/FileMenu/__tests__/GetLinkDialog.spec.js +28 -31
  47. package/build/cjs/components/FileMenu/__tests__/RenameDialog.spec.js +17 -11
  48. package/build/cjs/components/FileMenu/__tests__/SaveAsDialog.spec.js +44 -37
  49. package/build/cjs/components/Filter/__tests__/Filter.spec.js +29 -34
  50. package/build/cjs/components/OpenFileDialog/CreatedByFilter.js +9 -1
  51. package/build/cjs/components/OpenFileDialog/OpenFileDialog.js +14 -34
  52. package/build/cjs/components/OpenFileDialog/VisTypeFilter.js +39 -1
  53. package/build/cjs/components/OpenFileDialog/__tests__/OpenFileDialog.spec.js +51 -0
  54. package/build/cjs/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +78 -44
  55. package/build/cjs/components/PeriodDimension/FixedPeriodFilter.js +1 -0
  56. package/build/cjs/components/PeriodDimension/RelativePeriodFilter.js +3 -2
  57. package/build/cjs/components/PeriodDimension/__tests__/FixedPeriodSingleSelect.spec.js +14 -21
  58. package/build/cjs/components/PeriodDimension/__tests__/PeriodDimension.spec.js +27 -23
  59. package/build/cjs/components/PivotTable/PivotTableColumnHeaderCell.js +3 -0
  60. package/build/cjs/components/PivotTable/PivotTableRowHeaderCell.js +2 -1
  61. package/build/cjs/components/RichText/Editor/__tests__/Editor.spec.js +6 -7
  62. package/build/cjs/components/RichText/Parser/__tests__/MdParser.spec.js +1 -1
  63. package/build/cjs/components/RichText/Parser/__tests__/Parser.spec.js +22 -23
  64. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +52 -42
  65. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +8 -8
  66. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +23 -18
  67. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +23 -17
  68. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/__snapshots__/HoverMenuList.spec.js.snap +63 -0
  69. package/build/cjs/components/Toolbar/InterpretationsAndDetailsToggler.js +3 -1
  70. package/build/cjs/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +19 -18
  71. package/build/cjs/components/Toolbar/__tests__/Toolbar.spec.js +8 -8
  72. package/build/cjs/components/Toolbar/__tests__/ToolbarSidebar.spec.js +14 -11
  73. package/build/cjs/components/Toolbar/__tests__/UpdateButton.spec.js +16 -14
  74. package/build/cjs/components/TranslationDialog/TranslationModal/TranslationModal.js +2 -1
  75. package/build/cjs/components/TranslationDialog/TranslationModal/__tests__/TranslationModal.spec.js +25 -16
  76. package/build/cjs/index.js +8 -0
  77. package/build/cjs/locales/en/translations.json +1 -0
  78. package/build/cjs/modules/pivotTable/AdaptiveClippingController.js +2 -1
  79. package/build/cjs/modules/pivotTable/getHeaderForDisplay.js +4 -1
  80. package/build/cjs/modules/pivotTable/measureText.js +7 -6
  81. package/build/cjs/modules/response/event/__tests__/default.spec.js +77 -0
  82. package/build/cjs/modules/response/event/__tests__/optionSet.spec.js +35 -0
  83. package/build/cjs/modules/response/event/__tests__/response.spec.js +125 -0
  84. package/build/cjs/modules/response/event/default.js +65 -0
  85. package/build/cjs/modules/response/event/optionSet.js +36 -0
  86. package/build/cjs/modules/response/event/response.js +95 -0
  87. package/build/es/__demo__/OpenFileDialog.stories.js +17 -0
  88. package/build/es/__demo__/{PivotTable.stories.js → PivotTable.aggregate.stories.js} +38 -38
  89. package/build/es/__demo__/PivotTable.event.stories.js +414 -0
  90. package/build/es/__demo__/data/event/boolean.data.hidena.json +115 -0
  91. package/build/es/__demo__/data/event/boolean.data.json +125 -0
  92. package/build/es/__demo__/data/event/boolean.data.org.json +106 -0
  93. package/build/es/__demo__/data/event/boolean.visualization.json +160 -0
  94. package/build/es/__demo__/data/event/date.data.hidena.json +205 -0
  95. package/build/es/__demo__/data/event/date.data.json +215 -0
  96. package/build/es/__demo__/data/event/date.data.org.json +123 -0
  97. package/build/es/__demo__/data/event/date.visualization.json +160 -0
  98. package/build/es/__demo__/data/event/datetime.data.hidena.json +215 -0
  99. package/build/es/__demo__/data/event/datetime.data.json +225 -0
  100. package/build/es/__demo__/data/event/datetime.data.org.json +124 -0
  101. package/build/es/__demo__/data/event/datetime.visualization.json +148 -0
  102. package/build/es/__demo__/data/event/email.data.hidena.json +192 -0
  103. package/build/es/__demo__/data/event/email.data.json +202 -0
  104. package/build/es/__demo__/data/event/email.data.org.json +123 -0
  105. package/build/es/__demo__/data/event/email.visualization.json +148 -0
  106. package/build/es/__demo__/data/event/integer.data.hidena.json +165 -0
  107. package/build/es/__demo__/data/event/integer.data.json +175 -0
  108. package/build/es/__demo__/data/event/integer.data.org.json +120 -0
  109. package/build/es/__demo__/data/event/integer.visualization.json +163 -0
  110. package/build/es/__demo__/data/event/legendset.data.hidena.json +154 -0
  111. package/build/es/__demo__/data/event/legendset.data.json +164 -0
  112. package/build/es/__demo__/data/event/legendset.visualization.json +166 -0
  113. package/build/es/__demo__/data/event/optionset.data.hidena.json +125 -0
  114. package/build/es/__demo__/data/event/optionset.data.json +134 -0
  115. package/build/es/__demo__/data/event/optionset.data.org.json +125 -0
  116. package/build/es/__demo__/data/event/optionset.visualization.json +158 -0
  117. package/build/es/__demo__/data/event/time.data.hidena.json +165 -0
  118. package/build/es/__demo__/data/event/time.data.json +175 -0
  119. package/build/es/__demo__/data/event/time.data.org.json +128 -0
  120. package/build/es/__demo__/data/event/time.visualization.json +148 -0
  121. package/build/es/__demo__/data/event/yesonly.data.hidena.json +127 -0
  122. package/build/es/__demo__/data/event/yesonly.data.json +136 -0
  123. package/build/es/__demo__/data/event/yesonly.data.org.json +124 -0
  124. package/build/es/__demo__/data/event/yesonly.visualization.json +161 -0
  125. package/build/es/components/DataDimension/ItemSelector/ItemSelector.js +19 -22
  126. package/build/es/components/DimensionsPanel/List/DimensionList.js +3 -1
  127. package/build/es/components/DimensionsPanel/List/__tests__/DimensionItem.spec.js +47 -40
  128. package/build/es/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +110 -114
  129. package/build/es/components/DimensionsPanel/__tests__/DimensionsPanel.spec.js +35 -32
  130. package/build/es/components/FileMenu/__tests__/DeleteDialog.spec.js +23 -26
  131. package/build/es/components/FileMenu/__tests__/FileMenu.spec.js +52 -32
  132. package/build/es/components/FileMenu/__tests__/GetLinkDialog.spec.js +27 -30
  133. package/build/es/components/FileMenu/__tests__/RenameDialog.spec.js +18 -12
  134. package/build/es/components/FileMenu/__tests__/SaveAsDialog.spec.js +43 -36
  135. package/build/es/components/Filter/__tests__/Filter.spec.js +28 -33
  136. package/build/es/components/OpenFileDialog/CreatedByFilter.js +7 -0
  137. package/build/es/components/OpenFileDialog/OpenFileDialog.js +14 -35
  138. package/build/es/components/OpenFileDialog/VisTypeFilter.js +38 -1
  139. package/build/es/components/OpenFileDialog/__tests__/OpenFileDialog.spec.js +49 -0
  140. package/build/es/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +77 -43
  141. package/build/es/components/PeriodDimension/FixedPeriodFilter.js +1 -0
  142. package/build/es/components/PeriodDimension/RelativePeriodFilter.js +3 -2
  143. package/build/es/components/PeriodDimension/__tests__/FixedPeriodSingleSelect.spec.js +13 -20
  144. package/build/es/components/PeriodDimension/__tests__/PeriodDimension.spec.js +26 -22
  145. package/build/es/components/PivotTable/PivotTableColumnHeaderCell.js +3 -0
  146. package/build/es/components/PivotTable/PivotTableRowHeaderCell.js +2 -1
  147. package/build/es/components/RichText/Editor/__tests__/Editor.spec.js +7 -8
  148. package/build/es/components/RichText/Parser/__tests__/MdParser.spec.js +1 -1
  149. package/build/es/components/RichText/Parser/__tests__/Parser.spec.js +21 -22
  150. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +53 -43
  151. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +7 -7
  152. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +23 -18
  153. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +21 -15
  154. package/build/es/components/Toolbar/HoverMenuBar/__tests__/__snapshots__/HoverMenuList.spec.js.snap +63 -0
  155. package/build/es/components/Toolbar/InterpretationsAndDetailsToggler.js +3 -1
  156. package/build/es/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +18 -17
  157. package/build/es/components/Toolbar/__tests__/Toolbar.spec.js +7 -7
  158. package/build/es/components/Toolbar/__tests__/ToolbarSidebar.spec.js +13 -10
  159. package/build/es/components/Toolbar/__tests__/UpdateButton.spec.js +15 -13
  160. package/build/es/components/TranslationDialog/TranslationModal/TranslationModal.js +2 -1
  161. package/build/es/components/TranslationDialog/TranslationModal/__tests__/TranslationModal.spec.js +24 -15
  162. package/build/es/index.js +4 -0
  163. package/build/es/locales/en/translations.json +1 -0
  164. package/build/es/modules/pivotTable/AdaptiveClippingController.js +2 -1
  165. package/build/es/modules/pivotTable/getHeaderForDisplay.js +4 -1
  166. package/build/es/modules/pivotTable/measureText.js +7 -6
  167. package/build/es/modules/response/event/__tests__/default.spec.js +75 -0
  168. package/build/es/modules/response/event/__tests__/optionSet.spec.js +32 -0
  169. package/build/es/modules/response/event/__tests__/response.spec.js +122 -0
  170. package/build/es/modules/response/event/default.js +52 -0
  171. package/build/es/modules/response/event/optionSet.js +27 -0
  172. package/build/es/modules/response/event/response.js +86 -0
  173. package/package.json +2 -4
  174. package/build/cjs/components/OrgUnitDimension/__tests__/__snapshots__/OrgUnitDimension.spec.js.snap +0 -89
  175. package/build/cjs/components/PeriodDimension/__tests__/PeriodSelector.spec.js +0 -29
  176. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/FixedPeriodSingleSelect.spec.js.snap +0 -92
  177. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +0 -16
  178. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +0 -89
  179. package/build/es/components/OrgUnitDimension/__tests__/__snapshots__/OrgUnitDimension.spec.js.snap +0 -89
  180. package/build/es/components/PeriodDimension/__tests__/PeriodSelector.spec.js +0 -26
  181. package/build/es/components/PeriodDimension/__tests__/__snapshots__/FixedPeriodSingleSelect.spec.js.snap +0 -92
  182. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +0 -16
  183. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +0 -89
  184. /package/build/cjs/__demo__/data/{avgTotalAggregationType.data.json → aggregate/avgTotalAggregationType.data.json} +0 -0
  185. /package/build/cjs/__demo__/data/{avgTotalAggregationType.metadata.json → aggregate/avgTotalAggregationType.metadata.json} +0 -0
  186. /package/build/cjs/__demo__/data/{avgTotalAggregationType.visualization.json → aggregate/avgTotalAggregationType.visualization.json} +0 -0
  187. /package/build/cjs/__demo__/data/{deep.data.json → aggregate/deep.data.json} +0 -0
  188. /package/build/cjs/__demo__/data/{deep.visualization.json → aggregate/deep.visualization.json} +0 -0
  189. /package/build/cjs/__demo__/data/{deepWithFilters.data.json → aggregate/deepWithFilters.data.json} +0 -0
  190. /package/build/cjs/__demo__/data/{deepWithFilters.visualization.json → aggregate/deepWithFilters.visualization.json} +0 -0
  191. /package/build/cjs/__demo__/data/{degs.data.json → aggregate/degs.data.json} +0 -0
  192. /package/build/cjs/__demo__/data/{degs.metadata.json → aggregate/degs.metadata.json} +0 -0
  193. /package/build/cjs/__demo__/data/{degs.visualization.json → aggregate/degs.visualization.json} +0 -0
  194. /package/build/cjs/__demo__/data/{diseaseWeeks.data.json → aggregate/diseaseWeeks.data.json} +0 -0
  195. /package/build/cjs/__demo__/data/{diseaseWeeks.metadata.json → aggregate/diseaseWeeks.metadata.json} +0 -0
  196. /package/build/cjs/__demo__/data/{diseaseWeeks.visualization.json → aggregate/diseaseWeeks.visualization.json} +0 -0
  197. /package/build/cjs/__demo__/data/{emptyColumns.data.json → aggregate/emptyColumns.data.json} +0 -0
  198. /package/build/cjs/__demo__/data/{emptyColumns.metadata.json → aggregate/emptyColumns.metadata.json} +0 -0
  199. /package/build/cjs/__demo__/data/{emptyColumns.visualization.json → aggregate/emptyColumns.visualization.json} +0 -0
  200. /package/build/cjs/__demo__/data/{emptyRows.data.json → aggregate/emptyRows.data.json} +0 -0
  201. /package/build/cjs/__demo__/data/{emptyRows.visualization.json → aggregate/emptyRows.visualization.json} +0 -0
  202. /package/build/cjs/__demo__/data/{hierarchy.data.json → aggregate/hierarchy.data.json} +0 -0
  203. /package/build/cjs/__demo__/data/{hierarchy.metadata.json → aggregate/hierarchy.metadata.json} +0 -0
  204. /package/build/cjs/__demo__/data/{hierarchy.visualization.json → aggregate/hierarchy.visualization.json} +0 -0
  205. /package/build/cjs/__demo__/data/{lastFiveYears.data.json → aggregate/lastFiveYears.data.json} +0 -0
  206. /package/build/cjs/__demo__/data/{lastFiveYears.metadata.json → aggregate/lastFiveYears.metadata.json} +0 -0
  207. /package/build/cjs/__demo__/data/{lastFiveYears.visualization.json → aggregate/lastFiveYears.visualization.json} +0 -0
  208. /package/build/cjs/__demo__/data/{narrative.data.json → aggregate/narrative.data.json} +0 -0
  209. /package/build/cjs/__demo__/data/{narrative.metadata.json → aggregate/narrative.metadata.json} +0 -0
  210. /package/build/cjs/__demo__/data/{narrative.visualization.json → aggregate/narrative.visualization.json} +0 -0
  211. /package/build/cjs/__demo__/data/{simple.data.json → aggregate/simple.data.json} +0 -0
  212. /package/build/cjs/__demo__/data/{simple.metadata.json → aggregate/simple.metadata.json} +0 -0
  213. /package/build/cjs/__demo__/data/{simple.visualization.json → aggregate/simple.visualization.json} +0 -0
  214. /package/build/cjs/__demo__/data/{target-with-legend.data.json → aggregate/target-with-legend.data.json} +0 -0
  215. /package/build/cjs/__demo__/data/{target-with-legend.metadata.json → aggregate/target-with-legend.metadata.json} +0 -0
  216. /package/build/cjs/__demo__/data/{target-with-legend.visualization.json → aggregate/target-with-legend.visualization.json} +0 -0
  217. /package/build/cjs/__demo__/data/{under-above-100.legendSet.json → aggregate/under-above-100.legendSet.json} +0 -0
  218. /package/build/cjs/__demo__/data/{weeklyColumns.data.json → aggregate/weeklyColumns.data.json} +0 -0
  219. /package/build/cjs/__demo__/data/{weeklyColumns.metadata.json → aggregate/weeklyColumns.metadata.json} +0 -0
  220. /package/build/cjs/__demo__/data/{weeklyColumns.visualization.json → aggregate/weeklyColumns.visualization.json} +0 -0
  221. /package/build/es/__demo__/data/{avgTotalAggregationType.data.json → aggregate/avgTotalAggregationType.data.json} +0 -0
  222. /package/build/es/__demo__/data/{avgTotalAggregationType.metadata.json → aggregate/avgTotalAggregationType.metadata.json} +0 -0
  223. /package/build/es/__demo__/data/{avgTotalAggregationType.visualization.json → aggregate/avgTotalAggregationType.visualization.json} +0 -0
  224. /package/build/es/__demo__/data/{deep.data.json → aggregate/deep.data.json} +0 -0
  225. /package/build/es/__demo__/data/{deep.visualization.json → aggregate/deep.visualization.json} +0 -0
  226. /package/build/es/__demo__/data/{deepWithFilters.data.json → aggregate/deepWithFilters.data.json} +0 -0
  227. /package/build/es/__demo__/data/{deepWithFilters.visualization.json → aggregate/deepWithFilters.visualization.json} +0 -0
  228. /package/build/es/__demo__/data/{degs.data.json → aggregate/degs.data.json} +0 -0
  229. /package/build/es/__demo__/data/{degs.metadata.json → aggregate/degs.metadata.json} +0 -0
  230. /package/build/es/__demo__/data/{degs.visualization.json → aggregate/degs.visualization.json} +0 -0
  231. /package/build/es/__demo__/data/{diseaseWeeks.data.json → aggregate/diseaseWeeks.data.json} +0 -0
  232. /package/build/es/__demo__/data/{diseaseWeeks.metadata.json → aggregate/diseaseWeeks.metadata.json} +0 -0
  233. /package/build/es/__demo__/data/{diseaseWeeks.visualization.json → aggregate/diseaseWeeks.visualization.json} +0 -0
  234. /package/build/es/__demo__/data/{emptyColumns.data.json → aggregate/emptyColumns.data.json} +0 -0
  235. /package/build/es/__demo__/data/{emptyColumns.metadata.json → aggregate/emptyColumns.metadata.json} +0 -0
  236. /package/build/es/__demo__/data/{emptyColumns.visualization.json → aggregate/emptyColumns.visualization.json} +0 -0
  237. /package/build/es/__demo__/data/{emptyRows.data.json → aggregate/emptyRows.data.json} +0 -0
  238. /package/build/es/__demo__/data/{emptyRows.visualization.json → aggregate/emptyRows.visualization.json} +0 -0
  239. /package/build/es/__demo__/data/{hierarchy.data.json → aggregate/hierarchy.data.json} +0 -0
  240. /package/build/es/__demo__/data/{hierarchy.metadata.json → aggregate/hierarchy.metadata.json} +0 -0
  241. /package/build/es/__demo__/data/{hierarchy.visualization.json → aggregate/hierarchy.visualization.json} +0 -0
  242. /package/build/es/__demo__/data/{lastFiveYears.data.json → aggregate/lastFiveYears.data.json} +0 -0
  243. /package/build/es/__demo__/data/{lastFiveYears.metadata.json → aggregate/lastFiveYears.metadata.json} +0 -0
  244. /package/build/es/__demo__/data/{lastFiveYears.visualization.json → aggregate/lastFiveYears.visualization.json} +0 -0
  245. /package/build/es/__demo__/data/{narrative.data.json → aggregate/narrative.data.json} +0 -0
  246. /package/build/es/__demo__/data/{narrative.metadata.json → aggregate/narrative.metadata.json} +0 -0
  247. /package/build/es/__demo__/data/{narrative.visualization.json → aggregate/narrative.visualization.json} +0 -0
  248. /package/build/es/__demo__/data/{simple.data.json → aggregate/simple.data.json} +0 -0
  249. /package/build/es/__demo__/data/{simple.metadata.json → aggregate/simple.metadata.json} +0 -0
  250. /package/build/es/__demo__/data/{simple.visualization.json → aggregate/simple.visualization.json} +0 -0
  251. /package/build/es/__demo__/data/{target-with-legend.data.json → aggregate/target-with-legend.data.json} +0 -0
  252. /package/build/es/__demo__/data/{target-with-legend.metadata.json → aggregate/target-with-legend.metadata.json} +0 -0
  253. /package/build/es/__demo__/data/{target-with-legend.visualization.json → aggregate/target-with-legend.visualization.json} +0 -0
  254. /package/build/es/__demo__/data/{under-above-100.legendSet.json → aggregate/under-above-100.legendSet.json} +0 -0
  255. /package/build/es/__demo__/data/{weeklyColumns.data.json → aggregate/weeklyColumns.data.json} +0 -0
  256. /package/build/es/__demo__/data/{weeklyColumns.metadata.json → aggregate/weeklyColumns.metadata.json} +0 -0
  257. /package/build/es/__demo__/data/{weeklyColumns.visualization.json → aggregate/weeklyColumns.visualization.json} +0 -0
@@ -2,9 +2,46 @@ import i18n from '@dhis2/d2-i18n';
2
2
  import { SingleSelect, colors } from '@dhis2/ui';
3
3
  import PropTypes from 'prop-types';
4
4
  import React from 'react';
5
- import { getDisplayNameByVisType, visTypeIcons } from '../../modules/visTypes.js';
5
+ import { getDisplayNameByVisType, visTypeIcons, VIS_TYPE_GROUP_ALL, VIS_TYPE_GROUP_CHARTS, VIS_TYPE_PIVOT_TABLE } from '../../modules/visTypes.js';
6
6
  import { VisTypeIcon } from '../VisTypeIcon.js';
7
7
  import { CustomSelectOption } from './CustomSelectOption.js';
8
+ export const formatTypeFilter = (filterVisTypes, visType) => {
9
+ const defaultFilterTypes = [];
10
+ let defaultTypeFilter;
11
+ if (Array.isArray(filterVisTypes)) {
12
+ defaultFilterTypes.push(...filterVisTypes.filter(({
13
+ type,
14
+ disabled
15
+ }) => !(disabled || [VIS_TYPE_GROUP_ALL, VIS_TYPE_GROUP_CHARTS].includes(type))).map(({
16
+ type
17
+ }) => type));
18
+ if (defaultFilterTypes.length) {
19
+ defaultTypeFilter = `type:in:[${defaultFilterTypes.join(',')}]`;
20
+ }
21
+ }
22
+ switch (visType) {
23
+ case VIS_TYPE_GROUP_ALL:
24
+ {
25
+ return defaultTypeFilter;
26
+ }
27
+ case VIS_TYPE_GROUP_CHARTS:
28
+ {
29
+ if (defaultFilterTypes.length) {
30
+ return `type:in:[${defaultFilterTypes.filter(item => item !== VIS_TYPE_PIVOT_TABLE).join(',')}]`;
31
+ } else {
32
+ return `type:!eq:${VIS_TYPE_PIVOT_TABLE}`;
33
+ }
34
+ }
35
+ default:
36
+ {
37
+ if (visType) {
38
+ return `type:eq:${visType}`;
39
+ } else if (defaultTypeFilter) {
40
+ return defaultTypeFilter;
41
+ }
42
+ }
43
+ }
44
+ };
8
45
  export const VisTypeFilter = ({
9
46
  visTypes,
10
47
  selected,
@@ -0,0 +1,49 @@
1
+ import { VIS_TYPE_COLUMN, VIS_TYPE_GROUP_ALL, VIS_TYPE_GROUP_CHARTS, VIS_TYPE_LINE_LIST, VIS_TYPE_PIVOT_TABLE } from '../../../modules/visTypes.js';
2
+ import { CREATED_BY_ALL, CREATED_BY_ALL_BUT_CURRENT_USER, CREATED_BY_CURRENT_USER } from '../CreatedByFilter.js';
3
+ import { formatFilters } from '../OpenFileDialog.js';
4
+ describe('OpenFileDialog - formatFilters', () => {
5
+ const currentUser = {
6
+ id: 'test-user'
7
+ };
8
+ const createdByTestCases = [[CREATED_BY_ALL, []], [CREATED_BY_CURRENT_USER, [`user.id:eq:${currentUser.id}`]], [CREATED_BY_ALL_BUT_CURRENT_USER, [`user.id:!eq:${currentUser.id}`]]];
9
+ test.each(createdByTestCases)('formats the createdBy filter given %p', (createdBy, expected) => expect(formatFilters(currentUser, {
10
+ createdBy
11
+ })).toEqual(expected));
12
+ test('formats the searchTerm filter', () => {
13
+ const testSearchTerm = 'test search term';
14
+ expect(formatFilters(currentUser, {
15
+ searchTerm: testSearchTerm
16
+ })).toEqual([`identifiable:token:${testSearchTerm}`]);
17
+ });
18
+ const typeTestCases = [
19
+ // no type filter when no visType nor filterVisTypes
20
+ [undefined, undefined, []],
21
+ // no type filter because VIS_TYPE_GROUP_ALL is selected
22
+ [undefined, VIS_TYPE_GROUP_ALL, []],
23
+ // only VIS_TYPE_PIVOT_TABLE ignored because no filterVisTypes is passed and VIS_TYPE_GROUP_CHARTS is selected
24
+ [undefined, VIS_TYPE_GROUP_CHARTS, [`type:!eq:${VIS_TYPE_PIVOT_TABLE}`]],
25
+ // no filterVisTypes and VIS_TYPE_PIVOT_TABLE selected
26
+ [undefined, VIS_TYPE_PIVOT_TABLE, [`type:eq:${VIS_TYPE_PIVOT_TABLE}`]],
27
+ // group types are ignored
28
+ [[VIS_TYPE_PIVOT_TABLE, VIS_TYPE_GROUP_ALL, VIS_TYPE_GROUP_CHARTS], VIS_TYPE_GROUP_ALL, [`type:in:[${VIS_TYPE_PIVOT_TABLE}]`]],
29
+ // VIS_TYPE_PIVOT_TABLE is ignored because VIS_TYPE_GROUP_CHARTS is selected
30
+ [[VIS_TYPE_PIVOT_TABLE, VIS_TYPE_COLUMN, VIS_TYPE_GROUP_CHARTS], VIS_TYPE_GROUP_CHARTS, [`type:in:[${VIS_TYPE_COLUMN}]`]],
31
+ // when filterVisTypes is passed the default type filter only include those
32
+ [[VIS_TYPE_PIVOT_TABLE], '', [`type:in:[${VIS_TYPE_PIVOT_TABLE}]`]], [[VIS_TYPE_LINE_LIST, VIS_TYPE_PIVOT_TABLE], '', [`type:in:[${VIS_TYPE_LINE_LIST},${VIS_TYPE_PIVOT_TABLE}]`]]];
33
+ test.each(typeTestCases)('formats the type filter given %p and %p', (types, visType, expected) => expect(formatFilters(currentUser, {
34
+ visType
35
+ }, types === null || types === void 0 ? void 0 : types.map(type => ({
36
+ type
37
+ })))).toEqual(expected));
38
+ test('combined filters', () => {
39
+ expect(formatFilters(currentUser, {
40
+ createdBy: CREATED_BY_CURRENT_USER,
41
+ searchTerm: 'test',
42
+ visType: VIS_TYPE_GROUP_ALL
43
+ }, [{
44
+ type: VIS_TYPE_LINE_LIST
45
+ }, {
46
+ type: VIS_TYPE_PIVOT_TABLE
47
+ }])).toEqual([`identifiable:token:test`, `user.id:eq:${currentUser.id}`, `type:in:[${VIS_TYPE_LINE_LIST},${VIS_TYPE_PIVOT_TABLE}]`]);
48
+ });
49
+ });
@@ -1,55 +1,89 @@
1
- import { shallow } from 'enzyme';
1
+ import { CustomDataProvider } from '@dhis2/app-runtime';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
2
4
  import React from 'react';
3
5
  import OrgUnitDimension from '../OrgUnitDimension.js';
4
- describe('The OrgUnitDimension component', () => {
5
- let props;
6
- let shallowOrgUnitDimension;
7
- const getWrapper = () => {
8
- if (!shallowOrgUnitDimension) {
9
- shallowOrgUnitDimension = shallow(/*#__PURE__*/React.createElement(OrgUnitDimension, props));
10
- }
11
- return shallowOrgUnitDimension;
6
+ jest.mock('@dhis2-ui/organisation-unit-tree', () => {
7
+ const lib = jest.requireActual('@dhis2-ui/organisation-unit-tree');
8
+ return {
9
+ ...lib,
10
+ OrganisationUnitTree: () => /*#__PURE__*/React.createElement("div", null, "Org unit tree component mock")
12
11
  };
13
- beforeEach(() => {
14
- props = {
15
- roots: [],
16
- selected: [],
17
- onSelect: jest.fn(),
18
- hideGroupSelect: false,
19
- hideLevelSelect: false,
20
- hideUserOrgUnits: false,
21
- warning: ''
22
- };
23
- shallowOrgUnitDimension = undefined;
24
- });
25
- it('matches the snapshot', () => {
26
- const wrapper = getWrapper();
27
- expect(wrapper).toMatchSnapshot();
12
+ });
13
+ describe('OrgUnitDimension', () => {
14
+ const onSelect = jest.fn();
15
+ const props = {
16
+ roots: [],
17
+ selected: [],
18
+ onSelect: onSelect,
19
+ hideGroupSelect: false,
20
+ hideLevelSelect: false,
21
+ hideUserOrgUnits: false,
22
+ warning: ''
23
+ };
24
+ const renderOrgUnitDimension = props => render(/*#__PURE__*/React.createElement(CustomDataProvider, {
25
+ data: {
26
+ organisationUnitLevels: {
27
+ organisationUnitLevels: []
28
+ },
29
+ organisationUnitGroups: {
30
+ organisationUnitGroups: []
31
+ }
32
+ }
33
+ }, /*#__PURE__*/React.createElement(OrgUnitDimension, props)));
34
+ beforeEach(() => onSelect.mockClear());
35
+ test('OrgUnitDimension is rendered correctly', async () => {
36
+ renderOrgUnitDimension(props);
37
+
38
+ // wait for the component to be loaded, here done by testing that the OrganisationUnitTree component is loaded
39
+ // avoid the act warning due to the snapshot being taken before async code is run
40
+ await screen.findByText('Org unit tree component mock');
41
+
42
+ // the top user org unit checkboxes are rendered
43
+ expect(screen.getByLabelText('User organisation unit')).toBeInTheDocument();
44
+ expect(screen.getByLabelText('User sub-units')).toBeInTheDocument();
45
+ expect(screen.getByLabelText('User sub-x2-units')).toBeInTheDocument();
46
+
47
+ // the OrganisationUnitTree component is rendered
48
+ expect(screen.getByText('Org unit tree component mock')).toBeInTheDocument();
49
+
50
+ // the level selector is rendered
51
+ expect(screen.getByText('Select a level')).toBeInTheDocument();
52
+
53
+ // the group selector is rendered
54
+ expect(screen.getByText('Select a group')).toBeInTheDocument();
55
+
56
+ // the Deselect all button is rendered
57
+ expect(screen.getByRole('button', {
58
+ name: 'Deselect all'
59
+ })).toBeInTheDocument();
28
60
  });
29
- it('calls onSelect when an organisation unit is selected', () => {
30
- const wrapper = getWrapper();
31
- const orgUnitTree = wrapper.find('OrganisationUnitTree');
32
- const testOrgUnit = {
33
- id: 'testId',
34
- path: '/testPath',
35
- displayName: 'Test Org Unit',
36
- checked: true
37
- };
38
- orgUnitTree.props().onChange(testOrgUnit);
39
- expect(props.onSelect).toHaveBeenCalledWith({
61
+ test('OrgUnitDimension calls onSelect when an organisation unit is selected', async () => {
62
+ const user = userEvent.setup();
63
+ renderOrgUnitDimension(props);
64
+ await user.click(screen.getByText('User organisation unit'));
65
+ expect(onSelect).toHaveBeenCalledWith({
40
66
  dimensionId: 'ou',
41
67
  items: [{
42
- id: 'testId',
43
- path: '/testPath',
44
- name: 'Test Org Unit'
68
+ id: 'USER_ORGUNIT',
69
+ displayName: 'User organisation unit'
45
70
  }]
46
71
  });
47
72
  });
48
- it('calls onSelect with an empty array when selection is cleared', () => {
49
- const wrapper = getWrapper();
50
- const deselectButton = wrapper.find('Button[onClick]');
51
- deselectButton.simulate('click');
52
- expect(props.onSelect).toHaveBeenCalledWith({
73
+ test('OrgUnitDimension calls onSelect with an empty array when selection is cleared', async () => {
74
+ const user = userEvent.setup();
75
+ renderOrgUnitDimension({
76
+ ...props,
77
+ // make some selection to enable the deselect all button
78
+ selected: [{
79
+ id: 'USER_ORGUNIT_CHILDREN',
80
+ name: 'User sub-units'
81
+ }]
82
+ });
83
+ await user.click(screen.getByRole('button', {
84
+ name: 'Deselect all'
85
+ }));
86
+ expect(onSelect).toHaveBeenLastCalledWith({
53
87
  dimensionId: 'ou',
54
88
  items: []
55
89
  });
@@ -18,6 +18,7 @@ const FixedPeriodFilter = ({
18
18
  }) => {
19
19
  const onlyAllowedTypeIsSelected = Array.isArray(allowedPeriodTypes) && allowedPeriodTypes.length === 1 && allowedPeriodTypes[0] === currentPeriodType;
20
20
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
21
+ "data-test": dataTest,
21
22
  className: `jsx-${styles.__hash}` + " " + "leftSection"
22
23
  }, /*#__PURE__*/React.createElement(SingleSelectField, {
23
24
  label: i18n.t('Period type'),
@@ -12,6 +12,7 @@ const RelativePeriodFilter = ({
12
12
  dataTest,
13
13
  excludedPeriodTypes
14
14
  }) => /*#__PURE__*/React.createElement("div", {
15
+ "data-test": dataTest,
15
16
  className: `jsx-${styles.__hash}` + " " + "leftSection"
16
17
  }, /*#__PURE__*/React.createElement(SingleSelectField, {
17
18
  label: i18n.t('Period type'),
@@ -21,12 +22,12 @@ const RelativePeriodFilter = ({
21
22
  dense: true,
22
23
  selected: currentFilter,
23
24
  className: "filterElement",
24
- dataTest: dataTest
25
+ dataTest: `${dataTest}-period-type`
25
26
  }, filterPeriodTypesById(getRelativePeriodsOptions(), excludedPeriodTypes).map(option => /*#__PURE__*/React.createElement(SingleSelectOption, {
26
27
  key: option.id,
27
28
  value: option.id,
28
29
  label: option.name,
29
- dataTest: `${dataTest}-option-${option.id}`
30
+ dataTest: `${dataTest}-period-type-option-${option.id}`
30
31
  }))), /*#__PURE__*/React.createElement(_JSXStyle, {
31
32
  id: styles.__hash
32
33
  }, styles));
@@ -1,24 +1,17 @@
1
- import { shallow } from 'enzyme';
1
+ import { render, screen } from '@testing-library/react';
2
2
  import React from 'react';
3
3
  import FixedPeriodSelect from '../FixedPeriodSelect.js';
4
- describe('The Fixed Period Single Select component', () => {
5
- let props;
6
- let shallowFixedPeriodSelect;
7
- const getWrapper = () => {
8
- if (!shallowFixedPeriodSelect) {
9
- shallowFixedPeriodSelect = shallow(/*#__PURE__*/React.createElement(FixedPeriodSelect, props));
10
- }
11
- return shallowFixedPeriodSelect;
4
+ test('FixedPeriodSelect renders correctly', () => {
5
+ const props = {
6
+ value: '201405',
7
+ onChange: () => {}
12
8
  };
13
- beforeEach(() => {
14
- props = {
15
- value: '201405',
16
- onChange: () => {}
17
- };
18
- shallowFixedPeriodSelect = undefined;
19
- });
20
- it('matches the snapshot', () => {
21
- const wrapper = getWrapper();
22
- expect(wrapper).toMatchSnapshot();
23
- });
9
+ render(/*#__PURE__*/React.createElement(FixedPeriodSelect, props));
10
+ expect(screen.getByTestId('dhis2-analytics-fixedperiodselect')).toBeInTheDocument();
11
+ expect(screen.getByText('Period type')).toBeInTheDocument();
12
+ expect(screen.getByText('Monthly')).toBeInTheDocument();
13
+ expect(screen.getByText('Year')).toBeInTheDocument();
14
+ const yearSelectEl = screen.getByPlaceholderText('Select year');
15
+ expect(yearSelectEl).toBeInTheDocument();
16
+ expect(yearSelectEl.value).toEqual('2014');
24
17
  });
@@ -1,4 +1,5 @@
1
- import { shallow } from 'enzyme';
1
+ import { render, screen } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
2
3
  import React from 'react';
3
4
  import PeriodDimension from '../PeriodDimension.js';
4
5
  jest.mock('@dhis2/app-runtime', () => ({
@@ -13,26 +14,29 @@ jest.mock('@dhis2/app-runtime', () => ({
13
14
  }
14
15
  })
15
16
  }));
17
+ global.ResizeObserver = jest.fn().mockImplementation(() => ({
18
+ observe: jest.fn(),
19
+ unobserve: jest.fn(),
20
+ disconnect: jest.fn()
21
+ }));
16
22
  afterEach(jest.clearAllMocks);
17
- describe('The Period Dimension component', () => {
18
- let props;
19
- let shallowPeriodDimension;
20
- const getWrapper = () => {
21
- if (!shallowPeriodDimension) {
22
- shallowPeriodDimension = shallow(/*#__PURE__*/React.createElement(PeriodDimension, props));
23
- }
24
- return shallowPeriodDimension;
25
- };
26
- beforeEach(() => {
27
- props = {
28
- selectedPeriods: [],
29
- onSelect: jest.fn(),
30
- rightFooter: /*#__PURE__*/React.createElement(React.Fragment, null)
31
- };
32
- shallowPeriodDimension = undefined;
33
- });
34
- it('matches the snapshot', () => {
35
- const wrapper = getWrapper();
36
- expect(wrapper).toMatchSnapshot();
37
- });
23
+ const props = {
24
+ selectedPeriods: [],
25
+ onSelect: jest.fn(),
26
+ rightFooter: /*#__PURE__*/React.createElement(React.Fragment, null)
27
+ };
28
+ test('PeriodDimension renders the tabs for relative/fixed with relative pre-selected', () => {
29
+ render(/*#__PURE__*/React.createElement(PeriodDimension, props));
30
+ expect(screen.getByText('Relative periods')).toBeInTheDocument();
31
+ expect(screen.getByTestId('period-dimension-relative-period-filter')).toBeInTheDocument();
32
+ expect(screen.getByText('Fixed periods')).toBeInTheDocument();
33
+ });
34
+ test('PeriodDimension can toggle between relative and fixed period tab', async () => {
35
+ const user = userEvent.setup();
36
+ render(/*#__PURE__*/React.createElement(PeriodDimension, props));
37
+ expect(screen.getByText('Relative periods')).toBeInTheDocument();
38
+ const fixedPeriodButton = screen.getByText('Fixed periods');
39
+ expect(fixedPeriodButton).toBeInTheDocument();
40
+ await user.click(fixedPeriodButton);
41
+ expect(screen.getByTestId('period-dimension-fixed-period-filter')).toBeInTheDocument();
38
42
  });
@@ -52,6 +52,9 @@ export const PivotTableColumnHeaderCell = ({
52
52
  className: `jsx-${cellStyle.__hash}` + " " + "column-header-inner"
53
53
  }, /*#__PURE__*/React.createElement("span", {
54
54
  "data-test": "visualization-column-header",
55
+ style: {
56
+ ...header.style
57
+ },
55
58
  className: `jsx-${cellStyle.__hash}` + " " + "column-header-label"
56
59
  }, header.label), isSortable ? /*#__PURE__*/React.createElement(PivotTableSortIcon, {
57
60
  index: index,
@@ -30,7 +30,8 @@ export const PivotTableRowHeaderCell = ({
30
30
  height,
31
31
  left: rowLevel > 0 ?
32
32
  // calculate the width of all row header cells on the left of current cell
33
- engine.adaptiveClippingController.columns.headerSizes.slice(0, rowLevel).reduce((width, acc) => acc += width, 0) : 0
33
+ engine.adaptiveClippingController.columns.headerSizes.slice(0, rowLevel).reduce((width, acc) => acc += width, 0) : 0,
34
+ ...header.style
34
35
  },
35
36
  dataTest: "visualization-row-header"
36
37
  }, header.label)
@@ -1,5 +1,5 @@
1
- import '@testing-library/jest-dom';
2
- import { render, screen, fireEvent } from '@testing-library/react';
1
+ import { render, screen } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
3
  import React from 'react';
4
4
  import { Editor } from '../Editor.js';
5
5
  const mockConvertCtrlKey = jest.fn();
@@ -20,16 +20,15 @@ describe('RichText: Editor component', () => {
20
20
  const renderComponent = props => {
21
21
  return render(/*#__PURE__*/React.createElement(Editor, props));
22
22
  };
23
- it('renders a result', () => {
23
+ test('renders a result', () => {
24
24
  renderComponent(componentProps);
25
25
  expect(screen.getByTestId('@dhis2-analytics-richtexteditor')).toBeVisible();
26
26
  });
27
- it('calls convertCtrlKey on keydown', () => {
27
+ test('calls convertCtrlKey on keydown', async () => {
28
+ const user = userEvent.setup();
28
29
  renderComponent(componentProps);
29
- fireEvent.keyDown(screen.getByRole('textbox'), {
30
- key: 'A',
31
- code: 'keyA'
32
- });
30
+ await user.click(screen.getByRole('textbox'));
31
+ await user.keyboard('A');
33
32
  expect(mockConvertCtrlKey).toHaveBeenCalled();
34
33
  });
35
34
  });
@@ -1,7 +1,7 @@
1
1
  import { MdParser } from '../MdParser.js';
2
2
  const Parser = new MdParser();
3
3
  describe('MdParser class', () => {
4
- it('converts text into HTML', () => {
4
+ test('converts text into HTML', () => {
5
5
  const inlineTests = [['_italic_', '<em>italic</em>'], ['*bold*', '<strong>bold</strong>'], ['_ not italic because there is a space _', '_ not italic because there is a space _'], [':-)', '<span>\u{1F642}</span>'], [':)', '<span>\u{1F642}</span>'], [':-(', '<span>\u{1F641}</span>'], [':(', '<span>\u{1F641}</span>'], [':+1', '<span>\u{1F44D}</span>'], [':-1', '<span>\u{1F44E}</span>'], ['mixed _italic_ *bold* and :+1', 'mixed <em>italic</em> <strong>bold</strong> and <span>\u{1F44D}</span>'], ['_italic with * inside_', '<em>italic with * inside</em>'], ['*bold with _ inside*', '<strong>bold with _ inside</strong>'],
6
6
  // italic marker followed by : should work
7
7
  ['_italic_:', '<em>italic</em>:'], ['_italic_: some text, *bold*: some other text', '<em>italic</em>: some text, <strong>bold</strong>: some other text'],
@@ -1,4 +1,4 @@
1
- import { shallow } from 'enzyme';
1
+ import { render, screen } from '@testing-library/react';
2
2
  import React from 'react';
3
3
  import { Parser } from '../Parser.js';
4
4
  jest.mock('../MdParser.js', () => ({
@@ -9,30 +9,29 @@ jest.mock('../MdParser.js', () => ({
9
9
  })
10
10
  }));
11
11
  describe('RichText: Parser component', () => {
12
- let richTextParser;
13
- const defaultProps = {
14
- style: {
12
+ test('should have rendered a result with the style prop', () => {
13
+ const style = {
15
14
  color: 'blue',
16
15
  whiteSpace: 'pre-line'
17
- }
18
- };
19
- const renderComponent = (props, text) => {
20
- return shallow(/*#__PURE__*/React.createElement(Parser, props, text));
21
- };
22
- it('should have rendered a result', () => {
23
- richTextParser = renderComponent({}, 'test');
24
- expect(richTextParser).toHaveLength(1);
25
- });
26
- it('should have rendered a result with the style prop', () => {
27
- richTextParser = renderComponent(defaultProps, 'test prop');
28
- expect(richTextParser.props().style).toEqual(defaultProps.style);
16
+ };
17
+ const {
18
+ container
19
+ } = render(/*#__PURE__*/React.createElement(Parser, {
20
+ style: style
21
+ }, 'test prop'));
22
+ const divEl = container.querySelector('div');
23
+ expect(divEl.style.color).toBe(style.color);
24
+ expect(divEl.style.whiteSpace).toBe(style.whiteSpace);
29
25
  });
30
- it('should have rendered content', () => {
31
- richTextParser = renderComponent({}, 'plain text');
32
- expect(richTextParser.html()).toEqual('<div>converted text</div>');
26
+ test('should have rendered content', () => {
27
+ render(/*#__PURE__*/React.createElement(Parser, null, 'plain text'));
28
+ expect(screen.getByText('converted text')).toBeInTheDocument();
33
29
  });
34
- it('should return null if no children is passed', () => {
35
- richTextParser = renderComponent({}, undefined);
36
- expect(richTextParser.html()).toBe(null);
30
+ test('should return null if no children is passed', () => {
31
+ const {
32
+ container
33
+ } = render(/*#__PURE__*/React.createElement(Parser, null));
34
+ const divEl = container.querySelector('div');
35
+ expect(divEl).toBe(null);
37
36
  });
38
37
  });
@@ -1,102 +1,112 @@
1
- import '@testing-library/jest-dom';
2
- import { render, fireEvent, screen } from '@testing-library/react';
3
- import { shallow } from 'enzyme';
1
+ import { render, screen } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
4
3
  import React from 'react';
5
4
  import { HoverMenuBar, HoverMenuDropdown, HoverMenuList, HoverMenuListItem } from '../index.js';
6
5
  describe('<HoverMenuBar/>', () => {
7
- it('renders children', () => {
6
+ test('renders children', () => {
8
7
  const childNode = 'text node';
9
- const wrapper = shallow(/*#__PURE__*/React.createElement(HoverMenuBar, null, childNode));
10
- expect(wrapper.containsMatchingElement(childNode)).toBe(true);
8
+ render(/*#__PURE__*/React.createElement(HoverMenuBar, null, childNode));
9
+ expect(screen.getByText(childNode)).toBeInTheDocument();
11
10
  });
12
- it('accepts a `dataTest` prop', () => {
11
+ test('accepts a `dataTest` prop', () => {
13
12
  const dataTest = 'test';
14
- const wrapper = shallow(/*#__PURE__*/React.createElement(HoverMenuBar, {
13
+ render(/*#__PURE__*/React.createElement(HoverMenuBar, {
15
14
  dataTest: dataTest
16
15
  }, "children"));
17
- expect(wrapper.find('div').prop('data-test')).toBe(dataTest);
16
+ expect(screen.getByTestId(dataTest)).toBeInTheDocument();
18
17
  });
19
18
  describe('mouse interactions', () => {
20
- it('does not open on hover before a dropdown anchor is clicked', async () => {
19
+ test('does not open on hover before a dropdown anchor is clicked', async () => {
20
+ const user = userEvent.setup();
21
21
  createFullMenuBarWrapper();
22
- fireEvent.mouseOver(screen.getByText('Menu A'));
22
+ await user.hover(screen.getByText('Menu A'));
23
23
  await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item A.2', false], ['Menu item A.3', false]]);
24
24
  });
25
- it('does not open when a disabled dropdown anchor is clicked', async () => {
25
+ test('does not open when a disabled dropdown anchor is clicked', async () => {
26
+ const user = userEvent.setup();
26
27
  createFullMenuBarWrapper();
27
- fireEvent.click(screen.getByText('Menu C'));
28
+ await user.click(screen.getByText('Menu C'));
28
29
  await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item A.2', false], ['Menu item A.3', false]]);
29
30
  });
30
- it('opens menu list when clicked', async () => {
31
+ test('opens menu list when clicked', async () => {
32
+ const user = userEvent.setup();
31
33
  createFullMenuBarWrapper();
32
- fireEvent.click(screen.getByText('Menu A'));
34
+ await user.click(screen.getByText('Menu A'));
33
35
  await expectMenuItemsInDocument([['Menu item A.1', true], ['Menu item B.1', false], ['Menu item C.1', false]]);
34
36
  });
35
- it('responds to hover once open', async () => {
37
+ test('responds to hover once open', async () => {
38
+ const user = userEvent.setup();
36
39
  createFullMenuBarWrapper();
37
- fireEvent.click(screen.getByText('Menu A'));
38
- fireEvent.mouseOver(screen.getByText('Menu B'));
40
+ await user.click(screen.getByText('Menu A'));
41
+ await user.hover(screen.getByText('Menu B'));
39
42
  await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item B.1', true], ['Menu item C.1', false]]);
40
43
  });
41
- it('does not open disabled dropdown on hover in hover mode', async () => {
44
+ test('does not open disabled dropdown on hover in hover mode', async () => {
45
+ const user = userEvent.setup();
42
46
  createFullMenuBarWrapper();
43
- fireEvent.click(screen.getByText('Menu B'));
44
- fireEvent.mouseOver(screen.getByText('Menu C'));
47
+ await user.click(screen.getByText('Menu B'));
48
+ await user.hover(screen.getByText('Menu C'));
45
49
  await expectMenuItemsInDocument([['Menu item B.1', true], ['Menu item C.1', false]]);
46
50
  });
47
- it('opens submenus when in hover mode', async () => {
51
+ test('opens submenus when in hover mode', async () => {
52
+ const user = userEvent.setup();
48
53
  createFullMenuBarWrapper();
49
- fireEvent.click(screen.getByText('Menu B'));
50
- fireEvent.mouseOver(screen.getByText('Menu item B.1'));
54
+ await user.click(screen.getByText('Menu B'));
55
+ await user.hover(screen.getByText('Menu item B.1'));
51
56
  await expectMenuItemsInDocument([['Menu item B.1.1', true], ['Menu item B.1.2', true], ['Menu item B.1.3', true], ['Menu item B.2.1', false], ['Menu item B.2.2', false], ['Menu item B.2.3', false]]);
52
- fireEvent.mouseOver(screen.getByText('Menu item B.2'));
57
+ await user.hover(screen.getByText('Menu item B.2'));
53
58
  await expectMenuItemsInDocument([['Menu item B.1.1', false], ['Menu item B.1.2', false], ['Menu item B.1.3', false], ['Menu item B.2.1', true], ['Menu item B.2.2', true], ['Menu item B.2.3', true]]);
54
59
  });
55
- it('does not open disabled submenus when in hover mode', async () => {
60
+ test('does not open disabled submenus when in hover mode', async () => {
61
+ const user = userEvent.setup();
56
62
  createFullMenuBarWrapper();
57
- fireEvent.click(screen.getByText('Menu B'));
58
- fireEvent.mouseOver(screen.getByText('Menu item B.2'));
63
+ await user.click(screen.getByText('Menu B'));
64
+ await user.hover(screen.getByText('Menu item B.2'));
59
65
  await expectMenuItemsInDocument([['Menu item B.2.1', true], ['Menu item B.2.2', true], ['Menu item B.2.3', true], ['Menu item B.3.1', false], ['Menu item B.3.2', false], ['Menu item B.3.3', false]]);
60
- fireEvent.mouseOver(screen.getByText('Menu item B.3'));
66
+ await user.hover(screen.getByText('Menu item B.3'));
61
67
  await expectMenuItemsInDocument([['Menu item B.2.1', true], ['Menu item B.2.2', true], ['Menu item B.2.3', true], ['Menu item B.3.1', false], ['Menu item B.3.2', false], ['Menu item B.3.3', false]]);
62
68
  });
63
- it('closes when clicking on then document', async () => {
69
+ test('closes when clicking on then document', async () => {
70
+ const user = userEvent.setup();
64
71
  createFullMenuBarWrapper();
65
- fireEvent.click(screen.getByText('Menu A'));
72
+ await user.click(screen.getByText('Menu A'));
66
73
  await expectMenuItemsInDocument([['Menu item A.1', true]]);
67
- fireEvent.click(document);
74
+ await user.click(document.body);
68
75
  await expectMenuItemsInDocument([['Menu item A.1', false]]);
69
76
  });
70
- it('stays open when clicking a open submenu anchor', async () => {
77
+ test('stays open when clicking a open submenu anchor', async () => {
78
+ const user = userEvent.setup();
71
79
  createFullMenuBarWrapper();
72
- fireEvent.click(screen.getByText('Menu B'));
80
+ await user.click(screen.getByText('Menu B'));
73
81
  await expectMenuItemsInDocument([['Menu item B.1', true]]);
74
- fireEvent.mouseOver(screen.getByText('Menu item B.1'));
82
+ await user.hover(screen.getByText('Menu item B.1'));
75
83
  await expectMenuItemsInDocument([['Menu item B.1', true], ['Menu item B.1.1', true], ['Menu item B.1.2', true], ['Menu item B.1.3', true]]);
76
- fireEvent.click(screen.getByText('Menu item B.1'));
84
+ await user.click(screen.getByText('Menu item B.1'));
77
85
  await expectMenuItemsInDocument([['Menu item B.1', true], ['Menu item B.1.1', true], ['Menu item B.1.2', true], ['Menu item B.1.3', true]]);
78
86
  });
79
- it('calls the onClick of the menu item and closes when clicking a menu item', async () => {
87
+ test('calls the onClick of the menu item and closes when clicking a menu item', async () => {
88
+ const user = userEvent.setup();
80
89
  const menuItemOnClickSpy = jest.fn();
81
90
  createFullMenuBarWrapper({
82
91
  menuItemOnClickSpy
83
92
  });
84
- fireEvent.click(screen.getByText('Menu A'));
93
+ await user.click(screen.getByText('Menu A'));
85
94
  await expectMenuItemsInDocument([['Menu item A.1', true]]);
86
- fireEvent.click(screen.getByText('Menu item A.1'));
95
+ await user.click(screen.getByText('Menu item A.1'));
87
96
  expect(menuItemOnClickSpy).toHaveBeenCalledTimes(1);
88
97
  await expectMenuItemsInDocument([['Menu item A.1', false]]);
89
98
  });
90
- it('calls the onClick of the menu item and closes when clicking a submenu item', async () => {
99
+ test('calls the onClick of the menu item and closes when clicking a submenu item', async () => {
100
+ const user = userEvent.setup();
91
101
  const subMenuItemOnClickSpy = jest.fn();
92
102
  createFullMenuBarWrapper({
93
103
  subMenuItemOnClickSpy
94
104
  });
95
- fireEvent.click(screen.getByText('Menu B'));
105
+ await user.click(screen.getByText('Menu B'));
96
106
  await expectMenuItemsInDocument([['Menu item B.1', true]]);
97
- fireEvent.mouseOver(screen.getByText('Menu item B.1'));
107
+ await user.hover(screen.getByText('Menu item B.1'));
98
108
  await expectMenuItemsInDocument([['Menu item B.1.1', true]]);
99
- fireEvent.click(screen.getByText('Menu item B.1.1'));
109
+ await user.click(screen.getByText('Menu item B.1.1'));
100
110
  expect(subMenuItemOnClickSpy).toHaveBeenCalledTimes(1);
101
111
  await expectMenuItemsInDocument([['Menu item B.1', false], ['Menu item B.1.1', false], ['Menu item B.1.1', false]]);
102
112
  });