@mwater/visualization 5.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 (860) hide show
  1. package/.prettierrc +11 -0
  2. package/.storybook/config.js +7 -0
  3. package/.storybook/head.html +4 -0
  4. package/.storybook/webpack.config.js +15 -0
  5. package/.vscode/launch.json +40 -0
  6. package/LICENSE +21 -0
  7. package/README.md +19 -0
  8. package/build-demo.ts +54 -0
  9. package/lib/CheckboxComponent.d.ts +15 -0
  10. package/lib/CheckboxComponent.js +25 -0
  11. package/lib/ColorComponent.d.ts +24 -0
  12. package/lib/ColorComponent.js +77 -0
  13. package/lib/ColorSchemeFactory.d.ts +8 -0
  14. package/lib/ColorSchemeFactory.js +164 -0
  15. package/lib/CsvBuilder.d.ts +5 -0
  16. package/lib/CsvBuilder.js +63 -0
  17. package/lib/DateRangeComponent.d.ts +81 -0
  18. package/lib/DateRangeComponent.js +190 -0
  19. package/lib/FiltersDesignerComponent.d.ts +25 -0
  20. package/lib/FiltersDesignerComponent.js +38 -0
  21. package/lib/ImplicitFilterBuilder.d.ts +8 -0
  22. package/lib/ImplicitFilterBuilder.js +114 -0
  23. package/lib/JsonQLFilter.d.ts +7 -0
  24. package/lib/JsonQLFilter.js +2 -0
  25. package/lib/LocaleContextInjector.d.ts +14 -0
  26. package/lib/LocaleContextInjector.js +20 -0
  27. package/lib/MWaterAddRelatedFormComponent.d.ts +25 -0
  28. package/lib/MWaterAddRelatedFormComponent.js +155 -0
  29. package/lib/MWaterAddRelatedIndicatorComponent.d.ts +31 -0
  30. package/lib/MWaterAddRelatedIndicatorComponent.js +129 -0
  31. package/lib/MWaterAssetSystemsListComponent.d.ts +17 -0
  32. package/lib/MWaterAssetSystemsListComponent.js +78 -0
  33. package/lib/MWaterCompleteTableSelectComponent.d.ts +224 -0
  34. package/lib/MWaterCompleteTableSelectComponent.js +680 -0
  35. package/lib/MWaterContextComponent.d.ts +31 -0
  36. package/lib/MWaterContextComponent.js +111 -0
  37. package/lib/MWaterCustomTablesetListComponent.d.ts +17 -0
  38. package/lib/MWaterCustomTablesetListComponent.js +87 -0
  39. package/lib/MWaterGlobalFiltersComponent.d.ts +16 -0
  40. package/lib/MWaterGlobalFiltersComponent.js +103 -0
  41. package/lib/MWaterLoaderComponent.d.ts +42 -0
  42. package/lib/MWaterLoaderComponent.js +77 -0
  43. package/lib/MWaterMetricsTableListComponent.d.ts +17 -0
  44. package/lib/MWaterMetricsTableListComponent.js +79 -0
  45. package/lib/MWaterResponsesFilterComponent.d.ts +42 -0
  46. package/lib/MWaterResponsesFilterComponent.js +145 -0
  47. package/lib/MWaterTableSelectComponent.d.ts +36 -0
  48. package/lib/MWaterTableSelectComponent.js +206 -0
  49. package/lib/MenuItemComponent.d.ts +0 -0
  50. package/lib/MenuItemComponent.js +3 -0
  51. package/lib/PopoverComponent.d.ts +15 -0
  52. package/lib/PopoverComponent.js +49 -0
  53. package/lib/RadioButtonComponent.d.ts +16 -0
  54. package/lib/RadioButtonComponent.js +25 -0
  55. package/lib/TableSelectComponent.d.ts +21 -0
  56. package/lib/TableSelectComponent.js +68 -0
  57. package/lib/UIComponents.d.ts +85 -0
  58. package/lib/UIComponents.js +195 -0
  59. package/lib/UndoStack.d.ts +11 -0
  60. package/lib/UndoStack.js +51 -0
  61. package/lib/VerticalLayoutComponent.d.ts +21 -0
  62. package/lib/VerticalLayoutComponent.js +76 -0
  63. package/lib/WidgetScope.d.ts +13 -0
  64. package/lib/WidgetScope.js +2 -0
  65. package/lib/axes/Axis.d.ts +81 -0
  66. package/lib/axes/Axis.js +2 -0
  67. package/lib/axes/AxisBuilder.d.ts +66 -0
  68. package/lib/axes/AxisBuilder.js +1202 -0
  69. package/lib/axes/AxisColorEditorComponent.d.ts +39 -0
  70. package/lib/axes/AxisColorEditorComponent.js +133 -0
  71. package/lib/axes/AxisComponent.d.ts +65 -0
  72. package/lib/axes/AxisComponent.js +359 -0
  73. package/lib/axes/BinsComponent.d.ts +21 -0
  74. package/lib/axes/BinsComponent.js +96 -0
  75. package/lib/axes/CategoryMapComponent.d.ts +41 -0
  76. package/lib/axes/CategoryMapComponent.js +175 -0
  77. package/lib/axes/ColorPaletteCollectionComponent.d.ts +17 -0
  78. package/lib/axes/ColorPaletteCollectionComponent.js +130 -0
  79. package/lib/axes/RangesComponent.d.ts +35 -0
  80. package/lib/axes/RangesComponent.js +119 -0
  81. package/lib/componenttest.d.ts +1 -0
  82. package/lib/componenttest.js +47 -0
  83. package/lib/compressJson.d.ts +4 -0
  84. package/lib/compressJson.js +19 -0
  85. package/lib/dashboards/DashboardComponent.d.ts +115 -0
  86. package/lib/dashboards/DashboardComponent.js +297 -0
  87. package/lib/dashboards/DashboardDataSource.d.ts +9 -0
  88. package/lib/dashboards/DashboardDataSource.js +14 -0
  89. package/lib/dashboards/DashboardDesign.d.ts +45 -0
  90. package/lib/dashboards/DashboardDesign.js +2 -0
  91. package/lib/dashboards/DashboardUpgrader.d.ts +4 -0
  92. package/lib/dashboards/DashboardUpgrader.js +95 -0
  93. package/lib/dashboards/DashboardUtils.d.ts +7 -0
  94. package/lib/dashboards/DashboardUtils.js +69 -0
  95. package/lib/dashboards/DashboardViewComponent.d.ts +71 -0
  96. package/lib/dashboards/DashboardViewComponent.js +235 -0
  97. package/lib/dashboards/DirectDashboardDataSource.d.ts +31 -0
  98. package/lib/dashboards/DirectDashboardDataSource.js +62 -0
  99. package/lib/dashboards/LayoutOptionsComponent.d.ts +11 -0
  100. package/lib/dashboards/LayoutOptionsComponent.js +119 -0
  101. package/lib/dashboards/README.md +13 -0
  102. package/lib/dashboards/ServerDashboardDataSource.d.ts +96 -0
  103. package/lib/dashboards/ServerDashboardDataSource.js +383 -0
  104. package/lib/dashboards/SettingsModalComponent.d.ts +33 -0
  105. package/lib/dashboards/SettingsModalComponent.js +122 -0
  106. package/lib/dashboards/WidgetComponent.d.ts +53 -0
  107. package/lib/dashboards/WidgetComponent.js +66 -0
  108. package/lib/dashboards/layoutOptions.d.ts +19 -0
  109. package/lib/dashboards/layoutOptions.js +19 -0
  110. package/lib/datagrids/DatagridComponent.d.ts +122 -0
  111. package/lib/datagrids/DatagridComponent.js +285 -0
  112. package/lib/datagrids/DatagridDataSource.d.ts +9 -0
  113. package/lib/datagrids/DatagridDataSource.js +13 -0
  114. package/lib/datagrids/DatagridDesign.d.ts +75 -0
  115. package/lib/datagrids/DatagridDesign.js +2 -0
  116. package/lib/datagrids/DatagridDesignerComponent.d.ts +114 -0
  117. package/lib/datagrids/DatagridDesignerComponent.js +389 -0
  118. package/lib/datagrids/DatagridQueryBuilder.d.ts +68 -0
  119. package/lib/datagrids/DatagridQueryBuilder.js +540 -0
  120. package/lib/datagrids/DatagridUtils.d.ts +8 -0
  121. package/lib/datagrids/DatagridUtils.js +91 -0
  122. package/lib/datagrids/DatagridViewComponent.d.ts +86 -0
  123. package/lib/datagrids/DatagridViewComponent.js +321 -0
  124. package/lib/datagrids/DirectDatagridDataSource.d.ts +20 -0
  125. package/lib/datagrids/DirectDatagridDataSource.js +62 -0
  126. package/lib/datagrids/EditExprCellComponent.d.ts +77 -0
  127. package/lib/datagrids/EditExprCellComponent.js +212 -0
  128. package/lib/datagrids/ExprCellComponent.d.ts +34 -0
  129. package/lib/datagrids/ExprCellComponent.js +81 -0
  130. package/lib/datagrids/FindReplaceModalComponent.d.ts +52 -0
  131. package/lib/datagrids/FindReplaceModalComponent.js +248 -0
  132. package/lib/datagrids/LabeledExprGenerator.d.ts +40 -0
  133. package/lib/datagrids/LabeledExprGenerator.js +252 -0
  134. package/lib/datagrids/OrderBysDesignerComponent.d.ts +22 -0
  135. package/lib/datagrids/OrderBysDesignerComponent.js +67 -0
  136. package/lib/datagrids/README.md +3 -0
  137. package/lib/datagrids/ServerDatagridDataSource.d.ts +40 -0
  138. package/lib/datagrids/ServerDatagridDataSource.js +79 -0
  139. package/lib/demo.d.ts +1 -0
  140. package/lib/demo.js +4006 -0
  141. package/lib/demoBlocks.d.ts +1 -0
  142. package/lib/demoBlocks.js +112 -0
  143. package/lib/index.css +550 -0
  144. package/lib/index.d.ts +69 -0
  145. package/lib/index.js +156 -0
  146. package/lib/injectTableAlias.d.ts +2 -0
  147. package/lib/injectTableAlias.js +30 -0
  148. package/lib/languages.d.ts +9 -0
  149. package/lib/languages.js +926 -0
  150. package/lib/layout-styles.css +263 -0
  151. package/lib/layouts/DecoratedBlockComponent.d.ts +44 -0
  152. package/lib/layouts/DecoratedBlockComponent.js +96 -0
  153. package/lib/layouts/DragSourceComponent.d.ts +2 -0
  154. package/lib/layouts/DragSourceComponent.js +26 -0
  155. package/lib/layouts/LayoutManager.d.ts +50 -0
  156. package/lib/layouts/LayoutManager.js +41 -0
  157. package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +75 -0
  158. package/lib/layouts/blocks/BlocksDisplayComponent.js +336 -0
  159. package/lib/layouts/blocks/BlocksLayoutManager.d.ts +36 -0
  160. package/lib/layouts/blocks/BlocksLayoutManager.js +74 -0
  161. package/lib/layouts/blocks/ClipboardPaletteItemComponent.d.ts +9 -0
  162. package/lib/layouts/blocks/ClipboardPaletteItemComponent.js +59 -0
  163. package/lib/layouts/blocks/DraggableBlockComponent.d.ts +2 -0
  164. package/lib/layouts/blocks/DraggableBlockComponent.js +163 -0
  165. package/lib/layouts/blocks/HorizontalBlockComponent.d.ts +31 -0
  166. package/lib/layouts/blocks/HorizontalBlockComponent.js +191 -0
  167. package/lib/layouts/blocks/PaletteItemComponent.d.ts +14 -0
  168. package/lib/layouts/blocks/PaletteItemComponent.js +15 -0
  169. package/lib/layouts/blocks/README.md +11 -0
  170. package/lib/layouts/blocks/blockUtils.d.ts +22 -0
  171. package/lib/layouts/blocks/blockUtils.js +155 -0
  172. package/lib/layouts/decorated-block.css +100 -0
  173. package/lib/layouts/grid/GridLayoutComponent.d.ts +23 -0
  174. package/lib/layouts/grid/GridLayoutComponent.js +49 -0
  175. package/lib/layouts/grid/GridLayoutManager.d.ts +29 -0
  176. package/lib/layouts/grid/GridLayoutManager.js +141 -0
  177. package/lib/layouts/grid/LegoLayoutEngine.d.ts +33 -0
  178. package/lib/layouts/grid/LegoLayoutEngine.js +129 -0
  179. package/lib/layouts/grid/PaletteItemComponent.d.ts +14 -0
  180. package/lib/layouts/grid/PaletteItemComponent.js +15 -0
  181. package/lib/layouts/grid/README.md +14 -0
  182. package/lib/layouts/grid/WidgetContainerComponent.d.ts +9 -0
  183. package/lib/layouts/grid/WidgetContainerComponent.js +333 -0
  184. package/lib/mWaterLoader.d.ts +26 -0
  185. package/lib/mWaterLoader.js +55 -0
  186. package/lib/mapdemo.d.ts +0 -0
  187. package/lib/mapdemo.js +115 -0
  188. package/lib/maps/AddLayerComponent.d.ts +22 -0
  189. package/lib/maps/AddLayerComponent.js +85 -0
  190. package/lib/maps/AdminScopeAndDetailLevelComponent.d.ts +19 -0
  191. package/lib/maps/AdminScopeAndDetailLevelComponent.js +59 -0
  192. package/lib/maps/BaseLayerDesignerComponent.d.ts +28 -0
  193. package/lib/maps/BaseLayerDesignerComponent.js +57 -0
  194. package/lib/maps/BingLayer.d.ts +1 -0
  195. package/lib/maps/BingLayer.js +151 -0
  196. package/lib/maps/BufferLayer.d.ts +51 -0
  197. package/lib/maps/BufferLayer.js +816 -0
  198. package/lib/maps/BufferLayerDesign.d.ts +37 -0
  199. package/lib/maps/BufferLayerDesign.js +2 -0
  200. package/lib/maps/BufferLayerDesignerComponent.d.ts +49 -0
  201. package/lib/maps/BufferLayerDesignerComponent.js +217 -0
  202. package/lib/maps/ChoroplethLayer.d.ts +74 -0
  203. package/lib/maps/ChoroplethLayer.js +1515 -0
  204. package/lib/maps/ChoroplethLayerDesign.d.ts +56 -0
  205. package/lib/maps/ChoroplethLayerDesign.js +2 -0
  206. package/lib/maps/ChoroplethLayerDesigner.d.ts +53 -0
  207. package/lib/maps/ChoroplethLayerDesigner.js +382 -0
  208. package/lib/maps/ClusterLayer.d.ts +38 -0
  209. package/lib/maps/ClusterLayer.js +746 -0
  210. package/lib/maps/ClusterLayerDesign.d.ts +22 -0
  211. package/lib/maps/ClusterLayerDesign.js +2 -0
  212. package/lib/maps/ClusterLayerDesignerComponent.d.ts +37 -0
  213. package/lib/maps/ClusterLayerDesignerComponent.js +110 -0
  214. package/lib/maps/DetailLevelSelectComponent.d.ts +122 -0
  215. package/lib/maps/DetailLevelSelectComponent.js +91 -0
  216. package/lib/maps/DirectMapDataSource.d.ts +68 -0
  217. package/lib/maps/DirectMapDataSource.js +265 -0
  218. package/lib/maps/EditHoverOver.d.ts +18 -0
  219. package/lib/maps/EditHoverOver.js +88 -0
  220. package/lib/maps/EditPopupComponent.d.ts +26 -0
  221. package/lib/maps/EditPopupComponent.js +75 -0
  222. package/lib/maps/Grid Functions.sql +167 -0
  223. package/lib/maps/GridLayer.d.ts +48 -0
  224. package/lib/maps/GridLayer.js +684 -0
  225. package/lib/maps/GridLayerDesign.d.ts +35 -0
  226. package/lib/maps/GridLayerDesign.js +2 -0
  227. package/lib/maps/GridLayerDesigner.d.ts +38 -0
  228. package/lib/maps/GridLayerDesigner.js +229 -0
  229. package/lib/maps/HoverContent.d.ts +13 -0
  230. package/lib/maps/HoverContent.js +92 -0
  231. package/lib/maps/HtmlUrlLegend.d.ts +16 -0
  232. package/lib/maps/HtmlUrlLegend.js +38 -0
  233. package/lib/maps/Layer.d.ts +164 -0
  234. package/lib/maps/Layer.js +193 -0
  235. package/lib/maps/LayerFactory.d.ts +5 -0
  236. package/lib/maps/LayerFactory.js +47 -0
  237. package/lib/maps/LayerLegendComponent.d.ts +23 -0
  238. package/lib/maps/LayerLegendComponent.js +68 -0
  239. package/lib/maps/LayerSwitcherComponent.d.ts +7 -0
  240. package/lib/maps/LayerSwitcherComponent.js +97 -0
  241. package/lib/maps/LeafletLoading.css +24 -0
  242. package/lib/maps/LeafletLoading.d.ts +42 -0
  243. package/lib/maps/LeafletLoading.js +318 -0
  244. package/lib/maps/LeafletMapComponent.d.ts +141 -0
  245. package/lib/maps/LeafletMapComponent.js +438 -0
  246. package/lib/maps/LegendComponent.d.ts +14 -0
  247. package/lib/maps/LegendComponent.js +74 -0
  248. package/lib/maps/LegendGroup.d.ts +24 -0
  249. package/lib/maps/LegendGroup.js +86 -0
  250. package/lib/maps/MWaterServerLayer.d.ts +40 -0
  251. package/lib/maps/MWaterServerLayer.js +101 -0
  252. package/lib/maps/MapBoundsCalculator.d.ts +16 -0
  253. package/lib/maps/MapBoundsCalculator.js +85 -0
  254. package/lib/maps/MapComponent.d.ts +98 -0
  255. package/lib/maps/MapComponent.js +186 -0
  256. package/lib/maps/MapControlComponent.d.ts +17 -0
  257. package/lib/maps/MapControlComponent.js +25 -0
  258. package/lib/maps/MapDataSource.d.ts +18 -0
  259. package/lib/maps/MapDataSource.js +2 -0
  260. package/lib/maps/MapDesign.d.ts +77 -0
  261. package/lib/maps/MapDesign.js +2 -0
  262. package/lib/maps/MapDesignerComponent.d.ts +39 -0
  263. package/lib/maps/MapDesignerComponent.js +215 -0
  264. package/lib/maps/MapFiltersDesignerComponent.d.ts +21 -0
  265. package/lib/maps/MapFiltersDesignerComponent.js +70 -0
  266. package/lib/maps/MapLayerDataSource.d.ts +22 -0
  267. package/lib/maps/MapLayerDataSource.js +2 -0
  268. package/lib/maps/MapLayerViewDesignerComponent.d.ts +87 -0
  269. package/lib/maps/MapLayerViewDesignerComponent.js +151 -0
  270. package/lib/maps/MapLayersDesignerComponent.d.ts +32 -0
  271. package/lib/maps/MapLayersDesignerComponent.js +98 -0
  272. package/lib/maps/MapUtils.d.ts +21 -0
  273. package/lib/maps/MapUtils.js +119 -0
  274. package/lib/maps/MapViewComponent.d.ts +38 -0
  275. package/lib/maps/MapViewComponent.js +20 -0
  276. package/lib/maps/Maptiler-logo.png +0 -0
  277. package/lib/maps/MarkerSymbolSelectComponent.d.ts +10 -0
  278. package/lib/maps/MarkerSymbolSelectComponent.js +28 -0
  279. package/lib/maps/MarkersLayer.d.ts +66 -0
  280. package/lib/maps/MarkersLayer.js +838 -0
  281. package/lib/maps/MarkersLayerDesign.d.ts +44 -0
  282. package/lib/maps/MarkersLayerDesign.js +2 -0
  283. package/lib/maps/MarkersLayerDesignerComponent.d.ts +56 -0
  284. package/lib/maps/MarkersLayerDesignerComponent.js +269 -0
  285. package/lib/maps/PopupFilterJoinsEditComponent.d.ts +30 -0
  286. package/lib/maps/PopupFilterJoinsEditComponent.js +75 -0
  287. package/lib/maps/PopupFilterJoinsUtils.d.ts +15 -0
  288. package/lib/maps/PopupFilterJoinsUtils.js +91 -0
  289. package/lib/maps/RasterMapViewComponent.d.ts +108 -0
  290. package/lib/maps/RasterMapViewComponent.js +283 -0
  291. package/lib/maps/RegionSelectComponent.d.ts +55 -0
  292. package/lib/maps/RegionSelectComponent.js +61 -0
  293. package/lib/maps/ScopeAndDetailLevelComponent.d.ts +21 -0
  294. package/lib/maps/ScopeAndDetailLevelComponent.js +76 -0
  295. package/lib/maps/ServerMapDataSource.d.ts +86 -0
  296. package/lib/maps/ServerMapDataSource.js +273 -0
  297. package/lib/maps/SwitchableTileUrlLayer.d.ts +53 -0
  298. package/lib/maps/SwitchableTileUrlLayer.js +69 -0
  299. package/lib/maps/SwitchableTileUrlLayerDesigner.d.ts +14 -0
  300. package/lib/maps/SwitchableTileUrlLayerDesigner.js +26 -0
  301. package/lib/maps/TileUrlLayer.d.ts +40 -0
  302. package/lib/maps/TileUrlLayer.js +96 -0
  303. package/lib/maps/UtfGridLayer.d.ts +1 -0
  304. package/lib/maps/UtfGridLayer.js +216 -0
  305. package/lib/maps/VectorMapViewComponent.css +21 -0
  306. package/lib/maps/VectorMapViewComponent.d.ts +44 -0
  307. package/lib/maps/VectorMapViewComponent.js +565 -0
  308. package/lib/maps/ZoomLevelsComponent.d.ts +15 -0
  309. package/lib/maps/ZoomLevelsComponent.js +37 -0
  310. package/lib/maps/mapSymbols.d.ts +6 -0
  311. package/lib/maps/mapSymbols.js +167 -0
  312. package/lib/maps/mapboxUtils.d.ts +6 -0
  313. package/lib/maps/mapboxUtils.js +60 -0
  314. package/lib/maps/maps.d.ts +36 -0
  315. package/lib/maps/maps.js +2 -0
  316. package/lib/maps/marker-icon-2x.png +0 -0
  317. package/lib/maps/marker-icon.png +0 -0
  318. package/lib/maps/marker-shadow.png +0 -0
  319. package/lib/maps/symbols/font-awesome/asterisk.png +0 -0
  320. package/lib/maps/symbols/font-awesome/ban.png +0 -0
  321. package/lib/maps/symbols/font-awesome/beer.png +0 -0
  322. package/lib/maps/symbols/font-awesome/bell.png +0 -0
  323. package/lib/maps/symbols/font-awesome/bolt.png +0 -0
  324. package/lib/maps/symbols/font-awesome/building.png +0 -0
  325. package/lib/maps/symbols/font-awesome/bullseye.png +0 -0
  326. package/lib/maps/symbols/font-awesome/bus.png +0 -0
  327. package/lib/maps/symbols/font-awesome/caret-up.png +0 -0
  328. package/lib/maps/symbols/font-awesome/certificate.png +0 -0
  329. package/lib/maps/symbols/font-awesome/check-circle.png +0 -0
  330. package/lib/maps/symbols/font-awesome/check.png +0 -0
  331. package/lib/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  332. package/lib/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  333. package/lib/maps/symbols/font-awesome/cloud.png +0 -0
  334. package/lib/maps/symbols/font-awesome/comment.png +0 -0
  335. package/lib/maps/symbols/font-awesome/crosshairs.png +0 -0
  336. package/lib/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  337. package/lib/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  338. package/lib/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  339. package/lib/maps/symbols/font-awesome/female.png +0 -0
  340. package/lib/maps/symbols/font-awesome/file.png +0 -0
  341. package/lib/maps/symbols/font-awesome/flag.png +0 -0
  342. package/lib/maps/symbols/font-awesome/flask.png +0 -0
  343. package/lib/maps/symbols/font-awesome/h-square.png +0 -0
  344. package/lib/maps/symbols/font-awesome/home.png +0 -0
  345. package/lib/maps/symbols/font-awesome/info-circle.png +0 -0
  346. package/lib/maps/symbols/font-awesome/male.png +0 -0
  347. package/lib/maps/symbols/font-awesome/medkit.png +0 -0
  348. package/lib/maps/symbols/font-awesome/mobile.png +0 -0
  349. package/lib/maps/symbols/font-awesome/plus-circle.png +0 -0
  350. package/lib/maps/symbols/font-awesome/plus-square.png +0 -0
  351. package/lib/maps/symbols/font-awesome/plus.png +0 -0
  352. package/lib/maps/symbols/font-awesome/square.png +0 -0
  353. package/lib/maps/symbols/font-awesome/star.png +0 -0
  354. package/lib/maps/symbols/font-awesome/thumbs-down.png +0 -0
  355. package/lib/maps/symbols/font-awesome/thumbs-up.png +0 -0
  356. package/lib/maps/symbols/font-awesome/ticket.png +0 -0
  357. package/lib/maps/symbols/font-awesome/times-circle.png +0 -0
  358. package/lib/maps/symbols/font-awesome/times.png +0 -0
  359. package/lib/maps/symbols/font-awesome/tint.png +0 -0
  360. package/lib/maps/symbols/font-awesome/tree.png +0 -0
  361. package/lib/maps/symbols/font-awesome/university.png +0 -0
  362. package/lib/maps/symbols/font-awesome/usd.png +0 -0
  363. package/lib/maps/symbols/font-awesome/user.png +0 -0
  364. package/lib/maps/symbols/font-awesome/users.png +0 -0
  365. package/lib/maps/symbols/font-awesome/wheelchair.png +0 -0
  366. package/lib/maps/vectorMaps.d.ts +42 -0
  367. package/lib/maps/vectorMaps.js +331 -0
  368. package/lib/memoizedDebounce.d.ts +6 -0
  369. package/lib/memoizedDebounce.js +21 -0
  370. package/lib/quickfilter/DateExprComponent.d.ts +81 -0
  371. package/lib/quickfilter/DateExprComponent.js +197 -0
  372. package/lib/quickfilter/IdArrayQuickfilterComponent.d.ts +24 -0
  373. package/lib/quickfilter/IdArrayQuickfilterComponent.js +30 -0
  374. package/lib/quickfilter/Quickfilter.d.ts +21 -0
  375. package/lib/quickfilter/Quickfilter.js +2 -0
  376. package/lib/quickfilter/QuickfilterCompiler.d.ts +16 -0
  377. package/lib/quickfilter/QuickfilterCompiler.js +167 -0
  378. package/lib/quickfilter/QuickfilterUtils.d.ts +7 -0
  379. package/lib/quickfilter/QuickfilterUtils.js +106 -0
  380. package/lib/quickfilter/QuickfiltersComponent.d.ts +293 -0
  381. package/lib/quickfilter/QuickfiltersComponent.js +257 -0
  382. package/lib/quickfilter/QuickfiltersDataSource.d.ts +7 -0
  383. package/lib/quickfilter/QuickfiltersDataSource.js +2 -0
  384. package/lib/quickfilter/QuickfiltersDesignComponent.d.ts +46 -0
  385. package/lib/quickfilter/QuickfiltersDesignComponent.js +176 -0
  386. package/lib/quickfilter/README.md +8 -0
  387. package/lib/quickfilter/TextLiteralComponent.d.ts +216 -0
  388. package/lib/quickfilter/TextLiteralComponent.js +128 -0
  389. package/lib/richtext/ExprItemsHtmlConverter.d.ts +39 -0
  390. package/lib/richtext/ExprItemsHtmlConverter.js +118 -0
  391. package/lib/richtext/FontColorPaletteItem.d.ts +23 -0
  392. package/lib/richtext/FontColorPaletteItem.js +84 -0
  393. package/lib/richtext/FontSizePaletteItem.d.ts +29 -0
  394. package/lib/richtext/FontSizePaletteItem.js +70 -0
  395. package/lib/richtext/ItemsHtmlConverter.d.ts +31 -0
  396. package/lib/richtext/ItemsHtmlConverter.js +209 -0
  397. package/lib/richtext/README.md +3 -0
  398. package/lib/richtext/RichTextComponent.d.ts +84 -0
  399. package/lib/richtext/RichTextComponent.js +255 -0
  400. package/lib/valueFormatter.d.ts +16 -0
  401. package/lib/valueFormatter.js +93 -0
  402. package/lib/widgets/DirectWidgetDataSource.d.ts +43 -0
  403. package/lib/widgets/DirectWidgetDataSource.js +39 -0
  404. package/lib/widgets/DropdownWidgetComponent.d.ts +31 -0
  405. package/lib/widgets/DropdownWidgetComponent.js +41 -0
  406. package/lib/widgets/IFrameWidget.d.ts +16 -0
  407. package/lib/widgets/IFrameWidget.js +38 -0
  408. package/lib/widgets/IFrameWidgetComponent.d.ts +33 -0
  409. package/lib/widgets/IFrameWidgetComponent.js +101 -0
  410. package/lib/widgets/ImageUploaderComponent.d.ts +29 -0
  411. package/lib/widgets/ImageUploaderComponent.js +91 -0
  412. package/lib/widgets/ImageWidget.d.ts +49 -0
  413. package/lib/widgets/ImageWidget.js +112 -0
  414. package/lib/widgets/ImageWidgetComponent.d.ts +125 -0
  415. package/lib/widgets/ImageWidgetComponent.js +368 -0
  416. package/lib/widgets/ImagelistCarouselComponent.d.ts +29 -0
  417. package/lib/widgets/ImagelistCarouselComponent.js +64 -0
  418. package/lib/widgets/MapWidget.d.ts +55 -0
  419. package/lib/widgets/MapWidget.js +167 -0
  420. package/lib/widgets/MarkdownWidget.d.ts +53 -0
  421. package/lib/widgets/MarkdownWidget.js +134 -0
  422. package/lib/widgets/TOCWidget.d.ts +39 -0
  423. package/lib/widgets/TOCWidget.js +254 -0
  424. package/lib/widgets/Widget.d.ts +61 -0
  425. package/lib/widgets/Widget.js +33 -0
  426. package/lib/widgets/WidgetDataSource.d.ts +20 -0
  427. package/lib/widgets/WidgetDataSource.js +2 -0
  428. package/lib/widgets/WidgetFactory.d.ts +4 -0
  429. package/lib/widgets/WidgetFactory.js +40 -0
  430. package/lib/widgets/WidgetScoper.d.ts +9 -0
  431. package/lib/widgets/WidgetScoper.js +49 -0
  432. package/lib/widgets/WidgetScopesViewComponent.d.ts +26 -0
  433. package/lib/widgets/WidgetScopesViewComponent.js +36 -0
  434. package/lib/widgets/charts/Chart.d.ts +57 -0
  435. package/lib/widgets/charts/Chart.js +83 -0
  436. package/lib/widgets/charts/ChartViewComponent.d.ts +72 -0
  437. package/lib/widgets/charts/ChartViewComponent.js +120 -0
  438. package/lib/widgets/charts/ChartWidget.d.ts +87 -0
  439. package/lib/widgets/charts/ChartWidget.js +248 -0
  440. package/lib/widgets/charts/calendar/CalendarChart.d.ts +39 -0
  441. package/lib/widgets/charts/calendar/CalendarChart.js +175 -0
  442. package/lib/widgets/charts/calendar/CalendarChartDesignerComponent.d.ts +35 -0
  443. package/lib/widgets/charts/calendar/CalendarChartDesignerComponent.js +142 -0
  444. package/lib/widgets/charts/calendar/CalendarChartViewComponent.d.ts +56 -0
  445. package/lib/widgets/charts/calendar/CalendarChartViewComponent.js +263 -0
  446. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.d.ts +21 -0
  447. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.js +183 -0
  448. package/lib/widgets/charts/imagemosaic/ImageMosaicChartDesignerComponent.d.ts +28 -0
  449. package/lib/widgets/charts/imagemosaic/ImageMosaicChartDesignerComponent.js +105 -0
  450. package/lib/widgets/charts/imagemosaic/ImageMosaicChartViewComponent.d.ts +31 -0
  451. package/lib/widgets/charts/imagemosaic/ImageMosaicChartViewComponent.js +87 -0
  452. package/lib/widgets/charts/imagemosaic/ImagePopupComponent.d.ts +20 -0
  453. package/lib/widgets/charts/imagemosaic/ImagePopupComponent.js +38 -0
  454. package/lib/widgets/charts/layered/LayeredChart.d.ts +28 -0
  455. package/lib/widgets/charts/layered/LayeredChart.js +324 -0
  456. package/lib/widgets/charts/layered/LayeredChartCompiler.d.ts +113 -0
  457. package/lib/widgets/charts/layered/LayeredChartCompiler.js +1092 -0
  458. package/lib/widgets/charts/layered/LayeredChartDesign.d.ts +76 -0
  459. package/lib/widgets/charts/layered/LayeredChartDesign.js +2 -0
  460. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.d.ts +80 -0
  461. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +317 -0
  462. package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.d.ts +72 -0
  463. package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.js +329 -0
  464. package/lib/widgets/charts/layered/LayeredChartSvgFileSaver.d.ts +5 -0
  465. package/lib/widgets/charts/layered/LayeredChartSvgFileSaver.js +138 -0
  466. package/lib/widgets/charts/layered/LayeredChartUtils.d.ts +1 -0
  467. package/lib/widgets/charts/layered/LayeredChartUtils.js +25 -0
  468. package/lib/widgets/charts/layered/LayeredChartViewComponent.d.ts +44 -0
  469. package/lib/widgets/charts/layered/LayeredChartViewComponent.js +406 -0
  470. package/lib/widgets/charts/pivot/IntersectionDesignerComponent.d.ts +115 -0
  471. package/lib/widgets/charts/pivot/IntersectionDesignerComponent.js +235 -0
  472. package/lib/widgets/charts/pivot/PivotChart.d.ts +36 -0
  473. package/lib/widgets/charts/pivot/PivotChart.js +343 -0
  474. package/lib/widgets/charts/pivot/PivotChartDesign.d.ts +88 -0
  475. package/lib/widgets/charts/pivot/PivotChartDesign.js +2 -0
  476. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.d.ts +37 -0
  477. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.js +159 -0
  478. package/lib/widgets/charts/pivot/PivotChartLayout.d.ts +73 -0
  479. package/lib/widgets/charts/pivot/PivotChartLayout.js +2 -0
  480. package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.d.ts +37 -0
  481. package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.js +676 -0
  482. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.d.ts +74 -0
  483. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +333 -0
  484. package/lib/widgets/charts/pivot/PivotChartQueryBuilder.d.ts +31 -0
  485. package/lib/widgets/charts/pivot/PivotChartQueryBuilder.js +263 -0
  486. package/lib/widgets/charts/pivot/PivotChartUtils.d.ts +12 -0
  487. package/lib/widgets/charts/pivot/PivotChartUtils.js +195 -0
  488. package/lib/widgets/charts/pivot/PivotChartViewComponent.d.ts +84 -0
  489. package/lib/widgets/charts/pivot/PivotChartViewComponent.js +205 -0
  490. package/lib/widgets/charts/pivot/README.md +30 -0
  491. package/lib/widgets/charts/pivot/SegmentDesignerComponent.d.ts +96 -0
  492. package/lib/widgets/charts/pivot/SegmentDesignerComponent.js +216 -0
  493. package/lib/widgets/charts/table/OrderingsComponent.d.ts +15 -0
  494. package/lib/widgets/charts/table/OrderingsComponent.js +66 -0
  495. package/lib/widgets/charts/table/TableChart.d.ts +57 -0
  496. package/lib/widgets/charts/table/TableChart.js +310 -0
  497. package/lib/widgets/charts/table/TableChartDesignerComponent.d.ts +48 -0
  498. package/lib/widgets/charts/table/TableChartDesignerComponent.js +291 -0
  499. package/lib/widgets/charts/table/TableChartViewComponent.d.ts +28 -0
  500. package/lib/widgets/charts/table/TableChartViewComponent.js +206 -0
  501. package/lib/widgets/text/ExprInsertModalComponent.d.ts +35 -0
  502. package/lib/widgets/text/ExprInsertModalComponent.js +51 -0
  503. package/lib/widgets/text/ExprItemEditorComponent.d.ts +34 -0
  504. package/lib/widgets/text/ExprItemEditorComponent.js +92 -0
  505. package/lib/widgets/text/ExprUpdateModalComponent.d.ts +33 -0
  506. package/lib/widgets/text/ExprUpdateModalComponent.js +47 -0
  507. package/lib/widgets/text/README.md +2 -0
  508. package/lib/widgets/text/TextComponent.d.ts +48 -0
  509. package/lib/widgets/text/TextComponent.js +109 -0
  510. package/lib/widgets/text/TextWidget.d.ts +29 -0
  511. package/lib/widgets/text/TextWidget.js +243 -0
  512. package/lib/widgets/text/TextWidgetComponent.d.ts +33 -0
  513. package/lib/widgets/text/TextWidgetComponent.js +88 -0
  514. package/lib/widgets/text/TextWidgetDesign.d.ts +6 -0
  515. package/lib/widgets/text/TextWidgetDesign.js +2 -0
  516. package/mocha.html +10 -0
  517. package/package.json +113 -0
  518. package/server.js +10 -0
  519. package/src/CheckboxComponent.ts +33 -0
  520. package/src/ColorComponent.ts +117 -0
  521. package/src/ColorSchemeFactory.ts +144 -0
  522. package/src/CsvBuilder.ts +65 -0
  523. package/src/DateRangeComponent.ts +279 -0
  524. package/src/FiltersDesignerComponent.ts +55 -0
  525. package/src/ImplicitFilterBuilder.ts +135 -0
  526. package/src/JsonQLFilter.ts +8 -0
  527. package/src/LocaleContextInjector.tsx +17 -0
  528. package/src/MWaterAddRelatedFormComponent.ts +213 -0
  529. package/src/MWaterAddRelatedIndicatorComponent.ts +205 -0
  530. package/src/MWaterAssetSystemsListComponent.tsx +114 -0
  531. package/src/MWaterCompleteTableSelectComponent.tsx +984 -0
  532. package/src/MWaterContextComponent.ts +144 -0
  533. package/src/MWaterCustomTablesetListComponent.tsx +141 -0
  534. package/src/MWaterGlobalFiltersComponent.ts +117 -0
  535. package/src/MWaterLoaderComponent.ts +118 -0
  536. package/src/MWaterMetricsTableListComponent.tsx +120 -0
  537. package/src/MWaterResponsesFilterComponent.ts +194 -0
  538. package/src/MWaterTableSelectComponent.ts +316 -0
  539. package/src/MenuItemComponent.ts +2 -0
  540. package/src/PopoverComponent.ts +59 -0
  541. package/src/RadioButtonComponent.ts +34 -0
  542. package/src/TableSelectComponent.ts +60 -0
  543. package/src/UIComponents.ts +289 -0
  544. package/src/UndoStack.ts +59 -0
  545. package/src/VerticalLayoutComponent.ts +108 -0
  546. package/src/WidgetScope.ts +17 -0
  547. package/src/axes/Axis.ts +89 -0
  548. package/src/axes/AxisBuilder.ts +1325 -0
  549. package/src/axes/AxisColorEditorComponent.ts +210 -0
  550. package/src/axes/AxisComponent.ts +449 -0
  551. package/src/axes/BinsComponent.tsx +169 -0
  552. package/src/axes/CategoryMapComponent.ts +278 -0
  553. package/src/axes/ColorPaletteCollectionComponent.ts +163 -0
  554. package/src/axes/RangesComponent.ts +234 -0
  555. package/src/color-mixer.d.ts +1 -0
  556. package/src/componenttest.ts +64 -0
  557. package/src/compressJson.ts +13 -0
  558. package/src/dashboards/DashboardComponent.ts +468 -0
  559. package/src/dashboards/DashboardDataSource.ts +15 -0
  560. package/src/dashboards/DashboardDesign.ts +57 -0
  561. package/src/dashboards/DashboardUpgrader.ts +103 -0
  562. package/src/dashboards/DashboardUtils.ts +82 -0
  563. package/src/dashboards/DashboardViewComponent.ts +304 -0
  564. package/src/dashboards/DirectDashboardDataSource.ts +69 -0
  565. package/src/dashboards/LayoutOptionsComponent.tsx +227 -0
  566. package/src/dashboards/README.md +13 -0
  567. package/src/dashboards/ServerDashboardDataSource.ts +520 -0
  568. package/src/dashboards/SettingsModalComponent.ts +169 -0
  569. package/src/dashboards/WidgetComponent.tsx +131 -0
  570. package/src/dashboards/layoutOptions.ts +40 -0
  571. package/src/datagrids/DatagridComponent.ts +430 -0
  572. package/src/datagrids/DatagridDataSource.ts +21 -0
  573. package/src/datagrids/DatagridDesign.ts +94 -0
  574. package/src/datagrids/DatagridDesignerComponent.tsx +585 -0
  575. package/src/datagrids/DatagridQueryBuilder.ts +722 -0
  576. package/src/datagrids/DatagridUtils.ts +74 -0
  577. package/src/datagrids/DatagridViewComponent.ts +460 -0
  578. package/src/datagrids/DirectDatagridDataSource.ts +57 -0
  579. package/src/datagrids/EditExprCellComponent.tsx +305 -0
  580. package/src/datagrids/ExprCellComponent.ts +104 -0
  581. package/src/datagrids/FindReplaceModalComponent.ts +354 -0
  582. package/src/datagrids/LabeledExprGenerator.ts +302 -0
  583. package/src/datagrids/OrderBysDesignerComponent.tsx +128 -0
  584. package/src/datagrids/README.md +3 -0
  585. package/src/datagrids/ServerDatagridDataSource.ts +119 -0
  586. package/src/datagrids/react-linkify.d.ts +1 -0
  587. package/src/demo.ts +4148 -0
  588. package/src/demoBlocks.ts +130 -0
  589. package/src/globals.d.ts +2 -0
  590. package/src/index.css +550 -0
  591. package/src/index.ts +112 -0
  592. package/src/injectTableAlias.ts +31 -0
  593. package/src/languages.ts +931 -0
  594. package/src/layout-styles.css +263 -0
  595. package/src/layouts/DecoratedBlockComponent.ts +167 -0
  596. package/src/layouts/DragSourceComponent.ts +35 -0
  597. package/src/layouts/LayoutManager.ts +86 -0
  598. package/src/layouts/blocks/BlocksDisplayComponent.ts +461 -0
  599. package/src/layouts/blocks/BlocksLayoutManager.ts +78 -0
  600. package/src/layouts/blocks/ClipboardPaletteItemComponent.ts +89 -0
  601. package/src/layouts/blocks/DraggableBlockComponent.ts +219 -0
  602. package/src/layouts/blocks/HorizontalBlockComponent.ts +288 -0
  603. package/src/layouts/blocks/PaletteItemComponent.ts +27 -0
  604. package/src/layouts/blocks/README.md +11 -0
  605. package/src/layouts/blocks/blockUtils.ts +207 -0
  606. package/src/layouts/decorated-block.css +100 -0
  607. package/src/layouts/grid/GridLayoutComponent.ts +67 -0
  608. package/src/layouts/grid/GridLayoutManager.ts +185 -0
  609. package/src/layouts/grid/LegoLayoutEngine.ts +142 -0
  610. package/src/layouts/grid/PaletteItemComponent.ts +28 -0
  611. package/src/layouts/grid/README.md +14 -0
  612. package/src/layouts/grid/WidgetContainerComponent.ts +420 -0
  613. package/src/mWaterLoader.ts +82 -0
  614. package/src/mapdemo.ts +127 -0
  615. package/src/maps/AddLayerComponent.ts +125 -0
  616. package/src/maps/AdminScopeAndDetailLevelComponent.ts +90 -0
  617. package/src/maps/BaseLayerDesignerComponent.ts +104 -0
  618. package/src/maps/BingLayer.ts +156 -0
  619. package/src/maps/BufferLayer.ts +927 -0
  620. package/src/maps/BufferLayerDesign.ts +48 -0
  621. package/src/maps/BufferLayerDesignerComponent.ts +311 -0
  622. package/src/maps/ChoroplethLayer.ts +1712 -0
  623. package/src/maps/ChoroplethLayerDesign.ts +73 -0
  624. package/src/maps/ChoroplethLayerDesigner.tsx +558 -0
  625. package/src/maps/ClusterLayer.ts +836 -0
  626. package/src/maps/ClusterLayerDesign.ts +29 -0
  627. package/src/maps/ClusterLayerDesignerComponent.ts +190 -0
  628. package/src/maps/DetailLevelSelectComponent.ts +119 -0
  629. package/src/maps/DirectMapDataSource.ts +386 -0
  630. package/src/maps/EditHoverOver.tsx +151 -0
  631. package/src/maps/EditPopupComponent.ts +121 -0
  632. package/src/maps/Grid Functions.sql +167 -0
  633. package/src/maps/GridLayer.ts +776 -0
  634. package/src/maps/GridLayerDesign.ts +53 -0
  635. package/src/maps/GridLayerDesigner.tsx +332 -0
  636. package/src/maps/HoverContent.tsx +96 -0
  637. package/src/maps/HtmlUrlLegend.tsx +44 -0
  638. package/src/maps/Layer.ts +338 -0
  639. package/src/maps/LayerFactory.ts +51 -0
  640. package/src/maps/LayerLegendComponent.ts +88 -0
  641. package/src/maps/LayerSwitcherComponent.tsx +91 -0
  642. package/src/maps/LeafletLoading.css +24 -0
  643. package/src/maps/LeafletLoading.ts +355 -0
  644. package/src/maps/LeafletMapComponent.tsx +587 -0
  645. package/src/maps/LegendComponent.tsx +101 -0
  646. package/src/maps/LegendGroup.ts +120 -0
  647. package/src/maps/MWaterServerLayer.ts +116 -0
  648. package/src/maps/MapBoundsCalculator.ts +88 -0
  649. package/src/maps/MapComponent.ts +312 -0
  650. package/src/maps/MapControlComponent.ts +46 -0
  651. package/src/maps/MapDataSource.ts +20 -0
  652. package/src/maps/MapDesign.ts +103 -0
  653. package/src/maps/MapDesignerComponent.ts +356 -0
  654. package/src/maps/MapFiltersDesignerComponent.ts +95 -0
  655. package/src/maps/MapLayerDataSource.ts +27 -0
  656. package/src/maps/MapLayerViewDesignerComponent.ts +243 -0
  657. package/src/maps/MapLayersDesignerComponent.ts +144 -0
  658. package/src/maps/MapUtils.ts +148 -0
  659. package/src/maps/MapViewComponent.tsx +62 -0
  660. package/src/maps/Maptiler-logo.png +0 -0
  661. package/src/maps/MarkerSymbolSelectComponent.ts +41 -0
  662. package/src/maps/MarkersLayer.ts +941 -0
  663. package/src/maps/MarkersLayerDesign.ts +56 -0
  664. package/src/maps/MarkersLayerDesignerComponent.ts +374 -0
  665. package/src/maps/PopupFilterJoinsEditComponent.ts +114 -0
  666. package/src/maps/PopupFilterJoinsUtils.ts +99 -0
  667. package/src/maps/RasterMapViewComponent.ts +382 -0
  668. package/src/maps/RegionSelectComponent.ts +80 -0
  669. package/src/maps/ScopeAndDetailLevelComponent.ts +82 -0
  670. package/src/maps/ServerMapDataSource.ts +399 -0
  671. package/src/maps/SwitchableTileUrlLayer.tsx +130 -0
  672. package/src/maps/SwitchableTileUrlLayerDesigner.tsx +60 -0
  673. package/src/maps/TileUrlLayer.tsx +142 -0
  674. package/src/maps/UtfGridLayer.ts +286 -0
  675. package/src/maps/VectorMapViewComponent.css +21 -0
  676. package/src/maps/VectorMapViewComponent.tsx +743 -0
  677. package/src/maps/ZoomLevelsComponent.ts +72 -0
  678. package/src/maps/mapSymbols.ts +162 -0
  679. package/src/maps/mapboxUtils.ts +61 -0
  680. package/src/maps/maps.ts +38 -0
  681. package/src/maps/marker-icon-2x.png +0 -0
  682. package/src/maps/marker-icon.png +0 -0
  683. package/src/maps/marker-shadow.png +0 -0
  684. package/src/maps/png.d.ts +1 -0
  685. package/src/maps/symbols/font-awesome/asterisk.png +0 -0
  686. package/src/maps/symbols/font-awesome/ban.png +0 -0
  687. package/src/maps/symbols/font-awesome/beer.png +0 -0
  688. package/src/maps/symbols/font-awesome/bell.png +0 -0
  689. package/src/maps/symbols/font-awesome/bolt.png +0 -0
  690. package/src/maps/symbols/font-awesome/building.png +0 -0
  691. package/src/maps/symbols/font-awesome/bullseye.png +0 -0
  692. package/src/maps/symbols/font-awesome/bus.png +0 -0
  693. package/src/maps/symbols/font-awesome/caret-up.png +0 -0
  694. package/src/maps/symbols/font-awesome/certificate.png +0 -0
  695. package/src/maps/symbols/font-awesome/check-circle.png +0 -0
  696. package/src/maps/symbols/font-awesome/check.png +0 -0
  697. package/src/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  698. package/src/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  699. package/src/maps/symbols/font-awesome/cloud.png +0 -0
  700. package/src/maps/symbols/font-awesome/comment.png +0 -0
  701. package/src/maps/symbols/font-awesome/crosshairs.png +0 -0
  702. package/src/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  703. package/src/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  704. package/src/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  705. package/src/maps/symbols/font-awesome/female.png +0 -0
  706. package/src/maps/symbols/font-awesome/file.png +0 -0
  707. package/src/maps/symbols/font-awesome/flag.png +0 -0
  708. package/src/maps/symbols/font-awesome/flask.png +0 -0
  709. package/src/maps/symbols/font-awesome/h-square.png +0 -0
  710. package/src/maps/symbols/font-awesome/home.png +0 -0
  711. package/src/maps/symbols/font-awesome/info-circle.png +0 -0
  712. package/src/maps/symbols/font-awesome/male.png +0 -0
  713. package/src/maps/symbols/font-awesome/medkit.png +0 -0
  714. package/src/maps/symbols/font-awesome/mobile.png +0 -0
  715. package/src/maps/symbols/font-awesome/plus-circle.png +0 -0
  716. package/src/maps/symbols/font-awesome/plus-square.png +0 -0
  717. package/src/maps/symbols/font-awesome/plus.png +0 -0
  718. package/src/maps/symbols/font-awesome/square.png +0 -0
  719. package/src/maps/symbols/font-awesome/star.png +0 -0
  720. package/src/maps/symbols/font-awesome/thumbs-down.png +0 -0
  721. package/src/maps/symbols/font-awesome/thumbs-up.png +0 -0
  722. package/src/maps/symbols/font-awesome/ticket.png +0 -0
  723. package/src/maps/symbols/font-awesome/times-circle.png +0 -0
  724. package/src/maps/symbols/font-awesome/times.png +0 -0
  725. package/src/maps/symbols/font-awesome/tint.png +0 -0
  726. package/src/maps/symbols/font-awesome/tree.png +0 -0
  727. package/src/maps/symbols/font-awesome/university.png +0 -0
  728. package/src/maps/symbols/font-awesome/usd.png +0 -0
  729. package/src/maps/symbols/font-awesome/user.png +0 -0
  730. package/src/maps/symbols/font-awesome/users.png +0 -0
  731. package/src/maps/symbols/font-awesome/wheelchair.png +0 -0
  732. package/src/maps/vectorMaps.tsx +410 -0
  733. package/src/memoizedDebounce.tsx +32 -0
  734. package/src/quickfilter/DateExprComponent.ts +284 -0
  735. package/src/quickfilter/IdArrayQuickfilterComponent.ts +58 -0
  736. package/src/quickfilter/Quickfilter.ts +29 -0
  737. package/src/quickfilter/QuickfilterCompiler.ts +167 -0
  738. package/src/quickfilter/QuickfilterUtils.ts +123 -0
  739. package/src/quickfilter/QuickfiltersComponent.ts +416 -0
  740. package/src/quickfilter/QuickfiltersDataSource.ts +15 -0
  741. package/src/quickfilter/QuickfiltersDesignComponent.tsx +257 -0
  742. package/src/quickfilter/README.md +8 -0
  743. package/src/quickfilter/TextLiteralComponent.ts +161 -0
  744. package/src/quickfilter/react-onclickout.d.ts +1 -0
  745. package/src/richtext/ExprItemsHtmlConverter.ts +144 -0
  746. package/src/richtext/FontColorPaletteItem.ts +172 -0
  747. package/src/richtext/FontSizePaletteItem.ts +110 -0
  748. package/src/richtext/ItemsHtmlConverter.ts +246 -0
  749. package/src/richtext/README.md +3 -0
  750. package/src/richtext/RichTextComponent.tsx +390 -0
  751. package/src/richtext/react-float-affixed.d.ts +1 -0
  752. package/src/update-object.d.ts +1 -0
  753. package/src/valueFormatter.ts +110 -0
  754. package/src/widgets/DirectWidgetDataSource.ts +67 -0
  755. package/src/widgets/DropdownWidgetComponent.ts +78 -0
  756. package/src/widgets/IFrameWidget.ts +36 -0
  757. package/src/widgets/IFrameWidgetComponent.ts +116 -0
  758. package/src/widgets/ImageUploaderComponent.tsx +143 -0
  759. package/src/widgets/ImageWidget.ts +147 -0
  760. package/src/widgets/ImageWidgetComponent.ts +546 -0
  761. package/src/widgets/ImagelistCarouselComponent.ts +109 -0
  762. package/src/widgets/MapWidget.ts +219 -0
  763. package/src/widgets/MarkdownWidget.ts +201 -0
  764. package/src/widgets/TOCWidget.ts +326 -0
  765. package/src/widgets/Widget.ts +83 -0
  766. package/src/widgets/WidgetDataSource.ts +23 -0
  767. package/src/widgets/WidgetFactory.ts +37 -0
  768. package/src/widgets/WidgetScoper.ts +51 -0
  769. package/src/widgets/WidgetScopesViewComponent.ts +54 -0
  770. package/src/widgets/charts/Chart.ts +140 -0
  771. package/src/widgets/charts/ChartViewComponent.ts +209 -0
  772. package/src/widgets/charts/ChartWidget.ts +345 -0
  773. package/src/widgets/charts/calendar/CalendarChart.ts +227 -0
  774. package/src/widgets/charts/calendar/CalendarChartDesignerComponent.ts +187 -0
  775. package/src/widgets/charts/calendar/CalendarChartViewComponent.tsx +320 -0
  776. package/src/widgets/charts/calendar/d3-tip.d.ts +1 -0
  777. package/src/widgets/charts/imagemosaic/ImageMosaicChart.ts +213 -0
  778. package/src/widgets/charts/imagemosaic/ImageMosaicChartDesignerComponent.ts +121 -0
  779. package/src/widgets/charts/imagemosaic/ImageMosaicChartViewComponent.ts +117 -0
  780. package/src/widgets/charts/imagemosaic/ImagePopupComponent.ts +51 -0
  781. package/src/widgets/charts/imagemosaic/react-lazy-load-image-component.d.ts +1 -0
  782. package/src/widgets/charts/layered/LayeredChart.ts +361 -0
  783. package/src/widgets/charts/layered/LayeredChartCompiler.ts +1299 -0
  784. package/src/widgets/charts/layered/LayeredChartDesign.ts +106 -0
  785. package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +523 -0
  786. package/src/widgets/charts/layered/LayeredChartLayerDesignerComponent.tsx +448 -0
  787. package/src/widgets/charts/layered/LayeredChartSvgFileSaver.ts +146 -0
  788. package/src/widgets/charts/layered/LayeredChartUtils.ts +24 -0
  789. package/src/widgets/charts/layered/LayeredChartViewComponent.ts +486 -0
  790. package/src/widgets/charts/layered/save-svg-as-png.d.ts +1 -0
  791. package/src/widgets/charts/pivot/IntersectionDesignerComponent.tsx +338 -0
  792. package/src/widgets/charts/pivot/PivotChart.ts +377 -0
  793. package/src/widgets/charts/pivot/PivotChartDesign.ts +115 -0
  794. package/src/widgets/charts/pivot/PivotChartDesignerComponent.tsx +240 -0
  795. package/src/widgets/charts/pivot/PivotChartLayout.ts +99 -0
  796. package/src/widgets/charts/pivot/PivotChartLayoutBuilder.ts +779 -0
  797. package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +504 -0
  798. package/src/widgets/charts/pivot/PivotChartQueryBuilder.ts +273 -0
  799. package/src/widgets/charts/pivot/PivotChartUtils.ts +219 -0
  800. package/src/widgets/charts/pivot/PivotChartViewComponent.ts +276 -0
  801. package/src/widgets/charts/pivot/README.md +30 -0
  802. package/src/widgets/charts/pivot/SegmentDesignerComponent.tsx +353 -0
  803. package/src/widgets/charts/table/OrderingsComponent.tsx +119 -0
  804. package/src/widgets/charts/table/TableChart.ts +420 -0
  805. package/src/widgets/charts/table/TableChartDesignerComponent.ts +441 -0
  806. package/src/widgets/charts/table/TableChartViewComponent.ts +327 -0
  807. package/src/widgets/text/ExprInsertModalComponent.ts +77 -0
  808. package/src/widgets/text/ExprItemEditorComponent.tsx +164 -0
  809. package/src/widgets/text/ExprUpdateModalComponent.ts +70 -0
  810. package/src/widgets/text/README.md +2 -0
  811. package/src/widgets/text/TextComponent.tsx +151 -0
  812. package/src/widgets/text/TextWidget.ts +265 -0
  813. package/src/widgets/text/TextWidgetComponent.ts +120 -0
  814. package/src/widgets/text/TextWidgetDesign.ts +7 -0
  815. package/stories/UpdateableComponent.js +29 -0
  816. package/stories/consoles.js +202 -0
  817. package/stories/dashboards.js +217 -0
  818. package/stories/datagridDesign.js +114 -0
  819. package/stories/datagrids.js +69 -0
  820. package/stories/dates.js +80 -0
  821. package/stories/exprcomponent.js +43 -0
  822. package/stories/index.js +18 -0
  823. package/stories/leaflet.js +59 -0
  824. package/stories/maps.js +24 -0
  825. package/stories/pivotChart.js +235 -0
  826. package/test/AxisBuilderTests.ts +931 -0
  827. package/test/ChartWidgetTests.ts +85 -0
  828. package/test/ColorSchemeFactoryTests.ts +29 -0
  829. package/test/CsvBuilderTests.ts +22 -0
  830. package/test/DashboardUpgraderTests.ts +170 -0
  831. package/test/ImplicitFilterBuilderTests.ts +161 -0
  832. package/test/LayeredChartCompilerTests.ts +1067 -0
  833. package/test/LayeredChartTests.ts +88 -0
  834. package/test/LegoLayoutEngineTests.ts +69 -0
  835. package/test/MWaterGlobalFiltersComponentTests.ts +130 -0
  836. package/test/MWaterResponsesFilterComponentTests.ts +164 -0
  837. package/test/QuickfilterCompilerTests.ts +167 -0
  838. package/test/TestComponent.ts +49 -0
  839. package/test/UndoStackTests.ts +73 -0
  840. package/test/WidgetScoperTests.ts +35 -0
  841. package/test/blockUtilsTests.ts +290 -0
  842. package/test/canonical-json.d.ts +1 -0
  843. package/test/dashboards/DashboardUtilsTests.ts +131 -0
  844. package/test/datagrids/DatagridQueryBuilderTests.ts +445 -0
  845. package/test/datagrids/DatagridUtilsTests.ts +54 -0
  846. package/test/datagrids/LabeledExprGeneratorTests.ts +121 -0
  847. package/test/fixtures.ts +263 -0
  848. package/test/index.ts +2 -0
  849. package/test/maps/MapUtilsTests.ts +168 -0
  850. package/test/maps/PopupFilterJoinsUtilsTests.ts +105 -0
  851. package/test/richtext/ItemsHtmlConverterTests.ts +41 -0
  852. package/test/test_index.ts +4 -0
  853. package/test/widgets/TextWidgetTests.ts +42 -0
  854. package/test/widgets/charts/pivot/PivotChartLayoutBuilderTests.ts +817 -0
  855. package/test/widgets/charts/pivot/PivotChartQueryBuilderTests.ts +359 -0
  856. package/test/widgets/charts/pivot/PivotChartTests.ts +64 -0
  857. package/test/widgets/charts/pivot/PivotChartUtilsTests.ts +184 -0
  858. package/test/widgets/charts/table/TableChartTests.ts +253 -0
  859. package/tsconfig.build.json +26 -0
  860. package/types/utm.d.ts +10 -0
