@icij/murmur-next 4.0.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 (296) hide show
  1. package/.github/workflows/deploy-github-pages.yaml +50 -0
  2. package/.storybook/app.scss +14 -0
  3. package/.storybook/doc_variables.scss +20 -0
  4. package/.storybook/main.ts +35 -0
  5. package/.storybook/preview-head.html +2 -0
  6. package/.storybook/preview.ts +32 -0
  7. package/README.md +71 -0
  8. package/deploy.js +15 -0
  9. package/docs/components/ApiTable.vue +171 -0
  10. package/docs/components/App.vue +146 -0
  11. package/docs/components/CollapsibleBlock.vue +122 -0
  12. package/docs/components/DocsHeader.vue +68 -0
  13. package/docs/components/DocsMenu.vue +201 -0
  14. package/docs/components/DocsMenuSection.vue +109 -0
  15. package/docs/components/EditLink.vue +49 -0
  16. package/docs/components/OutboundLink.vue +13 -0
  17. package/docs/components/PalettePresenter.vue +96 -0
  18. package/docs/components/RepositoryLink.vue +28 -0
  19. package/docs/components/SampleCard.vue +119 -0
  20. package/docs/main.js +42 -0
  21. package/docs/pages/components/accordion/doc.md +96 -0
  22. package/docs/pages/components/active-text-truncate/doc.md +44 -0
  23. package/docs/pages/components/advanced-link-form/doc.md +105 -0
  24. package/docs/pages/components/brand/doc.md +30 -0
  25. package/docs/pages/components/brand-expansion/doc.md +70 -0
  26. package/docs/pages/components/confirm-button/doc.md +91 -0
  27. package/docs/pages/components/content-placeholder/doc.md +16 -0
  28. package/docs/pages/components/custom-pagination/doc.md +61 -0
  29. package/docs/pages/components/digits-input/doc.md +28 -0
  30. package/docs/pages/components/donate-form/doc.md +20 -0
  31. package/docs/pages/components/embed-form/doc.md +22 -0
  32. package/docs/pages/components/embeddable-footer/doc.md +60 -0
  33. package/docs/pages/components/follow-us-popover/doc.md +5 -0
  34. package/docs/pages/components/generic-footer/doc.md +21 -0
  35. package/docs/pages/components/generic-header/doc.md +24 -0
  36. package/docs/pages/components/haptic-copy/doc.md +27 -0
  37. package/docs/pages/components/imddb-header/doc.md +23 -0
  38. package/docs/pages/components/ordinal-legend/doc.md +44 -0
  39. package/docs/pages/components/range-picker/doc.md +86 -0
  40. package/docs/pages/components/responsive-iframe/doc.md +13 -0
  41. package/docs/pages/components/scale-legend/doc.md +65 -0
  42. package/docs/pages/components/secret-input/doc.md +12 -0
  43. package/docs/pages/components/selectable-dropdown/doc.md +156 -0
  44. package/docs/pages/components/sharing-options/doc.md +13 -0
  45. package/docs/pages/components/sharing-options-link/doc.md +36 -0
  46. package/docs/pages/components/sign-up-form/doc.md +13 -0
  47. package/docs/pages/components/slide-up-down/doc.md +28 -0
  48. package/docs/pages/components/textured-deck/doc.md +78 -0
  49. package/docs/pages/components/tiny-pagination/doc.md +92 -0
  50. package/docs/pages/datavisualisation/bars/doc.md +110 -0
  51. package/docs/pages/datavisualisation/columns/doc.md +165 -0
  52. package/docs/pages/datavisualisation/lines/doc.md +139 -0
  53. package/docs/pages/datavisualisation/stacked-bar/doc.md +160 -0
  54. package/docs/pages/datavisualisation/stacked-column/doc.md +191 -0
  55. package/docs/pages/getting-started/about-icij/doc.md +13 -0
  56. package/docs/pages/getting-started/custom-bootstrap/doc.md +36 -0
  57. package/docs/pages/getting-started/installation-guide/doc.md +59 -0
  58. package/docs/pages/getting-started/internationalization/doc.md +74 -0
  59. package/docs/pages/maps/choropleth-map/doc.md +420 -0
  60. package/docs/pages/maps/choropleth-map-annotation/doc.md +373 -0
  61. package/docs/pages/maps/symbol-map/doc.md +203 -0
  62. package/docs/pages/structure/breakpoints/doc.md +3 -0
  63. package/docs/pages/structure/grid/doc.md +3 -0
  64. package/docs/pages/utilities/assets/doc.md +138 -0
  65. package/docs/pages/utilities/config/doc.md +52 -0
  66. package/docs/pages/utilities/iframes/doc.md +3 -0
  67. package/docs/pages/visual/colors/doc.md +31 -0
  68. package/docs/pages/visual/iconography/doc.md +56 -0
  69. package/docs/pages/visual/states/doc.md +77 -0
  70. package/docs/pages/visual/themes/doc.md +3 -0
  71. package/docs/pages/visual/typography/doc.md +71 -0
  72. package/docs/routes.js +25 -0
  73. package/docs/store/index.js +21 -0
  74. package/docs/styles/app.scss +36 -0
  75. package/docs/styles/variables.scss +20 -0
  76. package/lib/assets/images/icij-full-white.svg +6 -0
  77. package/lib/assets/images/icij-full.svg +6 -0
  78. package/lib/assets/images/icij.png +0 -0
  79. package/lib/assets/images/icij.svg +46 -0
  80. package/lib/assets/images/icij@2x.png +0 -0
  81. package/lib/assets/images/murmur-dark.png +0 -0
  82. package/lib/assets/images/murmur-dark.svg +79 -0
  83. package/lib/assets/images/murmur-white.png +0 -0
  84. package/lib/assets/images/murmur-white.svg +68 -0
  85. package/lib/components/AccordionStep.vue +128 -0
  86. package/lib/components/AccordionWrapper.vue +138 -0
  87. package/lib/components/ActiveTextTruncate.vue +258 -0
  88. package/lib/components/AdvancedLinkForm.vue +273 -0
  89. package/lib/components/Brand.vue +150 -0
  90. package/lib/components/BrandExpansion.vue +237 -0
  91. package/lib/components/ConfirmButton.vue +204 -0
  92. package/lib/components/ContentPlaceholder.vue +100 -0
  93. package/lib/components/CustomPagination.vue +225 -0
  94. package/lib/components/DigitsInput.vue +180 -0
  95. package/lib/components/DonateForm.vue +367 -0
  96. package/lib/components/EmbedForm.vue +173 -0
  97. package/lib/components/EmbeddableFooter.vue +201 -0
  98. package/lib/components/Fa.js +3 -0
  99. package/lib/components/FollowUsPopover.vue +117 -0
  100. package/lib/components/GenericFooter.vue +218 -0
  101. package/lib/components/GenericHeader.vue +259 -0
  102. package/lib/components/HapticCopy.vue +256 -0
  103. package/lib/components/ImddbHeader.vue +336 -0
  104. package/lib/components/OrdinalLegend.vue +164 -0
  105. package/lib/components/RangePicker.vue +430 -0
  106. package/lib/components/ResponsiveIframe.vue +48 -0
  107. package/lib/components/ScaleLegend.vue +230 -0
  108. package/lib/components/SecretInput.vue +132 -0
  109. package/lib/components/SelectableDropdown.vue +368 -0
  110. package/lib/components/SharingOptions.vue +230 -0
  111. package/lib/components/SharingOptionsLink.vue +259 -0
  112. package/lib/components/SignUpForm.vue +181 -0
  113. package/lib/components/SlideUpDown.vue +131 -0
  114. package/lib/components/TexturedDeck.vue +101 -0
  115. package/lib/components/TinyPagination.vue +268 -0
  116. package/lib/components/index.js +31 -0
  117. package/lib/composables/chart.ts +182 -0
  118. package/lib/composables/resizeObserver.ts +37 -0
  119. package/lib/composables/sendEmail.ts +50 -0
  120. package/lib/config.default.ts +33 -0
  121. package/lib/config.ts +70 -0
  122. package/lib/d3-geo-projection.d.ts +1 -0
  123. package/lib/datavisualisations/BarChart.vue +275 -0
  124. package/lib/datavisualisations/ColumnChart.vue +527 -0
  125. package/lib/datavisualisations/LineChart.vue +274 -0
  126. package/lib/datavisualisations/StackedBarChart.vue +614 -0
  127. package/lib/datavisualisations/StackedColumnChart.vue +640 -0
  128. package/lib/datavisualisations/index.js +5 -0
  129. package/lib/enums.ts +25 -0
  130. package/lib/i18n.ts +16 -0
  131. package/lib/keys.ts +2 -0
  132. package/lib/locales/en.json +140 -0
  133. package/lib/locales/fr.json +117 -0
  134. package/lib/locales/locales/en.json +140 -0
  135. package/lib/locales/locales/fr.json +117 -0
  136. package/lib/main.ts +87 -0
  137. package/lib/maps/ChoroplethMap.vue +825 -0
  138. package/lib/maps/ChoroplethMapAnnotation.vue +336 -0
  139. package/lib/maps/SymbolMap.vue +628 -0
  140. package/lib/maps/index.js +3 -0
  141. package/lib/querystring-es3.d.ts +1 -0
  142. package/lib/shims-bootstrap-vue.d.ts +5 -0
  143. package/lib/shims-tsx.d.ts +11 -0
  144. package/lib/shims-vue.d.ts +14 -0
  145. package/lib/styles/functions.scss +20 -0
  146. package/lib/styles/lib.scss +19 -0
  147. package/lib/styles/mixins.scss +37 -0
  148. package/lib/styles/utilities.scss +18 -0
  149. package/lib/styles/variables.scss +94 -0
  150. package/lib/styles/variables_dark.scss +1 -0
  151. package/lib/types.ts +46 -0
  152. package/lib/utils/animation.ts +24 -0
  153. package/lib/utils/assets.ts +46 -0
  154. package/lib/utils/clipboard.ts +41 -0
  155. package/lib/utils/iframe-resizer.ts +49 -0
  156. package/lib/utils/placeholder.ts +66 -0
  157. package/lib/utils/placeholderTypes.ts +21 -0
  158. package/lib/utils/strings.ts +8 -0
  159. package/loaders/highlight-loader.js +13 -0
  160. package/loaders/markdown-loader.js +91 -0
  161. package/loaders/metadata-loader.js +18 -0
  162. package/loaders/sass-extract-loader.js +14 -0
  163. package/loaders/vue-docgen-loader.js +14 -0
  164. package/package.json +96 -0
  165. package/plugins/MdPluginTypes.ts +10 -0
  166. package/plugins/docs.ts +50 -0
  167. package/plugins/front-matter.ts +36 -0
  168. package/plugins/highlight.ts +27 -0
  169. package/plugins/markdown-it/api-table.ts +25 -0
  170. package/plugins/markdown-it/sample-card.ts +31 -0
  171. package/plugins/plugin-delete.ts +47 -0
  172. package/plugins/plugin-docgen.ts +23 -0
  173. package/plugins/sass-vars.ts +25 -0
  174. package/plugins/vue-docgen.ts +29 -0
  175. package/public/android-chrome-192x192.png +0 -0
  176. package/public/android-chrome-512x512.png +0 -0
  177. package/public/apple-touch-icon.png +0 -0
  178. package/public/assets/img/arrow-bottom.svg +3 -0
  179. package/public/assets/img/texture-brick-black.jpg +0 -0
  180. package/public/assets/img/texture-brick.jpg +0 -0
  181. package/public/assets/img/texture-carbon-black.jpg +0 -0
  182. package/public/assets/img/texture-carbon.jpg +0 -0
  183. package/public/assets/img/texture-crack-black.jpg +0 -0
  184. package/public/assets/img/texture-crack.jpg +0 -0
  185. package/public/assets/img/texture-rock-black.jpg +0 -0
  186. package/public/assets/img/texture-rock.jpg +0 -0
  187. package/public/assets/img/texture-sand-black.jpg +0 -0
  188. package/public/assets/img/texture-sand.jpg +0 -0
  189. package/public/assets/img/texture-silk-black.jpg +0 -0
  190. package/public/assets/img/texture-silk.jpg +0 -0
  191. package/public/assets/topojson/france-departments.json +1 -0
  192. package/public/assets/topojson/paris-arrondissements.json +1 -0
  193. package/public/assets/topojson/world-countries-sans-antarctica.json +1 -0
  194. package/public/favicon-16x16.png +0 -0
  195. package/public/favicon-32x32.png +0 -0
  196. package/public/favicon.ico +0 -0
  197. package/public/site.webmanifest +1 -0
  198. package/stories/assets/code-brackets.svg +1 -0
  199. package/stories/assets/colors.svg +1 -0
  200. package/stories/assets/comments.svg +1 -0
  201. package/stories/assets/direction.svg +1 -0
  202. package/stories/assets/flow.svg +1 -0
  203. package/stories/assets/plugin.svg +1 -0
  204. package/stories/assets/repo.svg +1 -0
  205. package/stories/assets/stackalt.svg +1 -0
  206. package/stories/getting-started/about-icij.mdx +14 -0
  207. package/stories/getting-started/custom-bootstrap.mdx +23 -0
  208. package/stories/getting-started/installation-guide.mdx +62 -0
  209. package/stories/getting-started/internationalization.mdx +63 -0
  210. package/stories/murmur/components/AccordionStep.stories.ts +33 -0
  211. package/stories/murmur/components/AccordionWrapper.stories.ts +69 -0
  212. package/stories/murmur/components/ActiveTextTruncate.stories.ts +32 -0
  213. package/stories/murmur/components/AdvancedLinkForm.stories.ts +77 -0
  214. package/stories/murmur/components/Brand.stories.ts +30 -0
  215. package/stories/murmur/components/BrandExpansion.stories.ts +41 -0
  216. package/stories/murmur/components/ConfirmButton.stories.ts +40 -0
  217. package/stories/murmur/components/ContentPlaceholder.stories.ts +41 -0
  218. package/stories/murmur/components/CustomPagination.stories.ts +42 -0
  219. package/stories/murmur/components/DigitsInput.stories.ts +29 -0
  220. package/stories/murmur/components/DonateForm.stories.ts +29 -0
  221. package/stories/murmur/components/EmbedForm.stories.ts +35 -0
  222. package/stories/murmur/components/EmbeddableFooter.stories.ts +59 -0
  223. package/stories/murmur/components/FollowUsPopover.stories.ts +24 -0
  224. package/stories/murmur/components/GenericFooter.stories.ts +27 -0
  225. package/stories/murmur/components/GenericHeader.stories.ts +27 -0
  226. package/stories/murmur/components/HapticCopy.stories.ts +40 -0
  227. package/stories/murmur/components/ImddbHeader.stories.ts +27 -0
  228. package/stories/murmur/components/OrdinalLegend.stories.ts +49 -0
  229. package/stories/murmur/components/RangePicker.stories.ts +98 -0
  230. package/stories/murmur/components/ResponsiveIframe.stories.ts +24 -0
  231. package/stories/murmur/components/ScaleLegend.stories.ts +65 -0
  232. package/stories/murmur/components/SecretInput.stories.ts +60 -0
  233. package/stories/murmur/components/SelectableDropdown.stories.ts +143 -0
  234. package/stories/murmur/components/SharingOptions.stories.ts +32 -0
  235. package/stories/murmur/components/SharingOptionsLink.stories.ts +53 -0
  236. package/stories/murmur/components/SignUpForm.stories.ts +51 -0
  237. package/stories/murmur/components/SlideUpDown.stories.ts +32 -0
  238. package/stories/murmur/components/TexturedDeck.stories.ts +83 -0
  239. package/stories/murmur/components/TinyPagination.stories.ts +65 -0
  240. package/stories/murmur/datavisualisations/BarChart.stories.ts +54 -0
  241. package/stories/murmur/datavisualisations/ColumnChart.stories.ts +88 -0
  242. package/stories/murmur/datavisualisations/LineChart.stories.ts +139 -0
  243. package/stories/murmur/datavisualisations/StackedBarChart.stories.ts +199 -0
  244. package/stories/murmur/datavisualisations/StackedColumnChart.stories.ts +136 -0
  245. package/stories/murmur/decorators.ts +108 -0
  246. package/stories/murmur/maps/ChoroplethMap.stories.ts +440 -0
  247. package/stories/murmur/maps/ChoroplethMapAnnotation.stories.ts +26 -0
  248. package/stories/murmur/maps/SymbolMap.stories.ts +24 -0
  249. package/stories/murmur/utils.ts +7 -0
  250. package/tests/unit/components/AccordionStep.spec.ts +157 -0
  251. package/tests/unit/components/AccordionWrapper.spec.ts +57 -0
  252. package/tests/unit/components/ActiveTextTruncate.spec.js +30 -0
  253. package/tests/unit/components/AdvancedLinkForm.spec.js +124 -0
  254. package/tests/unit/components/Brand.spec.js +50 -0
  255. package/tests/unit/components/ContentPlaceholder.spec.js +29 -0
  256. package/tests/unit/components/CustomPagination.spec.js +72 -0
  257. package/tests/unit/components/DigitsInput.spec.ts +157 -0
  258. package/tests/unit/components/DonateForm.spec.js +149 -0
  259. package/tests/unit/components/EmbedForm.spec.js +108 -0
  260. package/tests/unit/components/EmbeddableFooter.spec.js +11 -0
  261. package/tests/unit/components/Fa.spec.js +18 -0
  262. package/tests/unit/components/FollowUsPopover.spec.js +29 -0
  263. package/tests/unit/components/GenericFooter.spec.js +29 -0
  264. package/tests/unit/components/GenericHeader.spec.js +104 -0
  265. package/tests/unit/components/HapticCopy.spec.js +123 -0
  266. package/tests/unit/components/ImddbHeader.spec.js +96 -0
  267. package/tests/unit/components/OrdinalLegend.spec.js +120 -0
  268. package/tests/unit/components/RangePicker.spec.ts +87 -0
  269. package/tests/unit/components/ResponsiveIframe.spec.js +20 -0
  270. package/tests/unit/components/ScaleLegend.spec.js +139 -0
  271. package/tests/unit/components/SecretInput.spec.js +81 -0
  272. package/tests/unit/components/SelectableDropdown.spec.js +160 -0
  273. package/tests/unit/components/SharingOptions.spec.js +125 -0
  274. package/tests/unit/components/SharingOptionsLink.spec.js +184 -0
  275. package/tests/unit/components/SignUpForm.spec.js +145 -0
  276. package/tests/unit/components/SlideUpDown.spec.js +59 -0
  277. package/tests/unit/components/TinyPagination.spec.js +46 -0
  278. package/tests/unit/config.spec.js +136 -0
  279. package/tests/unit/datavisualisations/BarChart.spec.js +63 -0
  280. package/tests/unit/datavisualisations/ColumnChart.spec.js +344 -0
  281. package/tests/unit/datavisualisations/LineChart.spec.js +155 -0
  282. package/tests/unit/datavisualisations/StackedBarChart.spec.js +294 -0
  283. package/tests/unit/datavisualisations/StackedColumnChart.spec.js +443 -0
  284. package/tests/unit/i18n.spec.ts +19 -0
  285. package/tests/unit/main.spec.js +82 -0
  286. package/tests/unit/maps/ChoroplethMap.spec.js +214 -0
  287. package/tests/unit/maps/ChoroplethMapAnnotation.spec.ts +186 -0
  288. package/tests/unit/maps/SymbolMap.spec.js +92 -0
  289. package/tests/unit/require.spec.js +22 -0
  290. package/tests/unit/setup.js +13 -0
  291. package/tests/unit/utils/assets.spec.js +61 -0
  292. package/tests/unit/utils/clipboard.spec.js +18 -0
  293. package/tests/unit/utils/iframe-resizer.spec.js +71 -0
  294. package/tsconfig.json +35 -0
  295. package/vite.config.ts +79 -0
  296. package/vitest.config.ts +19 -0
@@ -0,0 +1,443 @@
1
+ import { mount } from '@vue/test-utils'
2
+ import StackedColumnChart from '@/datavisualisations/StackedColumnChart.vue'
3
+
4
+ // Mock HTML element offset so the size of the chart can be calculated
5
+ // dynamicly using JSDOM and tests
6
+ Object.defineProperties(window.HTMLElement.prototype, {
7
+ offsetWidth: {
8
+ get () { return parseFloat(this.style.width) || 0 }
9
+ },
10
+ offsetHeight: {
11
+ get () { return parseFloat(this.style.height) || 0 }
12
+ }
13
+ })
14
+
15
+
16
+
17
+ describe('StackedColumnChart.vue', () => {
18
+ const createContainer = (tag = 'div') => {
19
+ const container = document.createElement(tag)
20
+ document.body.appendChild(container)
21
+ return container
22
+ }
23
+
24
+ describe('a stacked-colmuns chart with two columns in four groups and direct labeling', () => {
25
+ let wrapper
26
+
27
+ beforeEach(async () => {
28
+ vi.useFakeTimers()
29
+
30
+ const propsData = {
31
+ highlightDelay: 2,
32
+ data: [
33
+ { date: 2006, foo: 90, bar: 10 },
34
+ { date: 2007, foo: 80, bar: 10 },
35
+ { date: 2008, foo: 70, bar: 10 },
36
+ { date: 2009, foo: 60, bar: 10 }
37
+ ]
38
+ }
39
+
40
+ wrapper = mount(StackedColumnChart, { propsData, attachTo: createContainer() })
41
+ })
42
+
43
+ afterEach(async () => {
44
+ await vi.runAllTimersAsync()
45
+ vi.useRealTimers()
46
+ })
47
+
48
+ it('is a Vue instance', () => {
49
+ expect(wrapper.vm).toBeTruthy()
50
+ })
51
+
52
+ it('creates four columns', async () => {
53
+ expect(wrapper.findAll('.stacked-column-chart__groups__item')).toHaveLength(4)
54
+ })
55
+
56
+ it('creates the first group of columns with maximum height', () => {
57
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
58
+ const fooColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
59
+ const barColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
60
+ const totalHeight = fooColumn.element.offsetHeight + barColumn.element.offsetHeight
61
+ expect(totalHeight).toBe(100)
62
+ })
63
+
64
+ it('creates the second group of columns with ~90% height', () => {
65
+ const secondGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(1)
66
+ const fooColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
67
+ const barColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
68
+ const totalHeight = fooColumn.element.offsetHeight + barColumn.element.offsetHeight
69
+ expect(totalHeight).toBe(90)
70
+ })
71
+
72
+ it('creates the third group of columns with ~80% height', () => {
73
+ const secondGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(2)
74
+ const fooColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
75
+ const barColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
76
+ const totalHeight = fooColumn.element.offsetHeight + barColumn.element.offsetHeight
77
+ expect(totalHeight).toBe(80)
78
+ })
79
+
80
+ it('creates the first group of columns with `foo` taking 90% height', () => {
81
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
82
+ const fooColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
83
+ const width = fooColumn.element.offsetHeight
84
+ expect(width).toBe(90)
85
+ })
86
+
87
+ it('creates the first group of columns with `bar` taking 10% height', () => {
88
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
89
+ const barColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
90
+ const width = barColumn.element.offsetHeight
91
+ expect(width).toBe(10)
92
+ })
93
+
94
+ it('creates the first group with "2006" as label', () => {
95
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
96
+ const label = firstGroup.find('.stacked-column-chart__groups__item__label')
97
+ expect(label.text()).toBe("2006")
98
+ })
99
+
100
+ it('creates the second group with "2007" as label', () => {
101
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(1)
102
+ const label = firstGroup.find('.stacked-column-chart__groups__item__label')
103
+ expect(label.text()).toBe("2007")
104
+ })
105
+
106
+ it('creates the first group with "2009" as label when ordered by "foo"', async () => {
107
+ await wrapper.setProps({ sortBy: 'foo' })
108
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
109
+ const label = firstGroup.find('.stacked-column-chart__groups__item__label')
110
+ expect(label.text()).toBe("2009")
111
+ })
112
+
113
+ it('creates a legend with "foo" and "bar" items', () => {
114
+ const fooLegend = wrapper.findAll('.stacked-column-chart__legend__item').at(0)
115
+ const barLegend = wrapper.findAll('.stacked-column-chart__legend__item').at(1)
116
+ expect(fooLegend.text()).toBe("foo")
117
+ expect(barLegend.text()).toBe("bar")
118
+ })
119
+
120
+ it('hightlight the legend "foo"', async () => {
121
+ const fooLegend = wrapper.findAll('.stacked-column-chart__legend__item').at(0)
122
+ expect(fooLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeFalsy()
123
+ await fooLegend.trigger('mouseover')
124
+ await vi.advanceTimersByTimeAsync(wrapper.vm.highlightDelay + 10)
125
+ expect(fooLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeTruthy()
126
+ })
127
+
128
+ it('hightlight the columns for "foo"', async () => {
129
+ const fooLegend = wrapper.findAll('.stacked-column-chart__legend__item').at(0)
130
+ await fooLegend.trigger('mouseover')
131
+ await vi.advanceTimersByTimeAsync(wrapper.vm.highlightDelay)
132
+ const fooColumns = wrapper.findAll('.stacked-column-chart__groups__item__bars__item--foo')
133
+ expect(fooColumns.at(0).classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
134
+ expect(fooColumns.at(1).classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
135
+ expect(fooColumns.at(2).classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
136
+ expect(fooColumns.at(3).classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
137
+ })
138
+
139
+ it('hightlight the columns for "bar"', async () => {
140
+ const barLegend = wrapper.findAll('.stacked-column-chart__legend__item').at(1)
141
+ await barLegend.trigger('mouseover')
142
+ await vi.advanceTimersByTimeAsync(wrapper.vm.highlightDelay)
143
+ const budgetBars = wrapper.findAll('.stacked-column-chart__groups__item__bars__item--bar')
144
+ expect(budgetBars.at(0).classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
145
+ expect(budgetBars.at(1).classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
146
+ expect(budgetBars.at(2).classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
147
+ expect(budgetBars.at(3).classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
148
+ })
149
+
150
+ it('hightlight the legend "foo" on mouseover and "bar" by default', async () => {
151
+ await wrapper.setProps({ highlights: ['bar'] })
152
+ const fooLegend = wrapper.findAll('.stacked-column-chart__legend__item').at(0)
153
+ const barLegend = wrapper.findAll('.stacked-column-chart__legend__item').at(1)
154
+ expect(fooLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeFalsy()
155
+ expect(barLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeTruthy()
156
+ await fooLegend.trigger('mouseover')
157
+ await vi.advanceTimersByTimeAsync(wrapper.vm.highlightDelay)
158
+ expect(fooLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeTruthy()
159
+ expect(barLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeFalsy()
160
+ })
161
+
162
+ it('hightlight the columns for "bar" after a while', async () => {
163
+ const barLegend = wrapper.findAll('.stacked-column-chart__legend__item').at(1)
164
+ await wrapper.setProps({ highlightDelay: 150 })
165
+ await barLegend.trigger('mouseover')
166
+ expect(barLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeFalsy()
167
+ await vi.advanceTimersByTimeAsync(wrapper.vm.highlightDelay / 2)
168
+ expect(barLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeFalsy()
169
+ await vi.advanceTimersByTimeAsync(wrapper.vm.highlightDelay * 2)
170
+ expect(barLegend.classes('stacked-column-chart__legend__item--highlighted')).toBeTruthy()
171
+ })
172
+
173
+ it('hightlight the whole "2006" column', async () => {
174
+ await wrapper.setProps({ columnHighlights: [2006] })
175
+ const foo = wrapper.findAll('.stacked-column-chart__groups__item__bars__item').at(0)
176
+ const bar = wrapper.findAll('.stacked-column-chart__groups__item__bars__item').at(1)
177
+ expect(foo.classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
178
+ expect(bar.classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
179
+ })
180
+
181
+ it('hightlight the whole "2009" column', async () => {
182
+ await wrapper.setProps({ columnHighlights: [2009] })
183
+ const foo = wrapper.findAll('.stacked-column-chart__groups__item__bars__item').at(6)
184
+ const bar = wrapper.findAll('.stacked-column-chart__groups__item__bars__item').at(7)
185
+ expect(foo.classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
186
+ expect(bar.classes('stacked-column-chart__groups__item__bars__item--highlighted')).toBeTruthy()
187
+ })
188
+
189
+ it('creates columns with specific colors', async () => {
190
+ await wrapper.setProps({ barColors: [ "#000", "#444" ] })
191
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
192
+ const fooColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
193
+ const barColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
194
+ expect(fooColumn.element.style['background-color']).toBe('rgb(0, 0, 0)')
195
+ expect(barColumn.element.style['background-color']).toBe('rgb(68, 68, 68)')
196
+ })
197
+
198
+ it('creates legend with specific colors', async () => {
199
+ await wrapper.setProps({ barColors: [ "#000", "#444" ] })
200
+ const legendBoxes = wrapper.findAll('.stacked-column-chart__legend__item__box')
201
+ const budgetBox = legendBoxes.at(0)
202
+ const boxOfficeBox = legendBoxes.at(1)
203
+ expect(budgetBox.element.style['background-color']).toBe('rgb(0, 0, 0)')
204
+ expect(boxOfficeBox.element.style['background-color']).toBe('rgb(68, 68, 68)')
205
+ })
206
+
207
+ it('creates one legend when using explicite keys', async () => {
208
+ await wrapper.setProps({ keys: [ "foo" ] })
209
+ const legendItems = wrapper.findAll('.stacked-column-chart__legend__item')
210
+ expect(legendItems).toHaveLength(1)
211
+ })
212
+
213
+ it('creates one bar when using explicite keys', async () => {
214
+ await wrapper.setProps({ keys: [ "foo" ] })
215
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
216
+ const columns = firstGroup.findAll('.stacked-column-chart__groups__item__bars__item')
217
+ expect(columns).toHaveLength(1)
218
+ })
219
+
220
+ it('creates legend with custom group names', async () => {
221
+ await wrapper.setProps({ groups: [ "Foo", "Bar" ] })
222
+ const legendItems = wrapper.findAll('.stacked-column-chart__legend__item')
223
+ expect(legendItems.at(0).text()).toBe("Foo")
224
+ expect(legendItems.at(1).text()).toBe("Bar")
225
+ })
226
+
227
+ it('creates bar direct labeling without formatting', async () => {
228
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
229
+ const values = firstGroup.findAll('.stacked-column-chart__groups__item__bars__item__value')
230
+ expect(values.at(0).text()).toBe('90')
231
+ expect(values.at(1).text()).toBe('10')
232
+ })
233
+
234
+ it('creates bar direct labeling without with currency formatting', async () => {
235
+ await wrapper.setProps({ yAxisTickFormat: '$,' })
236
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
237
+ const values = firstGroup.findAll('.stacked-column-chart__groups__item__bars__item__value')
238
+ expect(values.at(0).text()).toBe('$90')
239
+ expect(values.at(1).text()).toBe('$10')
240
+ })
241
+
242
+ it('creates an invisible left axis', async () => {
243
+ const leftAxis = wrapper.find('.stacked-column-chart__left-axis')
244
+ expect(leftAxis.attributes('style')).toBe('display: none;')
245
+ })
246
+ })
247
+
248
+ describe('a stacked-colmuns chart with 3 columns in 2 groups and no direct labeling', () => {
249
+
250
+ let wrapper
251
+
252
+ beforeEach(async () => {
253
+
254
+ const propsData = {
255
+ labelField: 'label',
256
+ noDirectLabeling: true,
257
+ fixedHeight: 500,
258
+ barMaxWidth: '50%',
259
+ data: [
260
+ { label: 'today', foo: 90, bar: 5, baz: 5 },
261
+ { label: 'tomorrow', foo: 40, bar: 10, baz: 0 }
262
+ ]
263
+ }
264
+
265
+ const attrs = {
266
+ style: 'width: 600px'
267
+ }
268
+
269
+ wrapper = mount(StackedColumnChart, { propsData, attachTo: createContainer(), attrs })
270
+ })
271
+
272
+ it('is a Vue instance', () => {
273
+ expect(wrapper.vm).toBeTruthy()
274
+ })
275
+
276
+ it('creates 2 columns', async () => {
277
+ expect(wrapper.findAll('.stacked-column-chart__groups__item')).toHaveLength(2)
278
+ })
279
+
280
+ it('creates the first group of columns with maximum height', () => {
281
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
282
+ const fooColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
283
+ const barColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
284
+ const bazColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--baz')
285
+ const totalHeight = fooColumn.element.offsetHeight + barColumn.element.offsetHeight + bazColumn.element.offsetHeight
286
+ expect(totalHeight).toBe(100)
287
+ })
288
+
289
+ it('creates the first group of columns with maximum width', () => {
290
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
291
+ const fooColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
292
+ const barColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
293
+ const bazColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--baz')
294
+ expect(fooColumn.element.style.maxWidth).toBe('50%')
295
+ expect(barColumn.element.style.maxWidth).toBe('50%')
296
+ expect(bazColumn.element.style.maxWidth).toBe('50%')
297
+ })
298
+
299
+ it('creates the second group of columns with ~50% height', () => {
300
+ const secondGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(1)
301
+ const fooColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
302
+ const barColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
303
+ const bazColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--baz')
304
+ const totalHeight = fooColumn.element.offsetHeight + barColumn.element.offsetHeight + bazColumn.element.offsetHeight
305
+ expect(totalHeight).toBe(50)
306
+ })
307
+
308
+ it('creates the first group of columns with right height for each', () => {
309
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
310
+ const fooColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
311
+ const barColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
312
+ const bazColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--baz')
313
+ expect(fooColumn.element.offsetHeight).toBe(90)
314
+ expect(barColumn.element.offsetHeight).toBe(5)
315
+ expect(bazColumn.element.offsetHeight).toBe(5)
316
+ })
317
+
318
+ it('creates the first group of columns with right height for each', () => {
319
+ const secondGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(1)
320
+ const fooColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
321
+ const barColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
322
+ const bazColumn = secondGroup.find('.stacked-column-chart__groups__item__bars__item--baz')
323
+ expect(fooColumn.element.offsetHeight).toBe(40)
324
+ expect(barColumn.element.offsetHeight).toBe(10)
325
+ expect(bazColumn.element.offsetHeight).toBe(0)
326
+ })
327
+
328
+ it('creates a visible left axis', async () => {
329
+ const leftAxis = wrapper.find('.stacked-column-chart__left-axis')
330
+ expect(leftAxis.attributes('style')).not.toBe('display: none;')
331
+ })
332
+
333
+ it('creates a left axis with the same sizes than the component', async () => {
334
+ const leftAxis = wrapper.find('.stacked-column-chart__left-axis')
335
+ expect(leftAxis.attributes('width')).toBe('600px')
336
+ expect(leftAxis.attributes('height')).toBe('500px')
337
+ })
338
+
339
+ it('creates a left axis with 0 as minimum value', async () => {
340
+ const firstTick = wrapper.find('.stacked-column-chart__left-axis .tick:first-of-type text')
341
+ expect(firstTick.text()).toBe('0')
342
+ })
343
+
344
+ it('creates a left axis with 100 as minimum value', async () => {
345
+ const lastTick = wrapper.find('.stacked-column-chart__left-axis .tick:last-of-type text')
346
+ expect(lastTick.text()).toBe('100')
347
+ })
348
+ })
349
+
350
+ describe('a stacked-colmuns chart with 3 columns in 3 groups and a max value', () => {
351
+
352
+ let wrapper
353
+
354
+ beforeEach(async () => {
355
+
356
+ const propsData = {
357
+ labelField: 'label',
358
+ fixedHeight: 500,
359
+ maxValue: 200,
360
+ data: [
361
+ { label: 'today', foo: 90, bar: 5, baz: 5 },
362
+ { label: 'tomorrow', foo: 40, bar: 10, baz: 0 }
363
+ ]
364
+ }
365
+
366
+ const attrs = {
367
+ style: 'width: 600px'
368
+ }
369
+
370
+ wrapper = mount(StackedColumnChart, { propsData, attachTo: createContainer(), attrs })
371
+ })
372
+
373
+ it('is a Vue instance', () => {
374
+ expect(wrapper.vm).toBeTruthy()
375
+ })
376
+
377
+ it('creates 2 columns', async () => {
378
+ expect(wrapper.findAll('.stacked-column-chart__groups__item')).toHaveLength(2)
379
+ })
380
+
381
+ it('creates the first group of columns with maximum height', () => {
382
+ const firstGroup = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
383
+ const fooColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--foo')
384
+ const barColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--bar')
385
+ const bazColumn = firstGroup.find('.stacked-column-chart__groups__item__bars__item--baz')
386
+ const totalHeight = fooColumn.element.offsetHeight + barColumn.element.offsetHeight + bazColumn.element.offsetHeight
387
+ expect(totalHeight).toBe(50)
388
+ })
389
+ })
390
+
391
+ describe('a stacked-colmuns chart with 3 columns in 3 groups with empty values', () => {
392
+
393
+ let wrapper
394
+
395
+ beforeEach(async () => {
396
+
397
+ const propsData = {
398
+ labelField: 'label',
399
+ fixedHeight: 500,
400
+ hideEmptyValues: true,
401
+ highlightDelay: 0,
402
+ data: [
403
+ { label: 'today', foo: 90, bar: 5, baz: 5 },
404
+ { label: 'tomorrow', foo: 40, bar: 10, baz: 0 },
405
+ { label: 'next week', foo: 0, bar: 20, baz: 0 }
406
+ ]
407
+ }
408
+
409
+ const attrs = {
410
+ style: 'width: 600px'
411
+ }
412
+
413
+ wrapper = mount(StackedColumnChart, { propsData, attachTo: createContainer(), attrs })
414
+ })
415
+
416
+
417
+ it('is a Vue instance', () => {
418
+ expect(wrapper.vm).toBeTruthy()
419
+ })
420
+
421
+ it('creates 3 columns', async () => {
422
+ expect(wrapper.findAll('.stacked-column-chart__groups__item')).toHaveLength(3)
423
+ })
424
+
425
+ it('creates the first column with no hidden bars', () => {
426
+ const group = wrapper.findAll('.stacked-column-chart__groups__item').at(0)
427
+ const hiddenBars = group.findAll('.stacked-column-chart__groups__item__bars__item--hidden')
428
+ expect(hiddenBars).toHaveLength(0)
429
+ })
430
+
431
+ it('creates the second column with one hidden bar', () => {
432
+ const group = wrapper.findAll('.stacked-column-chart__groups__item').at(1)
433
+ const hiddenBars = group.findAll('.stacked-column-chart__groups__item__bars__item--hidden')
434
+ expect(hiddenBars).toHaveLength(1)
435
+ })
436
+
437
+ it('creates the third column with two hidden bars', () => {
438
+ const group = wrapper.findAll('.stacked-column-chart__groups__item').at(2)
439
+ const hiddenBars = group.findAll('.stacked-column-chart__groups__item__bars__item--hidden')
440
+ expect(hiddenBars).toHaveLength(2)
441
+ })
442
+ })
443
+ })
@@ -0,0 +1,19 @@
1
+ import { locale, fallbackLocale, i18n } from '@/i18n'
2
+ import {I18n} from 'vue-i18n'
3
+
4
+ describe('i18n.js', () => {
5
+
6
+ it('exposes a static method called install', () => {
7
+
8
+ expectTypeOf(i18n).toMatchTypeOf<I18n>()
9
+ })
10
+
11
+ it('should use `en` as default locale', () => {
12
+ expect(locale).toBe('en')
13
+ })
14
+
15
+
16
+ it('should use `en` as default fallback locale', () => {
17
+ expect(fallbackLocale).toBe('en')
18
+ })
19
+ })
@@ -0,0 +1,82 @@
1
+ import Murmur from '@/main'
2
+ import {createApp} from "vue";
3
+
4
+ describe('main.js', () => {
5
+ it('exposes a static method called `install`', () => {
6
+ expect(Murmur.install).toBeDefined()
7
+ })
8
+
9
+ it('exposes a static method called `setLocaleMessage`', () => {
10
+ expect(Murmur.setLocaleMessage).toBeDefined()
11
+ })
12
+
13
+ it('exposes a static method called `mergeLocaleMessage`', () => {
14
+ expect(Murmur.mergeLocaleMessage).toBeDefined()
15
+ })
16
+
17
+ it('exposes a static method called `setLocale`', () => {
18
+ expect(Murmur.setLocale).toBeDefined()
19
+ })
20
+
21
+ it('exposes a static method called `getLocale`', () => {
22
+ expect(Murmur.getLocale).toBeDefined()
23
+ })
24
+
25
+ it('use plugin to register Murmur components ', () => {
26
+ const app = createApp()
27
+ expect(app._context.components.ContentPlaceholder).toBeUndefined()
28
+ app.use(Murmur)
29
+ expect(app._context.components.ContentPlaceholder).toBeDefined()
30
+ })
31
+
32
+ it('has a list of components', () => {
33
+ expect(Murmur.components).toHaveProperty('Brand')
34
+ expect(Murmur.components).toHaveProperty('ContentPlaceholder')
35
+ expect(Murmur.components).toHaveProperty('DonateForm')
36
+ expect(Murmur.components).toHaveProperty('EmbeddableFooter')
37
+ expect(Murmur.components).toHaveProperty('EmbedForm')
38
+ expect(Murmur.components).toHaveProperty('FollowUsPopover')
39
+ expect(Murmur.components).toHaveProperty('Fa')
40
+ expect(Murmur.components).toHaveProperty('GenericFooter')
41
+ expect(Murmur.components).toHaveProperty('GenericHeader')
42
+ expect(Murmur.components).toHaveProperty('ImddbHeader')
43
+ expect(Murmur.components).toHaveProperty('ResponsiveIframe')
44
+ expect(Murmur.components).toHaveProperty('SharingOptions')
45
+ expect(Murmur.components).toHaveProperty('SignUpForm')
46
+ expect(Murmur.components).toHaveProperty('SlideUpDown')
47
+ })
48
+
49
+ it('has a locale', () => {
50
+ expect(Murmur.getLocale()).toBe("en")
51
+ })
52
+
53
+ it('can update the locale', () => {
54
+ Murmur.setLocale('en')
55
+ expect(Murmur.getLocale()).toBe('en')
56
+ Murmur.setLocale('fr')
57
+ expect(Murmur.getLocale()).toBe('fr')
58
+ })
59
+
60
+ it('can define a new locale', () => {
61
+ Murmur.setLocaleMessage('jp', {
62
+ hello: 'もしもし'
63
+ })
64
+
65
+ Murmur.setLocale('jp')
66
+ expect(Murmur.i18n.global.t('hello')).toBe('もしもし')
67
+ })
68
+
69
+ it('can merge an existing locale with new messages', () => {
70
+ expect(Murmur.getLocale()).toBe('en')
71
+ Murmur.mergeLocaleMessage('en', {
72
+ hello: 'world',
73
+ foo: 'bar'
74
+ })
75
+ expect(Murmur.i18n.global.t('hello')).toBe('world')
76
+ expect(Murmur.i18n.global.t('foo')).toBe('bar')
77
+ })
78
+
79
+ afterEach(() => {
80
+ Murmur.setLocale('en')
81
+ })
82
+ })