@@ -0,0 +1,1092 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const lodash_1 = __importDefault(require("lodash"));
30
+ const expressions_1 = require("@mwater/expressions");
31
+ const expressions_2 = require("@mwater/expressions");
32
+ const AxisBuilder_1 = __importDefault(require("../../../axes/AxisBuilder"));
33
+ const expressions_3 = require("@mwater/expressions");
34
+ const d3Format = __importStar(require("d3-format"));
35
+ const billboard_js_1 = require("billboard.js");
36
+ /** Chart types */
37
+ const chartTypes = {
38
+ bar: billboard_js_1.bar,
39
+ line: billboard_js_1.line,
40
+ spline: billboard_js_1.spline,
41
+ scatter: billboard_js_1.scatter,
42
+ area: billboard_js_1.area,
43
+ pie: billboard_js_1.pie,
44
+ donut: billboard_js_1.donut,
45
+ };
46
+ const commaFormatter = d3Format.format(",");
47
+ const compactFormatter = (d) => {
48
+ // Only if large, otherwise use standard formatting
49
+ if (Math.abs(d) > 999) {
50
+ return d3Format.format("~s")(d).replace('G', 'B');
51
+ }
52
+ else {
53
+ return commaFormatter(d);
54
+ }
55
+ };
56
+ function pieLabelValueFormatter(format, hidePercent = false) {
57
+ function percent(ratio) {
58
+ if (hidePercent) {
59
+ return "";
60
+ }
61
+ else {
62
+ return `(${d3Format.format(".1%")(ratio)})`;
63
+ }
64
+ }
65
+ return function (value, ratio, id) {
66
+ if (format[id]) {
67
+ return `${format[id](value)} ${percent(ratio)}`;
68
+ }
69
+ else {
70
+ return `${d3Format.format(",")(value)} ${percent(ratio)}`;
71
+ }
72
+ };
73
+ }
74
+ function labelValueFormatter(format) {
75
+ return function (value, ratio, id) {
76
+ if (format[id]) {
77
+ return format[id](value);
78
+ }
79
+ else {
80
+ return value;
81
+ }
82
+ };
83
+ }
84
+ const d3Round = d3Format.format(".2f");
85
+ const defaultColors = [
86
+ "#1f77b4",
87
+ "#ff7f0e",
88
+ "#2ca02c",
89
+ "#d62728",
90
+ "#9467bd",
91
+ "#8c564b",
92
+ "#e377c2",
93
+ "#7f7f7f",
94
+ "#bcbd22",
95
+ "#17becf",
96
+ "#aec7e8",
97
+ "#ffbb78",
98
+ "#98df8a",
99
+ "#ff9896",
100
+ "#c5b0d5",
101
+ "#c49c94",
102
+ "#f7b6d2",
103
+ "#c7c7c7",
104
+ "#dbdb8d",
105
+ "#9edae5"
106
+ ];
107
+ // Compiles various parts of a layered chart (line, bar, scatter, spline, area) to C3.js format
108
+ class LayeredChartCompiler {
109
+ schema;
110
+ exprUtils;
111
+ axisBuilder;
112
+ // Pass in schema
113
+ constructor(options) {
114
+ this.schema = options.schema;
115
+ this.exprUtils = new expressions_2.ExprUtils(this.schema);
116
+ this.axisBuilder = new AxisBuilder_1.default({ schema: this.schema });
117
+ }
118
+ /** Create the queries needed for the chart.
119
+ * extraFilters: array of filters to apply. Each is { table: table id, jsonql: jsonql condition with {alias} for tableAlias. }
120
+ * @returns queries indexed by layerX
121
+ */
122
+ createQueries(design, extraFilters) {
123
+ const exprCompiler = new expressions_1.ExprCompiler(this.schema);
124
+ const queries = {};
125
+ // For each layer
126
+ for (let layerIndex = 0, end = design.layers.length, asc = 0 <= end; asc ? layerIndex < end : layerIndex > end; asc ? layerIndex++ : layerIndex--) {
127
+ const layer = design.layers[layerIndex];
128
+ // Limit depends on layer type
129
+ let limit = 1000;
130
+ if (layer.type === "scatter" || design.type === "scatter") {
131
+ limit = 10000; // More possible for scatter chart
132
+ }
133
+ // Create shell of query
134
+ const query = {
135
+ type: "query",
136
+ selects: [],
137
+ from: exprCompiler.compileTable(layer.table, "main"),
138
+ limit,
139
+ groupBy: [],
140
+ orderBy: []
141
+ };
142
+ if (layer.axes.x) {
143
+ query.selects.push({
144
+ type: "select",
145
+ expr: this.axisBuilder.compileAxis({ axis: layer.axes.x, tableAlias: "main" }),
146
+ alias: "x"
147
+ });
148
+ }
149
+ if (layer.axes.color) {
150
+ query.selects.push({
151
+ type: "select",
152
+ expr: this.axisBuilder.compileAxis({ axis: layer.axes.color, tableAlias: "main" }),
153
+ alias: "color"
154
+ });
155
+ }
156
+ if (layer.axes.y) {
157
+ query.selects.push({
158
+ type: "select",
159
+ expr: this.axisBuilder.compileAxis({ axis: layer.axes.y, tableAlias: "main" }),
160
+ alias: "y"
161
+ });
162
+ }
163
+ // Sort by x and color
164
+ if (layer.axes.x || layer.axes.color) {
165
+ query.orderBy.push({ ordinal: 1 });
166
+ }
167
+ if (layer.axes.x && layer.axes.color) {
168
+ query.orderBy.push({ ordinal: 2 });
169
+ }
170
+ // If grouping type
171
+ if (this.doesLayerNeedGrouping(design, layerIndex)) {
172
+ if (layer.axes.x || layer.axes.color) {
173
+ query.groupBy.push(1);
174
+ }
175
+ if (layer.axes.x && layer.axes.color) {
176
+ query.groupBy.push(2);
177
+ }
178
+ }
179
+ // Add where
180
+ let whereClauses = [];
181
+ if (layer.filter) {
182
+ whereClauses.push(this.compileExpr(layer.filter));
183
+ }
184
+ // Add filters
185
+ if (extraFilters && extraFilters.length > 0) {
186
+ // Get relevant filters
187
+ const relevantFilters = lodash_1.default.where(extraFilters, { table: layer.table });
188
+ // If any, create and
189
+ if (relevantFilters.length > 0) {
190
+ // Add others
191
+ for (let filter of relevantFilters) {
192
+ whereClauses.push((0, expressions_3.injectTableAlias)(filter.jsonql, "main"));
193
+ }
194
+ }
195
+ }
196
+ // Wrap if multiple
197
+ whereClauses = lodash_1.default.compact(whereClauses);
198
+ if (whereClauses.length > 1) {
199
+ query.where = { type: "op", op: "and", exprs: whereClauses };
200
+ }
201
+ else {
202
+ query.where = whereClauses[0];
203
+ }
204
+ queries[`layer${layerIndex}`] = query;
205
+ }
206
+ return queries;
207
+ }
208
+ // Create data map of "{layer name}" or "{layer name}:{index}" to { layerIndex, row }
209
+ createDataMap(design, data) {
210
+ return this.compileData(design, data).dataMap;
211
+ }
212
+ // Create the chartOptions to pass to c3.generate
213
+ // options is
214
+ // design: chart design element
215
+ // data: chart data
216
+ // width: chart width
217
+ // height: chart height
218
+ // locale: locale to use
219
+ createChartOptions(options) {
220
+ const c3Data = this.compileData(options.design, options.data, options.locale);
221
+ // Pick first format to use as the tick formatter
222
+ let tickFormatter = lodash_1.default.keys(c3Data.format).length > 0 ? c3Data.format[lodash_1.default.keys(c3Data.format)[0]] : commaFormatter;
223
+ if (options.design.transpose) {
224
+ tickFormatter = compactFormatter;
225
+ }
226
+ // Create chart
227
+ // NOTE: this structure must be comparable with _.isEqual, so don't add any inline functiona
228
+ const chartDesign = {
229
+ data: {
230
+ types: c3Data.types,
231
+ columns: c3Data.columns,
232
+ names: c3Data.names,
233
+ groups: c3Data.groups,
234
+ xs: c3Data.xs,
235
+ colors: c3Data.colors,
236
+ labels: options.design.labels,
237
+ order: c3Data.order,
238
+ color: c3Data.color,
239
+ classes: c3Data.classes
240
+ },
241
+ // Hide if one layer with no color axis
242
+ legend: {
243
+ hide: options.design.layers.length === 1 && !options.design.layers[0].axes.color ? true : c3Data.legendHide
244
+ },
245
+ grid: { focus: { show: false } },
246
+ axis: {
247
+ x: {
248
+ type: c3Data.xAxisType,
249
+ label: {
250
+ text: cleanString(c3Data.xAxisLabelText),
251
+ position: options.design.transpose ? "outer-middle" : "outer-center"
252
+ },
253
+ tick: { fit: c3Data.xAxisTickFit }
254
+ },
255
+ y: {
256
+ label: {
257
+ text: cleanString(c3Data.yAxisLabelText),
258
+ position: options.design.transpose ? "outer-center" : "outer-middle"
259
+ },
260
+ // Set max to 100 if proportional (with no padding)
261
+ max: options.design.type === "bar" && options.design.proportional ? 100 : options.design.yMax,
262
+ min: options.design.type === "bar" && options.design.proportional ? 0 : options.design.yMin,
263
+ padding: options.design.type === "bar" && options.design.proportional
264
+ ? { top: 0, bottom: 0 }
265
+ : {
266
+ top: options.design.yMax != null ? 0 : undefined,
267
+ bottom: options.design.yMin != null ? 0 : undefined
268
+ },
269
+ tick: {
270
+ format: tickFormatter
271
+ }
272
+ },
273
+ rotated: options.design.transpose
274
+ },
275
+ size: { width: options.width, height: options.height },
276
+ pie: {
277
+ label: {
278
+ show: !options.design.hidePercentage || !!options.design.labels,
279
+ format: options.design.labels
280
+ ? pieLabelValueFormatter(c3Data.format, options.design.hidePercentage)
281
+ : undefined
282
+ },
283
+ expand: false // Don't expand/contract
284
+ },
285
+ donut: {
286
+ label: {
287
+ show: !options.design.hidePercentage || !!options.design.labels,
288
+ format: options.design.labels
289
+ ? pieLabelValueFormatter(c3Data.format, options.design.hidePercentage)
290
+ : undefined
291
+ },
292
+ expand: false // Don't expand/contract
293
+ },
294
+ transition: { duration: 0 } // Transitions interfere with scoping
295
+ };
296
+ // && (options.design.type === "pie" || options.design.type === "donut")
297
+ if (options.design.labels) {
298
+ // same color values gets hidden!! https://github.com/naver/billboard.js/issues/871
299
+ chartDesign.data.labels = {
300
+ colors: chartDesign.data.columns.reduce((a, c) => {
301
+ a[c[0]] = '#000';
302
+ return a;
303
+ }, {})
304
+ };
305
+ if (!options.design.transpose) {
306
+ chartDesign.data.labels = {
307
+ ...chartDesign.data.labels,
308
+ position: {
309
+ y: 15
310
+ }, // TODO why does this not type correctly?
311
+ };
312
+ }
313
+ }
314
+ if (lodash_1.default.isEmpty(chartDesign.data.types)) {
315
+ chartDesign.data.type = this.getLayerType(options.design, 0);
316
+ }
317
+ if (!lodash_1.default.isEmpty(c3Data.format)) {
318
+ if (options.design.type === "pie" || options.design.type === "donut") {
319
+ chartDesign.tooltip = {
320
+ format: {
321
+ value: pieLabelValueFormatter(c3Data.format)
322
+ }
323
+ };
324
+ }
325
+ else {
326
+ chartDesign.tooltip = {
327
+ format: {
328
+ value: labelValueFormatter(c3Data.format)
329
+ }
330
+ };
331
+ }
332
+ }
333
+ if (options.design.labels && !lodash_1.default.isEmpty(c3Data.format)) {
334
+ // format = _.map options.design.layers, (layer, layerIndex) =>
335
+ // return if c3Data.format[layerIndex] then c3Data.format[layerIndex] else true
336
+ chartDesign.data.labels = {
337
+ ...chartDesign.data.labels,
338
+ format: c3Data.format
339
+ };
340
+ }
341
+ if (options.design.yThresholds) {
342
+ chartDesign.grid.y = {
343
+ lines: lodash_1.default.map(options.design.yThresholds, (t) => ({
344
+ value: t.value,
345
+ text: t.label
346
+ }))
347
+ };
348
+ }
349
+ // This doesn't work in new C3. Removing.
350
+ // # If x axis is year only, display year in ticks
351
+ // if options.design.layers[0]?.axes.x?.xform?.type == "year"
352
+ // chartDesign.axis.x.tick.format = (x) -> if _.isDate(x) then x.getFullYear() else x
353
+ console.log(chartDesign);
354
+ return chartDesign;
355
+ }
356
+ isCategoricalX(design) {
357
+ // Check if categorical x axis (bar charts always are)
358
+ let categoricalX = design.type === "bar" || lodash_1.default.any(design.layers, (l) => l.type === "bar");
359
+ // Check if x axis is categorical type
360
+ const xType = this.axisBuilder.getAxisType(design.layers[0].axes.x);
361
+ if (["enum", "text", "boolean"].includes(xType || "")) {
362
+ categoricalX = true;
363
+ }
364
+ // Dates that are stacked must be categorical to make stacking work in C3
365
+ if (xType === "date" && design.stacked) {
366
+ categoricalX = true;
367
+ }
368
+ return categoricalX;
369
+ }
370
+ // Compiles data part of C3 chart, including data map back to original data
371
+ // Outputs: columns, types, names, colors. Also dataMap which is a map of "layername:index" to { layerIndex, row }
372
+ compileData(design, data, locale) {
373
+ // If polar chart (no x axis)
374
+ if (["pie", "donut"].includes(design.type) || lodash_1.default.any(design.layers, (l) => ["pie", "donut"].includes(l.type))) {
375
+ return this.compileDataPolar(design, data, locale);
376
+ }
377
+ if (this.isCategoricalX(design)) {
378
+ return this.compileDataCategorical(design, data, locale);
379
+ }
380
+ else {
381
+ return this.compileDataNonCategorical(design, data, locale);
382
+ }
383
+ }
384
+ // Compiles data for a polar chart (pie/donut) with no x axis
385
+ compileDataPolar(design, data, locale) {
386
+ let order;
387
+ const columns = [];
388
+ const types = {};
389
+ const names = {};
390
+ const dataMap = {};
391
+ const colors = {};
392
+ const format = {};
393
+ // For each layer
394
+ lodash_1.default.each(design.layers, (layer, layerIndex) => {
395
+ // If has color axis
396
+ if (layer.axes.color) {
397
+ let layerData = data[`layer${layerIndex}`];
398
+ // Categories will be in form [{ value, label }]
399
+ const categories = this.axisBuilder.getCategories(layer.axes.color, lodash_1.default.pluck(layerData, "color"), { locale });
400
+ // Get indexed ordering of categories (lookup from value to index) without removing excluded values
401
+ const categoryOrder = lodash_1.default.zipObject(lodash_1.default.map(categories, (c, i) => [c.value, i]));
402
+ // Sort by category order
403
+ layerData = lodash_1.default.sortBy(layerData, (row) => categoryOrder[row.color]);
404
+ // Create a series for each row
405
+ lodash_1.default.each(layerData, (row, rowIndex) => {
406
+ // Skip if value excluded
407
+ if (lodash_1.default.includes(layer.axes.color.excludedValues || [], row.color)) {
408
+ return;
409
+ }
410
+ const series = `${layerIndex}:${rowIndex}`;
411
+ // Pie series contain a single value
412
+ columns.push([series, row.y]);
413
+ types[series] = this.getLayerType(design, layerIndex);
414
+ names[series] = this.axisBuilder.formatValue(layer.axes.color, row.color, locale, true);
415
+ dataMap[series] = { layerIndex, row };
416
+ format[series] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, value, locale, true) : "";
417
+ // Get specific color if present
418
+ const color = this.axisBuilder.getValueColor(layer.axes.color, row.color);
419
+ //color = color or layer.color
420
+ if (color) {
421
+ colors[series] = color;
422
+ }
423
+ });
424
+ }
425
+ else {
426
+ // Create a single series
427
+ const row = data[`layer${layerIndex}`][0];
428
+ if (row) {
429
+ const series = `${layerIndex}`;
430
+ columns.push([series, row.y]);
431
+ types[series] = this.getLayerType(design, layerIndex);
432
+ // Name is name of entire layer
433
+ names[series] = layer.name || (design.layers.length === 1 ? "Value" : `Series ${layerIndex + 1}`);
434
+ dataMap[series] = { layerIndex, row };
435
+ format[series] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, value, locale, true) : "";
436
+ // Set color if present
437
+ if (layer.color) {
438
+ colors[series] = layer.color;
439
+ }
440
+ }
441
+ }
442
+ });
443
+ // Determine order (default is desc)
444
+ if (design.polarOrder === "desc") {
445
+ order = "desc";
446
+ }
447
+ else if (design.polarOrder === "asc") {
448
+ order = "asc";
449
+ }
450
+ else if (design.polarOrder === "natural") {
451
+ order = null;
452
+ }
453
+ else {
454
+ order = "desc";
455
+ }
456
+ return {
457
+ columns,
458
+ types,
459
+ names,
460
+ dataMap,
461
+ colors,
462
+ xAxisType: "category",
463
+ titleText: this.compileTitleText(design, locale),
464
+ order,
465
+ format
466
+ };
467
+ }
468
+ // Compiles data for a chart like line or scatter that does not have a categorical x axis
469
+ compileDataNonCategorical(design, data, locale) {
470
+ const columns = [];
471
+ const types = {};
472
+ const names = {};
473
+ const dataMap = {};
474
+ const colors = {};
475
+ const xs = {};
476
+ let groups = [];
477
+ const format = {};
478
+ const legendHide = []; // Which series to hide
479
+ const classes = {}; // Custom classes to add to series
480
+ const xType = this.axisBuilder.getAxisType(design.layers[0].axes.x);
481
+ // For each layer
482
+ lodash_1.default.each(design.layers, (layer, layerIndex) => {
483
+ // Get data of layer
484
+ let layerData = data[`layer${layerIndex}`];
485
+ this.fixStringYValues(layerData);
486
+ if (layer.cumulative) {
487
+ layerData = this.makeRowsCumulative(layerData);
488
+ }
489
+ // Remove excluded values
490
+ layerData = lodash_1.default.filter(layerData, (row) => !lodash_1.default.includes(layer.axes.x.excludedValues || [], row.x));
491
+ // If has color axis
492
+ if (layer.axes.color) {
493
+ // Create a series for each color value
494
+ let colorValues = lodash_1.default.uniq(lodash_1.default.pluck(layerData, "color"));
495
+ // Sort color values by category order:
496
+ // Get categories
497
+ const categories = this.axisBuilder.getCategories(layer.axes.color, colorValues, { locale });
498
+ // Get indexed ordering of categories (lookup from value to index) without removing excluded values
499
+ const categoryOrder = lodash_1.default.zipObject(lodash_1.default.map(categories, (c, i) => [c.value, i]));
500
+ // Sort
501
+ colorValues = lodash_1.default.sortBy(colorValues, (v) => categoryOrder[v]);
502
+ // Exclude excluded ones
503
+ colorValues = lodash_1.default.difference(colorValues, layer.axes.color.excludedValues || []);
504
+ // For each color value
505
+ lodash_1.default.each(colorValues, (colorValue) => {
506
+ // One series for x values, one for y
507
+ const seriesX = `${layerIndex}:${colorValue}:x`;
508
+ const seriesY = `${layerIndex}:${colorValue}:y`;
509
+ // Get specific color if present
510
+ let color = this.axisBuilder.getValueColor(layer.axes.color, colorValue);
511
+ color = color || layer.color || null;
512
+ if (color) {
513
+ colors[seriesY] = color;
514
+ }
515
+ // Get rows for this series
516
+ const rows = lodash_1.default.where(layerData, { color: colorValue });
517
+ const yValues = lodash_1.default.pluck(rows, "y");
518
+ columns.push([seriesY].concat(yValues));
519
+ columns.push([seriesX].concat(lodash_1.default.pluck(rows, "x")));
520
+ types[seriesY] = this.getLayerType(design, layerIndex);
521
+ names[seriesY] = this.axisBuilder.formatValue(layer.axes.color, colorValue, locale, true);
522
+ xs[seriesY] = seriesX;
523
+ format[seriesY] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, value, locale, true) : "";
524
+ lodash_1.default.each(rows, (row, rowIndex) => {
525
+ dataMap[`${seriesY}:${rowIndex}`] = { layerIndex, row };
526
+ });
527
+ });
528
+ }
529
+ else {
530
+ // One series for x values, one for y
531
+ const seriesX = `${layerIndex}:x`;
532
+ const seriesY = `${layerIndex}:y`;
533
+ const yValues = lodash_1.default.pluck(layerData, "y");
534
+ const xValues = lodash_1.default.pluck(layerData, "x");
535
+ columns.push([seriesY].concat(yValues));
536
+ columns.push([seriesX].concat(xValues));
537
+ types[seriesY] = this.getLayerType(design, layerIndex);
538
+ names[seriesY] = layer.name || (design.layers.length === 1 ? "Value" : `Series ${layerIndex + 1}`);
539
+ xs[seriesY] = seriesX;
540
+ colors[seriesY] = layer.color || defaultColors[layerIndex];
541
+ format[seriesY] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, value, locale, true) : "";
542
+ // Add data map for each row
543
+ lodash_1.default.each(layerData, (row, rowIndex) => {
544
+ return (dataMap[`${seriesY}:${rowIndex}`] = { layerIndex, row });
545
+ });
546
+ // Add trendline
547
+ if (layer.trendline === "linear") {
548
+ const trendlineSeries = seriesY + ":trendline";
549
+ columns.push([trendlineSeries].concat(calculateLinearRegression(yValues, xValues)));
550
+ types[trendlineSeries] = (0, billboard_js_1.line)();
551
+ names[trendlineSeries] = names[seriesY] + " Trendline";
552
+ xs[trendlineSeries] = seriesX;
553
+ colors[trendlineSeries] = layer.color || defaultColors[layerIndex];
554
+ legendHide.push(trendlineSeries); // Hide in legend
555
+ format[trendlineSeries] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, d3Round(value), locale, true) : "";
556
+ // Set dots as invisible in CSS and line as dashed
557
+ classes[trendlineSeries] = "trendline";
558
+ }
559
+ }
560
+ });
561
+ // Stack by putting into groups
562
+ if (design.stacked) {
563
+ groups = [lodash_1.default.keys(names)];
564
+ }
565
+ return {
566
+ columns,
567
+ types,
568
+ names,
569
+ groups,
570
+ dataMap,
571
+ colors,
572
+ xs,
573
+ legendHide,
574
+ classes,
575
+ xAxisType: ["date"].includes(xType || "") ? "timeseries" : "indexed",
576
+ xAxisTickFit: false,
577
+ xAxisLabelText: this.compileXAxisLabelText(design, locale),
578
+ yAxisLabelText: this.compileYAxisLabelText(design, locale),
579
+ titleText: this.compileTitleText(design, locale),
580
+ order: undefined,
581
+ format
582
+ };
583
+ }
584
+ // Numbers sometimes arrive as strings from database. Fix by parsing
585
+ fixStringYValues(rows = []) {
586
+ for (let row of rows) {
587
+ if (lodash_1.default.isString(row.y)) {
588
+ row.y = parseFloat(row.y);
589
+ }
590
+ }
591
+ return rows;
592
+ }
593
+ // Flatten if x-type is enumset. e.g. if one row has x = ["a", "b"], make into two rows with x="a" and x="b", summing if already exists
594
+ flattenRowData(rows) {
595
+ const flatRows = [];
596
+ for (var row of rows) {
597
+ // Handle null
598
+ var xs;
599
+ if (!row.x) {
600
+ flatRows.push(row);
601
+ continue;
602
+ }
603
+ if (lodash_1.default.isString(row.x)) {
604
+ // Handle failed parsings graciously in case question used to be a non-array
605
+ try {
606
+ xs = JSON.parse(row.x);
607
+ }
608
+ catch (error) {
609
+ xs = row.x;
610
+ }
611
+ }
612
+ else {
613
+ xs = row.x;
614
+ }
615
+ for (var x of xs) {
616
+ // Find existing row
617
+ const existingRow = lodash_1.default.find(flatRows, (r) => r.x === x && r.color === row.color);
618
+ if (existingRow) {
619
+ existingRow.y += row.y;
620
+ }
621
+ else {
622
+ flatRows.push(lodash_1.default.extend({}, row, { x }));
623
+ }
624
+ }
625
+ }
626
+ return flatRows;
627
+ }
628
+ compileDataCategorical(design, data, locale) {
629
+ let categoryXs;
630
+ const columns = [];
631
+ const types = {};
632
+ const names = {};
633
+ const dataMap = {};
634
+ const colors = {};
635
+ const xs = {};
636
+ let groups = [];
637
+ const format = {};
638
+ const colorOverrides = {}; // Mapping of "<layer>:<index>" to color if overridden
639
+ const legendHide = []; // Which series to hide
640
+ const classes = {}; // Custom classes to add to series
641
+ // Get all values of the x-axis, taking into account values that might be missing
642
+ const xAxis = lodash_1.default.extend({}, design.layers[0].axes.x);
643
+ const nullLabel = lodash_1.default.first(lodash_1.default.compact(design.layers.map((l) => l.axes.x.nullLabel)));
644
+ xAxis.nullLabel = nullLabel;
645
+ const xType = this.axisBuilder.getAxisType(xAxis);
646
+ // Get all known values from all layers
647
+ let xValues = [];
648
+ lodash_1.default.each(design.layers, (layer, layerIndex) => {
649
+ // Get data of layer
650
+ const layerData = data[`layer${layerIndex}`];
651
+ return (xValues = lodash_1.default.union(xValues, lodash_1.default.uniq(lodash_1.default.pluck(layerData, "x"))));
652
+ });
653
+ // Categories will be in form [{ value, label }]
654
+ let categories = this.axisBuilder.getCategories(xAxis, xValues, { locale, onlyValuesPresent: design.layers[0].xAxisOnlyValuesPresent });
655
+ // Get indexed ordering of categories (lookup from value to index) without removing excluded values
656
+ const categoryOrder = lodash_1.default.zipObject(lodash_1.default.map(categories, (c, i) => [c.value, i]));
657
+ // Exclude excluded values
658
+ categories = lodash_1.default.filter(categories, (category) => !lodash_1.default.includes(xAxis.excludedValues || [], category.value));
659
+ // Limit categories to prevent crashes in C3 (https://github.com/mWater/mwater-visualization/issues/272)
660
+ if (xType !== "enumset") {
661
+ // Take last ones to make dates prettier (enough to show all weeks)
662
+ categories = lodash_1.default.takeRight(categories, 55);
663
+ categoryXs = lodash_1.default.indexBy(categories, "value");
664
+ }
665
+ // Create map of category value to index
666
+ const categoryMap = lodash_1.default.object(lodash_1.default.map(categories, (c, i) => [c.value, i]));
667
+ // Create common x series
668
+ columns.push(["x"].concat(lodash_1.default.map(categories, (category) => this.axisBuilder.formatCategory(xAxis, category))));
669
+ // For each layer
670
+ lodash_1.default.each(design.layers, (layer, layerIndex) => {
671
+ // Get data of layer
672
+ let column, series;
673
+ let layerData = data[`layer${layerIndex}`];
674
+ // Fix string y values
675
+ layerData = this.fixStringYValues(layerData);
676
+ // Flatten if x-type is enumset. e.g. if one row has x = ["a", "b"], make into two rows with x="a" and x="b", summing if already exists
677
+ if (xType === "enumset") {
678
+ layerData = this.flattenRowData(layerData);
679
+ }
680
+ // Reorder to category order for x-axis
681
+ layerData = lodash_1.default.sortBy(layerData, (row) => categoryOrder[row.x]);
682
+ // Make rows cumulative
683
+ if (layer.cumulative) {
684
+ layerData = this.makeRowsCumulative(layerData);
685
+ }
686
+ // Filter out categories that were removed
687
+ if (xType !== "enumset") {
688
+ layerData = lodash_1.default.filter(layerData, (row) => categoryXs[row.x] != null);
689
+ }
690
+ // If has color axis
691
+ if (layer.axes.color) {
692
+ // Create a series for each color value
693
+ let colorValues = lodash_1.default.uniq(lodash_1.default.pluck(layerData, "color"));
694
+ // Sort color values by category order:
695
+ // Get categories
696
+ const colorCategories = this.axisBuilder.getCategories(layer.axes.color, colorValues, { locale });
697
+ // Get indexed ordering of categories (lookup from value to index) without removing excluded values
698
+ const colorCategoryOrder = lodash_1.default.zipObject(lodash_1.default.map(colorCategories, (c, i) => [c.value, i]));
699
+ // Sort
700
+ colorValues = lodash_1.default.sortBy(colorValues, (v) => colorCategoryOrder[v]);
701
+ // Exclude excluded ones
702
+ colorValues = lodash_1.default.difference(colorValues, layer.axes.color.excludedValues || []);
703
+ if (colorValues.length > 0) {
704
+ lodash_1.default.each(colorValues, (colorValue) => {
705
+ // One series for y values
706
+ const series = `${layerIndex}:${colorValue}`;
707
+ // Get specific color if present
708
+ let color = this.axisBuilder.getValueColor(layer.axes.color, colorValue);
709
+ color = color || layer.color;
710
+ if (color) {
711
+ colors[series] = color;
712
+ }
713
+ // Get rows for this series
714
+ const rows = lodash_1.default.where(layerData, { color: colorValue });
715
+ // Create empty series
716
+ const column = lodash_1.default.map(categories, (c) => null);
717
+ // Set rows
718
+ lodash_1.default.each(rows, (row) => {
719
+ // Get index
720
+ const index = categoryMap[row.x];
721
+ if (index != null) {
722
+ column[index] = row.y;
723
+ dataMap[`${series}:${index}`] = { layerIndex, row };
724
+ }
725
+ });
726
+ // Fill in nulls if cumulative
727
+ if (layer.cumulative) {
728
+ for (let i = 0; i < column.length; i++) {
729
+ const value = column[i];
730
+ if (value == null && i > 0) {
731
+ column[i] = column[i - 1];
732
+ }
733
+ }
734
+ }
735
+ columns.push([series].concat(column));
736
+ types[series] = this.getLayerType(design, layerIndex);
737
+ names[series] = this.axisBuilder.formatValue(layer.axes.color, colorValue, locale, true);
738
+ xs[series] = "x";
739
+ format[series] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, value, locale, true) : "";
740
+ });
741
+ }
742
+ else {
743
+ //c3 acts funny when there is a split axis but no data
744
+ series = `${layerIndex}:dumm`;
745
+ column = lodash_1.default.map(categories, (c) => null);
746
+ columns.push([series].concat(column));
747
+ types[series] = this.getLayerType(design, layerIndex);
748
+ names[series] = this.axisBuilder.formatValue(layer.axes.color, null, locale, true);
749
+ xs[series] = "x";
750
+ format[series] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, value, locale, true) : "";
751
+ }
752
+ }
753
+ else {
754
+ // One series for y
755
+ series = `${layerIndex}`;
756
+ // Create empty series
757
+ column = lodash_1.default.map(categories, (c) => null);
758
+ // Set rows
759
+ lodash_1.default.each(layerData, (row) => {
760
+ // Skip if value excluded
761
+ if (lodash_1.default.includes(layer.axes.x.excludedValues || [], row.x)) {
762
+ return;
763
+ }
764
+ // Get index
765
+ const index = categoryMap[row.x];
766
+ column[index] = row.y;
767
+ dataMap[`${series}:${index}`] = { layerIndex, row };
768
+ // Get color override
769
+ if (layer.xColorMap) {
770
+ const color = this.axisBuilder.getValueColor(layer.axes.x, row.x);
771
+ if (color) {
772
+ colorOverrides[`${series}:${index}`] = color;
773
+ }
774
+ }
775
+ });
776
+ columns.push([series].concat(column));
777
+ types[series] = this.getLayerType(design, layerIndex);
778
+ names[series] = layer.name || (design.layers.length === 1 ? "Value" : `Series ${layerIndex + 1}`);
779
+ xs[series] = "x";
780
+ colors[series] = layer.color || defaultColors[layerIndex];
781
+ format[series] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, value, locale, true) : "";
782
+ // Add trendline
783
+ if (layer.trendline === "linear") {
784
+ const trendlineSeries = series + ":trendline";
785
+ let trendXs = lodash_1.default.range(column.length);
786
+ let trendYs = column;
787
+ // Skip null last value
788
+ if (categories.length > 0 && lodash_1.default.last(categories).value === null) {
789
+ trendXs = lodash_1.default.initial(trendXs);
790
+ trendYs = lodash_1.default.initial(trendYs);
791
+ }
792
+ columns.push([trendlineSeries].concat(calculateLinearRegression(trendYs, trendXs)));
793
+ types[trendlineSeries] = (0, billboard_js_1.line)();
794
+ names[trendlineSeries] = names[series] + " Trendline";
795
+ xs[trendlineSeries] = "x";
796
+ colors[trendlineSeries] = layer.color || defaultColors[layerIndex];
797
+ legendHide.push(trendlineSeries); // Hide in legend
798
+ format[trendlineSeries] = (value) => value != null ? this.axisBuilder.formatValue(layer.axes.y, d3Round(value), locale, true) : "";
799
+ // Set dots as invisible in CSS and line as dashed
800
+ classes[trendlineSeries] = "trendline";
801
+ }
802
+ }
803
+ });
804
+ // Stack by putting into groups
805
+ if (design.stacked) {
806
+ groups = [lodash_1.default.keys(names)];
807
+ }
808
+ else if (design.layers.length > 1) {
809
+ groups = [];
810
+ for (var layerIndex = 0; layerIndex < design.layers.length; layerIndex++) {
811
+ // If has multiple layers and color axes within layers. Stack individual layers unless stacked is false
812
+ const layer = design.layers[layerIndex];
813
+ const defaultStacked = layer.axes.color != null;
814
+ const stacked = layer.stacked != null ? layer.stacked : defaultStacked;
815
+ if (stacked) {
816
+ groups.push(lodash_1.default.filter(lodash_1.default.keys(names), (series) => series.split(":")[0] === `${layerIndex}`));
817
+ }
818
+ }
819
+ // Remove empty groups
820
+ groups = lodash_1.default.filter(groups, (g) => g.length > 1);
821
+ }
822
+ // If proportional
823
+ if (design.proportional) {
824
+ // Calculate total for each x
825
+ let column, i;
826
+ const xtotals = [];
827
+ for (column of columns) {
828
+ // Skip x column
829
+ if (column[0] === "x") {
830
+ continue;
831
+ }
832
+ for (let i = 1; i < column.length; i++) {
833
+ xtotals[i] = (xtotals[i] || 0) + (column[i] || 0);
834
+ }
835
+ }
836
+ // Now make percentage with one decimal
837
+ for (column of columns) {
838
+ // Skip x column
839
+ var asc1, end1;
840
+ if (column[0] === "x") {
841
+ continue;
842
+ }
843
+ for (let i = 1; i < column.length; i++) {
844
+ if (column[i] > 0) {
845
+ column[i] = Math.round(((100 * column[i]) / xtotals[i]) * 10) / 10;
846
+ }
847
+ }
848
+ }
849
+ }
850
+ return {
851
+ columns,
852
+ types,
853
+ names,
854
+ dataMap,
855
+ colors,
856
+ xs,
857
+ groups,
858
+ legendHide,
859
+ classes,
860
+ xAxisType: "category",
861
+ xAxisTickFit: xType !== "date",
862
+ xAxisLabelText: this.compileXAxisLabelText(design, locale),
863
+ yAxisLabelText: this.compileYAxisLabelText(design, locale),
864
+ titleText: this.compileTitleText(design, locale),
865
+ order: null,
866
+ format,
867
+ color: (color, d) => {
868
+ // Handle overall series color which calls with a non-object for d
869
+ if (typeof d !== "object") {
870
+ // Overall series is not changed in color
871
+ return color;
872
+ }
873
+ const key = `${d.id}:${d.index}`;
874
+ if (colorOverrides[key]) {
875
+ color = colorOverrides[key];
876
+ }
877
+ // Apply thresholds (in order)
878
+ const sortedYThresholds = lodash_1.default.sortBy(design.yThresholds || [], "value");
879
+ for (let yThreshold of sortedYThresholds) {
880
+ if (yThreshold.value != null && d.value > yThreshold.value && yThreshold.highlightColor) {
881
+ color = yThreshold.highlightColor;
882
+ }
883
+ }
884
+ return color;
885
+ }
886
+ };
887
+ }
888
+ // Compile an expression
889
+ compileExpr(expr) {
890
+ const exprCompiler = new expressions_1.ExprCompiler(this.schema);
891
+ return exprCompiler.compileExpr({ expr, tableAlias: "main" });
892
+ }
893
+ // Get layer type, defaulting to overall type
894
+ getLayerType(design, layerIndex) {
895
+ // Special handling for mocha tests where chartTypes has all undefined values
896
+ // See https://github.com/mWater/mwater-visualization/issues/453#issuecomment-1103671467
897
+ const chartTypeString = design.layers[layerIndex].type || design.type;
898
+ if (chartTypes[chartTypeString]) {
899
+ return chartTypes[chartTypeString]();
900
+ }
901
+ return chartTypeString;
902
+ }
903
+ getLayerTypeString(design, layerIndex) {
904
+ return design.layers[layerIndex].type || design.type;
905
+ }
906
+ // Determine if layer required grouping by x (and color)
907
+ doesLayerNeedGrouping(design, layerIndex) {
908
+ return this.getLayerTypeString(design, layerIndex) !== "scatter";
909
+ }
910
+ // Determine if layer can use x axis
911
+ canLayerUseXExpr(design, layerIndex) {
912
+ let needle;
913
+ return (needle = this.getLayerTypeString(design, layerIndex)), !["pie", "donut"].includes(needle);
914
+ }
915
+ isXAxisRequired(design, layerIndex) {
916
+ let needle;
917
+ return lodash_1.default.any(design.layers, (layer, i) => ((needle = this.getLayerTypeString(design, i)), !["pie", "donut"].includes(needle)));
918
+ }
919
+ isColorAxisRequired(design, layerIndex) {
920
+ let needle;
921
+ return (needle = this.getLayerTypeString(design, layerIndex)), ["pie", "donut"].includes(needle);
922
+ }
923
+ compileDefaultTitleText(design, locale) {
924
+ // Don't default this for now
925
+ return "";
926
+ }
927
+ // if design.layers[0].axes.x
928
+ // return @compileYAxisLabelText(design) + " by " + @compileXAxisLabelText(design)
929
+ // else
930
+ // return @compileYAxisLabelText(design) + " by " + @axisBuilder.summarizeAxis(design.layers[0].axes.color)
931
+ compileDefaultYAxisLabelText(design, locale) {
932
+ return this.axisBuilder.summarizeAxis(design.layers[0].axes.y, locale);
933
+ }
934
+ compileDefaultXAxisLabelText(design, locale) {
935
+ return this.axisBuilder.summarizeAxis(design.layers[0].axes.x, locale);
936
+ }
937
+ compileTitleText(design, locale) {
938
+ return design.titleText || this.compileDefaultTitleText(design, locale);
939
+ }
940
+ compileYAxisLabelText(design, locale) {
941
+ if (design.yAxisLabelText === "") {
942
+ return this.compileDefaultYAxisLabelText(design, locale);
943
+ }
944
+ return design.yAxisLabelText;
945
+ }
946
+ compileXAxisLabelText(design, locale) {
947
+ if (design.xAxisLabelText === "") {
948
+ return this.compileDefaultXAxisLabelText(design, locale);
949
+ }
950
+ return design.xAxisLabelText;
951
+ }
952
+ // Create a scope based on a row of a layer
953
+ // Scope data is relevant data from row that uniquely identifies scope
954
+ // plus a layer index
955
+ createScope(design, layerIndex, row, locale) {
956
+ let filter, filterExpr;
957
+ // Get layer
958
+ const layer = design.layers[layerIndex];
959
+ const filters = [];
960
+ const filterExprs = [];
961
+ const names = [];
962
+ const data = { layerIndex };
963
+ // If x
964
+ if (layer.axes.x) {
965
+ // Handle special case of enumset which is flattened to enum type
966
+ if (this.axisBuilder.getAxisType(layer.axes.x) === "enumset") {
967
+ filters.push({
968
+ type: "op",
969
+ op: "@>",
970
+ exprs: [
971
+ {
972
+ type: "op",
973
+ op: "::jsonb",
974
+ exprs: [this.axisBuilder.compileAxis({ axis: layer.axes.x, tableAlias: "{alias}" })]
975
+ },
976
+ { type: "op", op: "::jsonb", exprs: [JSON.stringify(row.x)] }
977
+ ]
978
+ });
979
+ filterExprs.push({
980
+ table: layer.table,
981
+ type: "op",
982
+ op: "contains",
983
+ exprs: [
984
+ this.axisBuilder.convertAxisToExpr(layer.axes.x),
985
+ { type: "literal", valueType: "enumset", value: [row.x] }
986
+ ]
987
+ });
988
+ names.push(this.axisBuilder.summarizeAxis(layer.axes.x, locale) +
989
+ " includes " +
990
+ this.exprUtils.stringifyExprLiteral(layer.axes.x.expr, [row.x], locale));
991
+ data.x = row.x;
992
+ }
993
+ else {
994
+ filters.push(this.axisBuilder.createValueFilter(layer.axes.x, row.x));
995
+ filterExprs.push(this.axisBuilder.createValueFilterExpr(layer.axes.x, row.x));
996
+ names.push(this.axisBuilder.summarizeAxis(layer.axes.x, locale) +
997
+ " is " +
998
+ this.axisBuilder.formatValue(layer.axes.x, row.x, locale, true));
999
+ data.x = row.x;
1000
+ }
1001
+ }
1002
+ if (layer.axes.color) {
1003
+ filters.push(this.axisBuilder.createValueFilter(layer.axes.color, row.color));
1004
+ filterExprs.push(this.axisBuilder.createValueFilterExpr(layer.axes.color, row.color));
1005
+ names.push(this.axisBuilder.summarizeAxis(layer.axes.color, locale) +
1006
+ " is " +
1007
+ this.axisBuilder.formatValue(layer.axes.color, row.color, locale, true));
1008
+ data.color = row.color;
1009
+ }
1010
+ if (filters.length > 1) {
1011
+ filter = {
1012
+ table: layer.table,
1013
+ jsonql: {
1014
+ type: "op",
1015
+ op: "and",
1016
+ exprs: filters
1017
+ }
1018
+ };
1019
+ filterExpr = {
1020
+ table: layer.table,
1021
+ type: "op",
1022
+ op: "and",
1023
+ exprs: filterExprs
1024
+ };
1025
+ }
1026
+ else {
1027
+ filter = {
1028
+ table: layer.table,
1029
+ jsonql: filters[0]
1030
+ };
1031
+ filterExpr = filterExprs[0];
1032
+ }
1033
+ const scope = {
1034
+ name: expressions_2.ExprUtils.localizeString(this.schema.getTable(layer.table).name, locale) + " " + names.join(" and "),
1035
+ filter,
1036
+ filterExpr,
1037
+ data
1038
+ };
1039
+ return scope;
1040
+ }
1041
+ // Converts a series of rows to have cumulative y axis, separating out by color axis if present
1042
+ makeRowsCumulative(rows) {
1043
+ // Indexed by color
1044
+ const totals = {};
1045
+ const newRows = [];
1046
+ for (let row of rows) {
1047
+ // Add up total
1048
+ const total = totals[row.color] || 0;
1049
+ const y = total + row.y;
1050
+ totals[row.color] = y;
1051
+ // If x is null, don't make cumulative
1052
+ if (row.x === null) {
1053
+ newRows.push(row);
1054
+ }
1055
+ else {
1056
+ // Create new row
1057
+ newRows.push(lodash_1.default.extend({}, row, { y }));
1058
+ }
1059
+ }
1060
+ return newRows;
1061
+ }
1062
+ }
1063
+ exports.default = LayeredChartCompiler;
1064
+ // Clean out nbsp (U+00A0) as it causes c3 errors
1065
+ function cleanString(str) {
1066
+ if (!str) {
1067
+ return str;
1068
+ }
1069
+ return str.replace("\u00A0", " ");
1070
+ }
1071
+ // Calculate a linear regression, returning a series of y values that match the x values
1072
+ function calculateLinearRegression(ys, xs) {
1073
+ // If xs are dates, convert to numbers
1074
+ if (lodash_1.default.isString(xs[0])) {
1075
+ xs = lodash_1.default.map(xs, (x) => Date.parse(x));
1076
+ }
1077
+ // Remove null ys
1078
+ const nonNullxs = lodash_1.default.filter(xs, (x, index) => ys[index] !== null);
1079
+ const nonNullys = lodash_1.default.filter(ys, (y, index) => ys[index] !== null);
1080
+ const n = nonNullys.length;
1081
+ const sumXY = lodash_1.default.sum(lodash_1.default.map(nonNullxs, (x, i) => x * nonNullys[i]));
1082
+ const sumXX = lodash_1.default.sum(lodash_1.default.map(nonNullxs, (x) => x * x));
1083
+ const sumX = lodash_1.default.sum(nonNullxs);
1084
+ const sumY = lodash_1.default.sum(nonNullys);
1085
+ // Calculate denominator
1086
+ const den = n * sumXX - sumX * sumX;
1087
+ // Calculate slope
1088
+ const slope = (n * sumXY - sumX * sumY) / den;
1089
+ // Calculate intercept
1090
+ const intercept = (sumY * sumXX - sumX * sumXY) / den;
1091
+ return lodash_1.default.map(xs, (x) => x * slope + intercept);
1092
+ }