@mwater/visualization 5.1.0 → 5.3.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 (305) hide show
  1. package/lib/ColorComponent.d.ts +10 -11
  2. package/lib/ColorComponent.js +78 -29
  3. package/lib/ColorSchemeFactory.d.ts +13 -2
  4. package/lib/ColorSchemeFactory.js +7 -5
  5. package/lib/CustomColorsContext.d.ts +6 -0
  6. package/lib/CustomColorsContext.js +6 -0
  7. package/lib/FiltersDesignerComponent.d.ts +1 -4
  8. package/lib/FiltersDesignerComponent.js +2 -3
  9. package/lib/GlobalFilter.d.ts +13 -0
  10. package/lib/GlobalFilter.js +2 -0
  11. package/lib/LocaleContextInjector.d.ts +5 -11
  12. package/lib/LocaleContextInjector.js +4 -12
  13. package/lib/MWaterAddRelatedFormComponent.js +3 -3
  14. package/lib/MWaterAddRelatedIndicatorComponent.d.ts +1 -4
  15. package/lib/MWaterAddRelatedIndicatorComponent.js +6 -6
  16. package/lib/MWaterCompleteTableSelectComponent.d.ts +7 -25
  17. package/lib/MWaterCompleteTableSelectComponent.js +36 -36
  18. package/lib/MWaterContextComponent.d.ts +19 -9
  19. package/lib/MWaterContextComponent.js +38 -22
  20. package/lib/MWaterCustomTablesetListComponent.js +9 -3
  21. package/lib/MWaterGlobalFiltersComponent.d.ts +6 -5
  22. package/lib/MWaterGlobalFiltersComponent.js +4 -4
  23. package/lib/MWaterLoaderComponent.d.ts +15 -3
  24. package/lib/MWaterLoaderComponent.js +11 -2
  25. package/lib/MWaterTableSelectComponent.d.ts +1 -4
  26. package/lib/MWaterTableSelectComponent.js +10 -12
  27. package/lib/UIComponents.d.ts +2 -2
  28. package/lib/UIComponents.js +4 -12
  29. package/lib/axes/Axis.d.ts +20 -25
  30. package/lib/axes/AxisBuilder.d.ts +7 -4
  31. package/lib/axes/AxisBuilder.js +12 -8
  32. package/lib/axes/AxisComponent.d.ts +6 -9
  33. package/lib/axes/AxisComponent.js +1 -2
  34. package/lib/axes/ColorPaletteCollectionComponent.d.ts +5 -12
  35. package/lib/axes/ColorPaletteCollectionComponent.js +67 -36
  36. package/lib/dashboards/DashboardComponent.d.ts +4 -17
  37. package/lib/dashboards/DashboardComponent.js +20 -67
  38. package/lib/dashboards/DashboardDesign.d.ts +5 -20
  39. package/lib/dashboards/DashboardUpgrader.js +36 -1
  40. package/lib/dashboards/DashboardViewComponent.d.ts +5 -34
  41. package/lib/dashboards/DashboardViewComponent.js +112 -136
  42. package/lib/dashboards/FontStyleEditor.d.ts +8 -0
  43. package/lib/dashboards/FontStyleEditor.js +130 -0
  44. package/lib/dashboards/LayoutOptionsComponent.d.ts +0 -1
  45. package/lib/dashboards/LayoutOptionsComponent.js +209 -39
  46. package/lib/dashboards/ServerDashboardDataSource.d.ts +1 -2
  47. package/lib/dashboards/ServerDashboardDataSource.js +52 -33
  48. package/lib/dashboards/SettingsModalComponent.d.ts +4 -15
  49. package/lib/dashboards/SettingsModalComponent.js +24 -38
  50. package/lib/dashboards/WidgetComponent.d.ts +3 -3
  51. package/lib/dashboards/WidgetComponent.js +3 -6
  52. package/lib/dashboards/WidgetDataSourcePrioritizer.d.ts +20 -0
  53. package/lib/dashboards/WidgetDataSourcePrioritizer.js +72 -0
  54. package/lib/dashboards/layoutOptions.d.ts +83 -0
  55. package/lib/dashboards/layoutOptions.js +436 -10
  56. package/lib/datagrids/DatagridComponent.d.ts +2 -9
  57. package/lib/datagrids/DatagridDataSource.d.ts +3 -3
  58. package/lib/datagrids/DatagridDataSource.js +0 -14
  59. package/lib/datagrids/DatagridDesign.d.ts +7 -6
  60. package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -93
  61. package/lib/datagrids/DatagridDesignerComponent.js +8 -6
  62. package/lib/datagrids/DatagridViewComponent.js +1 -1
  63. package/lib/datagrids/FindReplaceModalComponent.d.ts +4 -20
  64. package/lib/datagrids/FindReplaceModalComponent.js +27 -13
  65. package/lib/datagrids/ServerDatagridDataSource.d.ts +8 -7
  66. package/lib/datagrids/ServerDatagridDataSource.js +88 -36
  67. package/lib/demo.js +4 -4
  68. package/lib/index.css +5 -0
  69. package/lib/index.d.ts +2 -1
  70. package/lib/index.js +0 -1
  71. package/lib/layouts/LayoutManager.d.ts +33 -29
  72. package/lib/layouts/LayoutManager.js +2 -8
  73. package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +26 -56
  74. package/lib/layouts/blocks/BlocksDisplayComponent.js +122 -205
  75. package/lib/layouts/blocks/BlocksLayoutManager.d.ts +6 -22
  76. package/lib/layouts/blocks/BlocksLayoutManager.js +5 -14
  77. package/lib/layouts/blocks/HorizontalBlockComponent.d.ts +5 -4
  78. package/lib/layouts/blocks/HorizontalBlockComponent.js +5 -5
  79. package/lib/layouts/grid/GridLayoutManager.d.ts +2 -1
  80. package/lib/mWaterLoader.d.ts +2 -0
  81. package/lib/mWaterLoader.js +2 -1
  82. package/lib/maps/AddLayerComponent.d.ts +6 -8
  83. package/lib/maps/AddLayerComponent.js +6 -6
  84. package/lib/maps/BingLayer.js +10 -20
  85. package/lib/maps/BufferLayer.js +5 -2
  86. package/lib/maps/ChoroplethLayer.js +2 -1
  87. package/lib/maps/ClusterLayer.js +3 -1
  88. package/lib/maps/DirectMapDataSource.d.ts +5 -2
  89. package/lib/maps/DirectMapDataSource.js +2 -1
  90. package/lib/maps/EditPopupComponent.js +2 -1
  91. package/lib/maps/GridLayer.js +5 -3
  92. package/lib/maps/GridLayerDesigner.js +0 -1
  93. package/lib/maps/LayerSwitcherComponent.js +1 -1
  94. package/lib/maps/MapComponent.d.ts +3 -11
  95. package/lib/maps/MapComponent.js +3 -3
  96. package/lib/maps/MapDesign.d.ts +2 -13
  97. package/lib/maps/MapFiltersDesignerComponent.d.ts +0 -4
  98. package/lib/maps/MapFiltersDesignerComponent.js +4 -5
  99. package/lib/maps/MarkersLayer.js +30 -25
  100. package/lib/maps/RasterMapViewComponent.d.ts +3 -13
  101. package/lib/maps/RasterMapViewComponent.js +3 -3
  102. package/lib/maps/RegionSelectComponent.d.ts +2 -1
  103. package/lib/maps/ServerMapDataSource.d.ts +3 -4
  104. package/lib/maps/ServerMapDataSource.js +5 -5
  105. package/lib/maps/VectorMapViewComponent.js +2 -1
  106. package/lib/maps/mapSymbols.js +2 -0
  107. package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
  108. package/lib/maps/vectorMaps.d.ts +1 -0
  109. package/lib/maps/vectorMaps.js +70 -56
  110. package/lib/quickfilter/QuickfilterCompiler.d.ts +1 -1
  111. package/lib/quickfilter/QuickfiltersComponent.d.ts +1 -4
  112. package/lib/quickfilter/QuickfiltersComponent.js +3 -3
  113. package/lib/richtext/DropdownPaletteItem.d.ts +32 -0
  114. package/lib/richtext/DropdownPaletteItem.js +82 -0
  115. package/lib/richtext/FontColorPaletteItem.d.ts +1 -5
  116. package/lib/richtext/FontColorPaletteItem.js +32 -27
  117. package/lib/richtext/ItemsHtmlConverter.js +12 -3
  118. package/lib/richtext/RichTextComponent.d.ts +26 -52
  119. package/lib/richtext/RichTextComponent.js +166 -128
  120. package/lib/valueFormatter.js +6 -1
  121. package/lib/wellknown.d.ts +5 -0
  122. package/lib/wellknown.js +288 -0
  123. package/lib/widgets/DropdownWidgetComponent.d.ts +8 -25
  124. package/lib/widgets/DropdownWidgetComponent.js +48 -25
  125. package/lib/widgets/IFrameWidgetComponent.d.ts +3 -11
  126. package/lib/widgets/ImageWidgetComponent.d.ts +8 -27
  127. package/lib/widgets/MapWidget.d.ts +4 -7
  128. package/lib/widgets/MapWidget.js +2 -1
  129. package/lib/widgets/MarkdownWidget.d.ts +2 -7
  130. package/lib/widgets/TOCWidget.d.ts +2 -9
  131. package/lib/widgets/TOCWidget.js +2 -1
  132. package/lib/widgets/Widget.d.ts +2 -0
  133. package/lib/widgets/WidgetDataSource.d.ts +3 -1
  134. package/lib/widgets/charts/Chart.d.ts +0 -1
  135. package/lib/widgets/charts/ChartViewComponent.d.ts +4 -0
  136. package/lib/widgets/charts/ChartViewComponent.js +11 -3
  137. package/lib/widgets/charts/ChartWidget.d.ts +1 -74
  138. package/lib/widgets/charts/ChartWidget.js +4 -183
  139. package/lib/widgets/charts/ChartWidgetComponent.d.ts +51 -0
  140. package/lib/widgets/charts/ChartWidgetComponent.js +167 -0
  141. package/lib/widgets/charts/calendar/CalendarChartViewComponent.d.ts +1 -4
  142. package/lib/widgets/charts/calendar/CalendarChartViewComponent.js +4 -4
  143. package/lib/widgets/charts/imagemosaic/ImagePopupComponent.d.ts +2 -7
  144. package/lib/widgets/charts/layered/LayeredChart.d.ts +5 -10
  145. package/lib/widgets/charts/layered/LayeredChart.js +6 -7
  146. package/lib/widgets/charts/layered/LayeredChartCompiler.d.ts +4 -2
  147. package/lib/widgets/charts/layered/LayeredChartCompiler.js +46 -32
  148. package/lib/widgets/charts/layered/LayeredChartDesign.d.ts +4 -0
  149. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.d.ts +5 -31
  150. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +21 -3
  151. package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.d.ts +1 -7
  152. package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.js +2 -1
  153. package/lib/widgets/charts/layered/LayeredChartViewComponent.d.ts +1 -4
  154. package/lib/widgets/charts/layered/LayeredChartViewComponent.js +89 -38
  155. package/lib/widgets/charts/pivot/IntersectionDesignerComponent.d.ts +5 -105
  156. package/lib/widgets/charts/pivot/IntersectionDesignerComponent.js +122 -166
  157. package/lib/widgets/charts/pivot/PivotChart.d.ts +6 -0
  158. package/lib/widgets/charts/pivot/PivotChart.js +47 -17
  159. package/lib/widgets/charts/pivot/PivotChartDesign.d.ts +11 -0
  160. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.d.ts +11 -7
  161. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.js +1 -1
  162. package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.d.ts +2 -2
  163. package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.js +20 -36
  164. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +0 -1
  165. package/lib/widgets/charts/pivot/PivotChartQueryBuilder.d.ts +23 -2
  166. package/lib/widgets/charts/pivot/PivotChartQueryBuilder.js +215 -181
  167. package/lib/widgets/charts/pivot/PivotChartUtils.d.ts +2 -2
  168. package/lib/widgets/charts/pivot/PivotChartViewComponent.d.ts +9 -47
  169. package/lib/widgets/charts/pivot/PivotChartViewComponent.js +20 -60
  170. package/lib/widgets/charts/pivot/SegmentDesignerComponent.d.ts +55 -58
  171. package/lib/widgets/charts/table/TableChart.js +8 -4
  172. package/lib/widgets/charts/table/TableChartDesignerComponent.js +3 -3
  173. package/lib/widgets/charts/table/TableChartViewComponent.js +30 -16
  174. package/lib/widgets/text/ExprInsertModalComponent.d.ts +2 -13
  175. package/lib/widgets/text/ExprUpdateModalComponent.d.ts +2 -13
  176. package/lib/widgets/text/TextComponent.d.ts +5 -12
  177. package/lib/widgets/text/TextComponent.js +19 -39
  178. package/lib/widgets/text/TextWidget.d.ts +2 -1
  179. package/lib/widgets/text/TextWidget.js +5 -1
  180. package/lib/widgets/text/TextWidgetComponent.d.ts +15 -3
  181. package/lib/widgets/text/TextWidgetComponent.js +76 -19
  182. package/lib/widgets/text/TextWidgetDesign.d.ts +16 -2
  183. package/lib/widgets/text/TextWidgetDesign.js +6 -0
  184. package/package.json +4 -4
  185. package/src/ColorComponent.tsx +177 -0
  186. package/src/ColorSchemeFactory.ts +12 -6
  187. package/src/CustomColorsContext.tsx +8 -0
  188. package/src/FiltersDesignerComponent.ts +3 -4
  189. package/src/GlobalFilter.ts +17 -0
  190. package/src/LocaleContextInjector.tsx +14 -13
  191. package/src/MWaterAddRelatedFormComponent.ts +3 -3
  192. package/src/MWaterAddRelatedIndicatorComponent.ts +6 -6
  193. package/src/MWaterCompleteTableSelectComponent.tsx +36 -36
  194. package/src/MWaterContextComponent.tsx +42 -33
  195. package/src/MWaterCustomTablesetListComponent.tsx +21 -3
  196. package/src/MWaterGlobalFiltersComponent.ts +8 -8
  197. package/src/MWaterLoaderComponent.ts +14 -4
  198. package/src/MWaterTableSelectComponent.tsx +11 -12
  199. package/src/{UIComponents.ts → UIComponents.tsx} +7 -15
  200. package/src/axes/Axis.ts +24 -25
  201. package/src/axes/AxisBuilder.ts +16 -13
  202. package/src/axes/AxisComponent.ts +3 -4
  203. package/src/axes/{ColorPaletteCollectionComponent.ts → ColorPaletteCollectionComponent.tsx} +87 -61
  204. package/src/dashboards/DashboardComponent.tsx +73 -147
  205. package/src/dashboards/DashboardDesign.ts +5 -25
  206. package/src/dashboards/DashboardUpgrader.ts +41 -1
  207. package/src/dashboards/DashboardViewComponent.tsx +313 -0
  208. package/src/dashboards/FontStyleEditor.tsx +166 -0
  209. package/src/dashboards/LayoutOptionsComponent.tsx +377 -71
  210. package/src/dashboards/ServerDashboardDataSource.ts +52 -33
  211. package/src/dashboards/SettingsModalComponent.tsx +170 -0
  212. package/src/dashboards/WidgetComponent.tsx +6 -12
  213. package/src/dashboards/WidgetDataSourcePrioritizer.ts +82 -0
  214. package/src/dashboards/layoutOptions.tsx +581 -0
  215. package/src/datagrids/DatagridDataSource.ts +6 -12
  216. package/src/datagrids/DatagridDesign.ts +8 -3
  217. package/src/datagrids/DatagridDesignerComponent.tsx +22 -18
  218. package/src/datagrids/DatagridViewComponent.ts +3 -3
  219. package/src/datagrids/ExprCellComponent.ts +0 -1
  220. package/src/datagrids/FindReplaceModalComponent.ts +39 -22
  221. package/src/datagrids/ServerDatagridDataSource.ts +107 -45
  222. package/src/demo.ts +4 -4
  223. package/src/index.css +5 -0
  224. package/src/index.ts +2 -1
  225. package/src/layouts/LayoutManager.ts +44 -42
  226. package/src/layouts/blocks/BlocksDisplayComponent.tsx +498 -0
  227. package/src/layouts/blocks/BlocksLayoutManager.ts +6 -15
  228. package/src/layouts/blocks/HorizontalBlockComponent.ts +9 -8
  229. package/src/mWaterLoader.ts +4 -1
  230. package/src/maps/AddLayerComponent.ts +9 -9
  231. package/src/maps/BingLayer.ts +16 -26
  232. package/src/maps/BufferLayer.ts +5 -2
  233. package/src/maps/ChoroplethLayer.ts +2 -1
  234. package/src/maps/ClusterLayer.ts +3 -1
  235. package/src/maps/DirectMapDataSource.ts +12 -3
  236. package/src/maps/EditPopupComponent.ts +2 -1
  237. package/src/maps/GridLayer.ts +5 -3
  238. package/src/maps/GridLayerDesigner.tsx +0 -1
  239. package/src/maps/LayerSwitcherComponent.tsx +1 -1
  240. package/src/maps/MapComponent.ts +3 -3
  241. package/src/maps/MapDesign.ts +2 -17
  242. package/src/maps/{MapFiltersDesignerComponent.ts → MapFiltersDesignerComponent.tsx} +25 -25
  243. package/src/maps/MarkersLayer.ts +38 -41
  244. package/src/maps/RasterMapViewComponent.ts +3 -3
  245. package/src/maps/ServerMapDataSource.ts +8 -8
  246. package/src/maps/VectorMapViewComponent.tsx +2 -2
  247. package/src/maps/mapSymbols.ts +2 -0
  248. package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
  249. package/src/maps/vectorMaps.tsx +88 -74
  250. package/src/quickfilter/QuickfilterCompiler.ts +1 -1
  251. package/src/quickfilter/QuickfiltersComponent.ts +3 -3
  252. package/src/richtext/DropdownPaletteItem.tsx +144 -0
  253. package/src/richtext/FontColorPaletteItem.tsx +160 -0
  254. package/src/richtext/ItemsHtmlConverter.ts +15 -5
  255. package/src/richtext/RichTextComponent.tsx +274 -232
  256. package/src/valueFormatter.ts +5 -1
  257. package/src/wellknown.ts +286 -0
  258. package/src/widgets/DropdownWidgetComponent.tsx +75 -0
  259. package/src/widgets/MapWidget.ts +5 -2
  260. package/src/widgets/TOCWidget.ts +2 -1
  261. package/src/widgets/Widget.ts +3 -0
  262. package/src/widgets/WidgetDataSource.ts +3 -1
  263. package/src/widgets/charts/Chart.ts +1 -1
  264. package/src/widgets/charts/ChartViewComponent.ts +16 -3
  265. package/src/widgets/charts/ChartWidget.ts +3 -275
  266. package/src/widgets/charts/ChartWidgetComponent.tsx +281 -0
  267. package/src/widgets/charts/calendar/CalendarChartViewComponent.tsx +4 -4
  268. package/src/widgets/charts/layered/LayeredChart.ts +4 -6
  269. package/src/widgets/charts/layered/LayeredChartCompiler.ts +80 -63
  270. package/src/widgets/charts/layered/LayeredChartDesign.ts +7 -1
  271. package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +43 -10
  272. package/src/widgets/charts/layered/LayeredChartLayerDesignerComponent.tsx +6 -6
  273. package/src/widgets/charts/layered/LayeredChartViewComponent.ts +140 -88
  274. package/src/widgets/charts/pivot/IntersectionDesignerComponent.tsx +305 -221
  275. package/src/widgets/charts/pivot/PivotChart.ts +56 -18
  276. package/src/widgets/charts/pivot/PivotChartDesign.ts +12 -0
  277. package/src/widgets/charts/pivot/PivotChartDesignerComponent.tsx +4 -3
  278. package/src/widgets/charts/pivot/PivotChartLayoutBuilder.ts +39 -76
  279. package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +0 -1
  280. package/src/widgets/charts/pivot/PivotChartQueryBuilder.ts +230 -189
  281. package/src/widgets/charts/pivot/PivotChartUtils.ts +4 -4
  282. package/src/widgets/charts/pivot/{PivotChartViewComponent.ts → PivotChartViewComponent.tsx} +86 -89
  283. package/src/widgets/charts/table/TableChart.ts +8 -4
  284. package/src/widgets/charts/table/TableChartDesignerComponent.ts +4 -4
  285. package/src/widgets/charts/table/TableChartViewComponent.ts +32 -19
  286. package/src/widgets/text/TextComponent.tsx +47 -49
  287. package/src/widgets/text/TextWidget.ts +8 -3
  288. package/src/widgets/text/TextWidgetComponent.tsx +249 -0
  289. package/src/widgets/text/TextWidgetDesign.ts +26 -2
  290. package/src/ColorComponent.ts +0 -117
  291. package/src/dashboards/DashboardViewComponent.ts +0 -304
  292. package/src/dashboards/SettingsModalComponent.ts +0 -169
  293. package/src/dashboards/layoutOptions.ts +0 -40
  294. package/src/layout-styles.css +0 -263
  295. package/src/layouts/blocks/BlocksDisplayComponent.ts +0 -461
  296. package/src/layouts/grid/GridLayoutComponent.ts +0 -67
  297. package/src/layouts/grid/GridLayoutManager.ts +0 -185
  298. package/src/layouts/grid/LegoLayoutEngine.ts +0 -142
  299. package/src/layouts/grid/PaletteItemComponent.ts +0 -28
  300. package/src/layouts/grid/README.md +0 -14
  301. package/src/layouts/grid/WidgetContainerComponent.ts +0 -420
  302. package/src/richtext/FontColorPaletteItem.ts +0 -172
  303. package/src/richtext/FontSizePaletteItem.ts +0 -110
  304. package/src/widgets/DropdownWidgetComponent.ts +0 -78
  305. package/src/widgets/text/TextWidgetComponent.ts +0 -120
@@ -4,10 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.LayoutOptionsComponent = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
7
8
  const react_1 = __importDefault(require("react"));
8
9
  const react_2 = require("react");
9
10
  const bootstrap_1 = require("@mwater/react-library/lib/bootstrap");
10
11
  const layoutOptions_1 = require("./layoutOptions");
12
+ const ColorComponent_1 = __importDefault(require("../ColorComponent"));
13
+ const FontStyleEditor_1 = require("./FontStyleEditor");
14
+ const immer_1 = __importDefault(require("immer"));
15
+ const file_saver_1 = __importDefault(require("file-saver"));
11
16
  const sizeOptions = [
12
17
  { value: { width: 360, height: 640 }, label: "Phone (360x640)" },
13
18
  { value: { width: 768, height: 1024 }, label: "Tablet (768x1024)" },
@@ -20,45 +25,20 @@ function LayoutOptionsComponent(props) {
20
25
  function setLayoutOptions(layoutOptions) {
21
26
  props.onDesignChange({ ...props.design, layoutOptions });
22
27
  }
23
- function handleResetDefaults() {
24
- props.onDesignChange({ ...props.design, layoutOptions: (0, layoutOptions_1.getDefaultLayoutOptions)(props.design.style) });
25
- }
26
- return (react_1.default.createElement("div", { style: { display: "grid", gridTemplateRows: "auto 1fr", gridTemplateColumns: "auto 1fr", height: "100%" } },
27
- react_1.default.createElement("div", { style: { padding: 5, gridRow: "1 / 3" } },
28
- react_1.default.createElement("div", { key: "back" },
29
- react_1.default.createElement("button", { className: "btn btn-sm btn-link", onClick: props.onClose },
30
- react_1.default.createElement("i", { className: "fa fa-arrow-left" }),
31
- " Close")),
32
- react_1.default.createElement("br", null),
28
+ const isCustomized = !lodash_1.default.isEqual(layoutOptions, (0, layoutOptions_1.getDefaultLayoutOptions)(props.design.style));
29
+ return (react_1.default.createElement("div", { style: { display: "grid", gridTemplateRows: "auto 1fr", gridTemplateColumns: "360px 1fr", height: "100%" } },
30
+ react_1.default.createElement("div", { style: { padding: "5px 10px 5px 0px", gridRow: "1 / 3", overflowY: "auto" } },
31
+ react_1.default.createElement("h5", null, "Theme"),
33
32
  react_1.default.createElement(ThemeToggle, { theme: props.design.style, onChange: (theme) => {
33
+ if (isCustomized) {
34
+ if (!confirm("Are you sure you want to change the theme? Your customizations will be lost."))
35
+ return;
36
+ }
34
37
  props.onDesignChange({ ...props.design, style: theme, layoutOptions: (0, layoutOptions_1.getDefaultLayoutOptions)(theme) });
35
- } }),
38
+ }, isCustomized: isCustomized }),
36
39
  react_1.default.createElement("br", null),
37
- react_1.default.createElement("h4", null, "Advanced"),
38
- react_1.default.createElement("a", { className: "btn btn-sm btn-link", style: { float: "right" }, onClick: handleResetDefaults }, "Reset to Defaults"),
39
- react_1.default.createElement(bootstrap_1.FormGroup, { label: "Collapse to Single Column" },
40
- react_1.default.createElement(WidthSelector, { value: layoutOptions.collapseColumnsWidth, onChange: (collapseColumnsWidth) => {
41
- setLayoutOptions({ ...layoutOptions, collapseColumnsWidth });
42
- }, sign: "< " })),
43
- react_1.default.createElement(bootstrap_1.FormGroup, { label: "Hide Quickfilters" },
44
- react_1.default.createElement(WidthSelector, { value: layoutOptions.hideQuickfiltersWidth, onChange: (hideQuickfiltersWidth) => {
45
- setLayoutOptions({ ...layoutOptions, hideQuickfiltersWidth });
46
- }, sign: "< " })),
47
- react_1.default.createElement(bootstrap_1.FormGroup, { label: "Minimum Width (before scrolling or scaling)" },
48
- react_1.default.createElement(WidthSelector, { value: layoutOptions.minimumWidth, onChange: (minimumWidth) => {
49
- setLayoutOptions({ ...layoutOptions, minimumWidth });
50
- }, sign: "< " }),
51
- react_1.default.createElement(bootstrap_1.FormGroup, { label: "When Below Minimum Width" },
52
- react_1.default.createElement(bootstrap_1.Toggle, { value: layoutOptions.belowMinimumWidth, onChange: (belowMinimumWidth) => {
53
- setLayoutOptions({ ...layoutOptions, belowMinimumWidth: belowMinimumWidth });
54
- }, options: [
55
- { value: "scroll", label: "Scroll" },
56
- { value: "scale", label: "Scale" }
57
- ] }))),
58
- react_1.default.createElement(bootstrap_1.FormGroup, { label: "Maximum Width (before padding)" },
59
- react_1.default.createElement(WidthSelector, { value: layoutOptions.maximumWidth, onChange: (maximumWidth) => {
60
- setLayoutOptions({ ...layoutOptions, maximumWidth });
61
- }, sign: "> " }))),
40
+ react_1.default.createElement(bootstrap_1.CollapsibleSection, { label: react_1.default.createElement("h5", { style: { display: "inline-block" } }, "Customize Layout"), initiallyOpen: isCustomized },
41
+ react_1.default.createElement(CustomizeLayout, { layoutOptions: layoutOptions, onLayoutOptionsChange: setLayoutOptions }))),
62
42
  react_1.default.createElement("div", { style: { textAlign: "center", padding: 3 } },
63
43
  react_1.default.createElement("span", { className: "text-muted" }, "Preview As:\u00A0"),
64
44
  react_1.default.createElement(bootstrap_1.Toggle, { value: previewSize, onChange: setPreviewSize, size: "xs", options: sizeOptions.map((so, index) => ({ value: index, label: so.label })) })),
@@ -84,7 +64,7 @@ function LayoutOptionsComponent(props) {
84
64
  exports.LayoutOptionsComponent = LayoutOptionsComponent;
85
65
  function ThemeToggle(props) {
86
66
  function renderStyleItem(theme) {
87
- const isActive = (props.theme || "default") == theme;
67
+ const isActive = props.isCustomized ? theme == "custom" : (props.theme || "default") == theme;
88
68
  if (theme == "default") {
89
69
  return (react_1.default.createElement("a", { key: theme, className: isActive ? "list-group-item active" : "list-group-item", onClick: props.onChange.bind(null, "default") },
90
70
  react_1.default.createElement("div", null, "Classic Dashboard"),
@@ -100,12 +80,202 @@ function ThemeToggle(props) {
100
80
  react_1.default.createElement("div", null, "Story"),
101
81
  react_1.default.createElement("div", { style: { opacity: 0.6 } }, "Ideal for data-driven storytelling with lots of text")));
102
82
  }
83
+ if (theme == "custom") {
84
+ return (react_1.default.createElement("a", { key: theme, className: isActive ? "list-group-item active" : "list-group-item" },
85
+ react_1.default.createElement("div", null, "Custom"),
86
+ react_1.default.createElement("div", { style: { opacity: 0.6 } }, "Customized theme")));
87
+ }
103
88
  return null;
104
89
  }
105
- return (react_1.default.createElement(bootstrap_1.FormGroup, { label: "Theme" },
90
+ return (react_1.default.createElement("div", { className: "list-group" },
106
91
  renderStyleItem("default"),
107
92
  renderStyleItem("greybg"),
108
- renderStyleItem("story")));
93
+ renderStyleItem("story"),
94
+ props.isCustomized && renderStyleItem("custom")));
95
+ }
96
+ function CustomizeLayout(props) {
97
+ const { layoutOptions, onLayoutOptionsChange } = props;
98
+ const handleDownloadTheme = () => {
99
+ const blob = new Blob([JSON.stringify(layoutOptions, null, 2)], { type: "application/json" });
100
+ file_saver_1.default.saveAs(blob, "custom_theme.theme");
101
+ };
102
+ const handleUploadTheme = (event) => {
103
+ const file = event.target.files?.[0];
104
+ if (file) {
105
+ const reader = new FileReader();
106
+ reader.onload = (e) => {
107
+ try {
108
+ const uploadedTheme = JSON.parse(e.target?.result);
109
+ onLayoutOptionsChange(uploadedTheme);
110
+ }
111
+ catch (error) {
112
+ alert("Invalid theme file");
113
+ }
114
+ };
115
+ reader.readAsText(file);
116
+ }
117
+ };
118
+ return (react_1.default.createElement("div", null,
119
+ react_1.default.createElement(bootstrap_1.CollapsiblePanel, { title: "Text" },
120
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Title" },
121
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.titleWidgetFont, onChange: (titleWidgetFont) => {
122
+ onLayoutOptionsChange({ ...layoutOptions, titleWidgetFont });
123
+ } })),
124
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Heading H1" },
125
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.textWidgetH1Font, onChange: (textWidgetH1Font) => {
126
+ onLayoutOptionsChange({ ...layoutOptions, textWidgetH1Font });
127
+ } }),
128
+ react_1.default.createElement("div", { className: "mt-1" },
129
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Top Margin:", horizontal: true, labelMuted: true },
130
+ react_1.default.createElement(PixelsInput, { value: layoutOptions.textWidgetH1MarginTop, onChange: (textWidgetH1MarginTop) => {
131
+ onLayoutOptionsChange({ ...layoutOptions, textWidgetH1MarginTop: textWidgetH1MarginTop });
132
+ } })))),
133
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Heading H2" },
134
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.textWidgetH2Font, onChange: (textWidgetH2Font) => {
135
+ onLayoutOptionsChange({ ...layoutOptions, textWidgetH2Font });
136
+ } }),
137
+ react_1.default.createElement("div", { className: "mt-1" },
138
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Top Margin:", horizontal: true, labelMuted: true },
139
+ react_1.default.createElement(PixelsInput, { value: layoutOptions.textWidgetH2MarginTop, onChange: (textWidgetH2MarginTop) => {
140
+ onLayoutOptionsChange({ ...layoutOptions, textWidgetH2MarginTop: textWidgetH2MarginTop });
141
+ } })))),
142
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Text" },
143
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.textWidgetFont, onChange: (textWidgetFont) => {
144
+ onLayoutOptionsChange({ ...layoutOptions, textWidgetFont });
145
+ } }),
146
+ react_1.default.createElement("div", { className: "mt-1" },
147
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Line Height:", horizontal: true, labelMuted: true },
148
+ react_1.default.createElement(PixelsInput, { value: layoutOptions.textWidgetLineHeight, onChange: (textWidgetLineHeight) => {
149
+ onLayoutOptionsChange({ ...layoutOptions, textWidgetLineHeight: textWidgetLineHeight });
150
+ }, allowDefault: true, defaultLabel: "Default" })),
151
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Paragraph Spacing:", horizontal: true, labelMuted: true },
152
+ react_1.default.createElement(PixelsInput, { value: layoutOptions.textWidgetParagraphSpacing, onChange: (textWidgetParagraphSpacing) => {
153
+ onLayoutOptionsChange({ ...layoutOptions, textWidgetParagraphSpacing: textWidgetParagraphSpacing });
154
+ } })))),
155
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "List Line Height:", horizontal: true },
156
+ react_1.default.createElement(PixelsInput, { value: layoutOptions.textWidgetListLineHeight, onChange: (textWidgetListLineHeight) => {
157
+ onLayoutOptionsChange({ ...layoutOptions, textWidgetListLineHeight: textWidgetListLineHeight });
158
+ }, allowDefault: true, defaultLabel: "Default" })),
159
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Chart Header Font" },
160
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.widgetHeaderFont, onChange: (widgetHeaderFont) => {
161
+ onLayoutOptionsChange({ ...layoutOptions, widgetHeaderFont });
162
+ } })),
163
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Chart Footer Font" },
164
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.widgetFooterFont, onChange: (widgetFooterFont) => {
165
+ onLayoutOptionsChange({ ...layoutOptions, widgetFooterFont });
166
+ } })),
167
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Chart Font" },
168
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.chartFont, onChange: (chartFont) => {
169
+ onLayoutOptionsChange({ ...layoutOptions, chartFont });
170
+ } })),
171
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Table Font" },
172
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.tableFont, onChange: (tableFont) => {
173
+ onLayoutOptionsChange({ ...layoutOptions, tableFont });
174
+ } })),
175
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Pivot Table Font" },
176
+ react_1.default.createElement(FontStyleEditor_1.FontStyleEditor, { value: layoutOptions.pivotTableFont, onChange: (pivotTableFont) => {
177
+ onLayoutOptionsChange({ ...layoutOptions, pivotTableFont });
178
+ } }))),
179
+ react_1.default.createElement(bootstrap_1.CollapsiblePanel, { title: "Spacing" },
180
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Outer Padding:", horizontal: true },
181
+ react_1.default.createElement(PixelsInput, { value: layoutOptions.outerPadding, onChange: (outerPadding) => {
182
+ onLayoutOptionsChange({ ...layoutOptions, outerPadding: outerPadding });
183
+ } })),
184
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Block Margins" },
185
+ react_1.default.createElement(SpacingInput, { value: layoutOptions.blockMargin, onChange: (blockMargin) => {
186
+ onLayoutOptionsChange({ ...layoutOptions, blockMargin });
187
+ } })),
188
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Block Padding" },
189
+ react_1.default.createElement(SpacingInput, { value: layoutOptions.blockPadding, onChange: (blockPadding) => {
190
+ onLayoutOptionsChange({ ...layoutOptions, blockPadding });
191
+ } })),
192
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Block Border Radius:", horizontal: true },
193
+ react_1.default.createElement(PixelsInput, { value: layoutOptions.blockBorderRadius, onChange: (blockBorderRadius) => {
194
+ onLayoutOptionsChange({ ...layoutOptions, blockBorderRadius: blockBorderRadius });
195
+ } }))),
196
+ react_1.default.createElement(bootstrap_1.CollapsiblePanel, { title: "Colors" },
197
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Background Color:", horizontal: true },
198
+ react_1.default.createElement(ColorComponent_1.default, { color: layoutOptions.backgroundColor, onChange: (backgroundColor) => {
199
+ onLayoutOptionsChange({ ...layoutOptions, backgroundColor: backgroundColor ?? "white" });
200
+ } })),
201
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Block Background Color:", horizontal: true },
202
+ react_1.default.createElement(ColorComponent_1.default, { color: layoutOptions.blockBackgroundColor, onChange: (blockBackgroundColor) => {
203
+ onLayoutOptionsChange({ ...layoutOptions, blockBackgroundColor: blockBackgroundColor ?? "white" });
204
+ } })),
205
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Custom Colors" },
206
+ react_1.default.createElement("div", { style: { display: 'grid', gridTemplateColumns: 'repeat(6, 1fr)', gap: '5px' } }, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map((colorIndex) => (react_1.default.createElement(ColorComponent_1.default, { key: colorIndex, color: layoutOptions.customColors[colorIndex], onChange: (color) => {
207
+ onLayoutOptionsChange((0, immer_1.default)(layoutOptions, (draft) => {
208
+ draft.customColors[colorIndex] = color;
209
+ }));
210
+ } })))))),
211
+ react_1.default.createElement(bootstrap_1.CollapsiblePanel, { title: "Responsive Layout" },
212
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Collapse to Single Column" },
213
+ react_1.default.createElement(WidthSelector, { value: layoutOptions.collapseColumnsWidth, onChange: (collapseColumnsWidth) => {
214
+ onLayoutOptionsChange({ ...layoutOptions, collapseColumnsWidth });
215
+ }, sign: "< " })),
216
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Hide Quickfilters" },
217
+ react_1.default.createElement(WidthSelector, { value: layoutOptions.hideQuickfiltersWidth, onChange: (hideQuickfiltersWidth) => {
218
+ onLayoutOptionsChange({ ...layoutOptions, hideQuickfiltersWidth });
219
+ }, sign: "< " })),
220
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Minimum Width (before scrolling or scaling)" },
221
+ react_1.default.createElement(WidthSelector, { value: layoutOptions.minimumWidth, onChange: (minimumWidth) => {
222
+ onLayoutOptionsChange({ ...layoutOptions, minimumWidth });
223
+ }, sign: "< " }),
224
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "When Below Minimum Width" },
225
+ react_1.default.createElement(bootstrap_1.Toggle, { value: layoutOptions.belowMinimumWidth, onChange: (belowMinimumWidth) => {
226
+ onLayoutOptionsChange({ ...layoutOptions, belowMinimumWidth: belowMinimumWidth });
227
+ }, size: "sm", options: [
228
+ { value: "scroll", label: "Scroll" },
229
+ { value: "scale", label: "Scale" }
230
+ ] }))),
231
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Maximum Width (before padding)" },
232
+ react_1.default.createElement(WidthSelector, { value: layoutOptions.maximumWidth, onChange: (maximumWidth) => {
233
+ onLayoutOptionsChange({ ...layoutOptions, maximumWidth });
234
+ }, sign: "> " })),
235
+ react_1.default.createElement(bootstrap_1.Checkbox, { value: layoutOptions.collapseSpacers, onChange: (collapseSpacers) => {
236
+ onLayoutOptionsChange({ ...layoutOptions, collapseSpacers });
237
+ } }, "Collapse Spacers on Mobile")),
238
+ react_1.default.createElement(bootstrap_1.CollapsiblePanel, { title: "Download/Upload Theme", initiallyClosed: true },
239
+ react_1.default.createElement("div", { className: "mb-2 text-muted" }, "Download or upload a custom theme to use for this dashboard. This saves the current theme as a theme file that you can then use on other dashboards by uploading it there."),
240
+ react_1.default.createElement("div", { style: { display: "flex", flexDirection: "column", marginTop: "10px", gap: "10px" } },
241
+ react_1.default.createElement("button", { className: "btn btn-sm btn-secondary", onClick: handleDownloadTheme },
242
+ react_1.default.createElement("i", { className: "fas fa-download" }),
243
+ " Download Custom Theme"),
244
+ react_1.default.createElement("label", { className: "btn btn-sm btn-secondary" },
245
+ react_1.default.createElement("i", { className: "fas fa-upload" }),
246
+ " Upload Custom Theme",
247
+ react_1.default.createElement("input", { type: "file", accept: ".theme", style: { display: "none" }, onChange: handleUploadTheme }))))));
248
+ }
249
+ function SpacingInput(props) {
250
+ return (react_1.default.createElement("div", { style: { display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', width: '100%' } },
251
+ react_1.default.createElement("div", null, "Top"),
252
+ react_1.default.createElement("div", null, "Bottom"),
253
+ react_1.default.createElement("div", null, "Left"),
254
+ react_1.default.createElement("div", null, "Right"),
255
+ react_1.default.createElement(PixelsInput, { value: props.value.top, onChange: (top) => props.onChange({ ...props.value, top: top }) }),
256
+ react_1.default.createElement(PixelsInput, { value: props.value.bottom, onChange: (bottom) => props.onChange({ ...props.value, bottom: bottom }) }),
257
+ react_1.default.createElement(PixelsInput, { value: props.value.left, onChange: (left) => props.onChange({ ...props.value, left: left }) }),
258
+ react_1.default.createElement(PixelsInput, { value: props.value.right, onChange: (right) => props.onChange({ ...props.value, right: right }) })));
259
+ }
260
+ function PixelsInput(props) {
261
+ const options = [
262
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 35, 40
263
+ ];
264
+ return (react_1.default.createElement("div", { className: "dropdown" },
265
+ react_1.default.createElement("a", { className: "dropdown-toggle", type: "button", id: "pixelsInputDropdown", "data-bs-toggle": "dropdown", "aria-expanded": "false" }, props.value === null ? (props.defaultLabel || "Default") : `${props.value}px`),
266
+ react_1.default.createElement("ul", { className: "dropdown-menu", "aria-labelledby": "pixelsInputDropdown" },
267
+ props.allowDefault && (react_1.default.createElement("li", { key: "default" },
268
+ react_1.default.createElement("a", { className: "dropdown-item", href: "#", onClick: (e) => {
269
+ e.preventDefault();
270
+ props.onChange(null);
271
+ } }, props.defaultLabel || "Default"))),
272
+ options.map(option => (react_1.default.createElement("li", { key: option },
273
+ react_1.default.createElement("a", { className: "dropdown-item", href: "#", onClick: (e) => {
274
+ e.preventDefault();
275
+ props.onChange(option);
276
+ } },
277
+ option,
278
+ "px")))))));
109
279
  }
110
280
  function WidthSelector(props) {
111
281
  return (react_1.default.createElement(bootstrap_1.Select, { value: props.value, onChange: props.onChange, nullLabel: "N/A", options: [
@@ -1,4 +1,3 @@
1
- /// <reference types="jquery" />
2
1
  import { DataSource, Expr } from "@mwater/expressions";
3
2
  import { JsonQLFilter } from "../JsonQLFilter";
4
3
  import { QuickfiltersDataSource } from "../quickfilter/QuickfiltersDataSource";
@@ -42,7 +41,7 @@ declare class ServerQuickfilterDataSource implements QuickfiltersDataSource {
42
41
  declare class ServerWidgetDataSource {
43
42
  options: ServerWidgetDataSourceOptions;
44
43
  constructor(options: ServerWidgetDataSourceOptions);
45
- getData(design: any, filters: JsonQLFilter[], callback: (error: any, data?: any) => void): JQuery.jqXHR<any>;
44
+ getData(design: any, filters: JsonQLFilter[], callback: (error: any, data?: any) => void): void;
46
45
  getMapDataSource(design: any): ServerWidgetMapDataSource;
47
46
  getImageUrl(imageId: string, height?: number): string;
48
47
  }
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const lodash_1 = __importDefault(require("lodash"));
7
- const jquery_1 = __importDefault(require("jquery"));
8
7
  const expressions_1 = require("@mwater/expressions");
9
8
  const querystring_1 = __importDefault(require("querystring"));
10
9
  const LayerFactory_1 = __importDefault(require("../maps/LayerFactory"));
@@ -55,18 +54,23 @@ class ServerQuickfilterDataSource {
55
54
  const seconds = Math.floor((new Date().getTime() - cacheExpiry) / 1000);
56
55
  headers["Cache-Control"] = `max-age=${seconds}`;
57
56
  }
58
- jquery_1.default.ajax({
59
- dataType: "json",
57
+ fetch(url, {
60
58
  method: "GET",
61
- url,
62
- headers
59
+ headers: headers
60
+ })
61
+ .then(async (response) => {
62
+ if (!response.ok) {
63
+ const text = await response.text();
64
+ throw new Error(text);
65
+ }
66
+ return response.json();
63
67
  })
64
- .done((data) => {
68
+ .then(data => {
65
69
  return callback(null, data);
66
70
  })
67
- .fail((xhr) => {
68
- console.log(xhr.responseText);
69
- return callback(new Error(xhr.responseText));
71
+ .catch(error => {
72
+ console.log(error.message);
73
+ return callback(error);
70
74
  });
71
75
  }
72
76
  }
@@ -102,18 +106,23 @@ class ServerWidgetDataSource {
102
106
  const seconds = Math.floor((new Date().getTime() - cacheExpiry) / 1000);
103
107
  headers["Cache-Control"] = `max-age=${seconds}`;
104
108
  }
105
- return jquery_1.default.ajax({
106
- dataType: "json",
109
+ fetch(url, {
107
110
  method: "GET",
108
- url,
109
- headers
111
+ headers: headers
112
+ })
113
+ .then(async (response) => {
114
+ if (!response.ok) {
115
+ const text = await response.text();
116
+ throw new Error(text);
117
+ }
118
+ return response.json();
110
119
  })
111
- .done((data) => {
120
+ .then(data => {
112
121
  return callback(null, data);
113
122
  })
114
- .fail((xhr) => {
115
- console.log(xhr.responseText);
116
- return callback(new Error(xhr.responseText));
123
+ .catch(error => {
124
+ console.log(error.message);
125
+ return callback(error);
117
126
  });
118
127
  }
119
128
  // For map widgets, the following is required
@@ -170,18 +179,23 @@ class ServerWidgetMapDataSource {
170
179
  const seconds = Math.floor((new Date().getTime() - cacheExpiry) / 1000);
171
180
  headers["Cache-Control"] = `max-age=${seconds}`;
172
181
  }
173
- jquery_1.default.ajax({
174
- dataType: "json",
182
+ fetch(url, {
175
183
  method: "GET",
176
- url,
177
184
  headers
178
185
  })
179
- .done((data) => {
186
+ .then(async (response) => {
187
+ if (!response.ok) {
188
+ const text = await response.text();
189
+ throw new Error(text);
190
+ }
191
+ return response.json();
192
+ })
193
+ .then(data => {
180
194
  return callback(null, data);
181
195
  })
182
- .fail((xhr) => {
183
- console.log(xhr.responseText);
184
- return callback(new Error(xhr.responseText));
196
+ .catch(error => {
197
+ console.log(error.message);
198
+ return callback(error);
185
199
  });
186
200
  }
187
201
  getQuickfiltersDataSource() {
@@ -356,18 +370,23 @@ class ServerWidgetLayerPopupWidgetDataSource {
356
370
  const seconds = Math.floor((new Date().getTime() - cacheExpiry) / 1000);
357
371
  headers["Cache-Control"] = `max-age=${seconds}`;
358
372
  }
359
- jquery_1.default.ajax({
360
- dataType: "json",
373
+ fetch(url, {
361
374
  method: "GET",
362
- url,
363
- headers
375
+ headers: headers
364
376
  })
365
- .done((data) => {
366
- return callback(null, data);
377
+ .then(async (response) => {
378
+ if (!response.ok) {
379
+ const text = await response.text();
380
+ throw new Error(text);
381
+ }
382
+ return response.json();
383
+ })
384
+ .then(data => {
385
+ callback(null, data);
367
386
  })
368
- .fail((xhr) => {
369
- console.log(xhr.responseText);
370
- return callback(new Error(xhr.responseText));
387
+ .catch(error => {
388
+ console.log(error.message);
389
+ callback(error);
371
390
  });
372
391
  }
373
392
  /** For map widgets, the following is required */
@@ -1,33 +1,22 @@
1
- import PropTypes from "prop-types";
2
1
  import React from "react";
3
2
  import { DataSource, Schema } from "@mwater/expressions";
3
+ import { DashboardDesign } from "./DashboardDesign";
4
4
  export interface SettingsModalComponentProps {
5
5
  onDesignChange: any;
6
6
  schema: Schema;
7
7
  dataSource: DataSource;
8
8
  }
9
9
  interface SettingsModalComponentState {
10
- design: any;
10
+ design: DashboardDesign | null;
11
11
  }
12
12
  export default class SettingsModalComponent extends React.Component<SettingsModalComponentProps, SettingsModalComponentState> {
13
- static contextTypes: {
14
- globalFiltersElementFactory: PropTypes.Requireable<(...args: any[]) => any>;
15
- };
16
- constructor(props: any);
13
+ constructor(props: SettingsModalComponentProps);
17
14
  show(design: any): void;
18
15
  handleSave: () => void;
19
16
  handleCancel: () => void;
20
17
  handleDesignChange: (design: any) => void;
21
18
  handleFiltersChange: (filters: any) => void;
22
19
  handleGlobalFiltersChange: (globalFilters: any) => void;
23
- render(): React.CElement<{
24
- size: string;
25
- onCancel: () => void;
26
- onAction: () => void;
27
- }, React.Component<{
28
- size: string;
29
- onCancel: () => void;
30
- onAction: () => void;
31
- }, any, any>> | null;
20
+ render(): React.JSX.Element | null;
32
21
  }
33
22
  export {};
@@ -26,7 +26,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const prop_types_1 = __importDefault(require("prop-types"));
30
29
  const lodash_1 = __importDefault(require("lodash"));
31
30
  const react_1 = __importDefault(require("react"));
32
31
  const R = react_1.default.createElement;
@@ -38,9 +37,9 @@ const DashboardUtils = __importStar(require("./DashboardUtils"));
38
37
  const ActionCancelModalComponent_1 = __importDefault(require("@mwater/react-library/lib/ActionCancelModalComponent"));
39
38
  const QuickfiltersDesignComponent_1 = __importDefault(require("../quickfilter/QuickfiltersDesignComponent"));
40
39
  const FiltersDesignerComponent_1 = __importDefault(require("../FiltersDesignerComponent"));
40
+ const MWaterContextComponent_1 = require("../MWaterContextComponent");
41
41
  // Popup with settings for dashboard
42
42
  class SettingsModalComponent extends react_1.default.Component {
43
- static contextTypes = { globalFiltersElementFactory: prop_types_1.default.func };
44
43
  constructor(props) {
45
44
  super(props);
46
45
  this.state = {
@@ -81,42 +80,29 @@ class SettingsModalComponent extends react_1.default.Component {
81
80
  label: language.en + " (" + language.name + ")"
82
81
  };
83
82
  });
84
- return R(ActionCancelModalComponent_1.default, {
85
- size: "large",
86
- onCancel: this.handleCancel,
87
- onAction: this.handleSave
88
- }, R("div", { style: { paddingBottom: 200 } }, R("h4", null, "Quick Filters"), R("div", { className: "text-muted" }, "Quick filters are shown to the user as a dropdown at the top of the dashboard and can be used to filter data of widgets."), filterableTables.length > 0
89
- ? R(QuickfiltersDesignComponent_1.default, {
90
- design: this.state.design.quickfilters || [],
91
- onDesignChange: (design) => this.handleDesignChange((0, update_object_1.default)(this.state.design, { quickfilters: { $set: design } })),
92
- schema: this.props.schema,
93
- dataSource: this.props.dataSource,
94
- tables: filterableTables
95
- })
96
- : "Nothing to quickfilter. Add widgets to the dashboard", R("h4", { style: { paddingTop: 10 } }, "Filters"), R("div", { className: "text-muted" }, "Filters are built in to the dashboard and cannot be changed by viewers of the dashboard."), filterableTables.length > 0
97
- ? R(FiltersDesignerComponent_1.default, {
98
- schema: this.props.schema,
99
- dataSource: this.props.dataSource,
100
- filters: this.state.design.filters,
101
- onFiltersChange: this.handleFiltersChange,
102
- filterableTables
103
- })
104
- : "Nothing to filter. Add widgets to the dashboard", this.context.globalFiltersElementFactory
105
- ? R("div", null, R("h4", { style: { paddingTop: 10 } }, "Global Filters"), this.context.globalFiltersElementFactory({
106
- schema: this.props.schema,
107
- dataSource: this.props.dataSource,
108
- filterableTables,
109
- globalFilters: this.state.design.globalFilters || [],
110
- onChange: this.handleGlobalFiltersChange
111
- }))
112
- : undefined, R("h4", { style: { paddingTop: 10 } }, "Language"), R("div", { className: "text-muted" }, "Controls the preferred language of widgets and uses specified language when available"), R(react_select_1.default, {
113
- value: lodash_1.default.findWhere(localeOptions, { value: this.state.design.locale || "en" }) || null,
114
- options: localeOptions,
115
- onChange: (locale) => this.handleDesignChange((0, update_object_1.default)(this.state.design, { locale: { $set: locale.value } }))
116
- }), R("h4", { style: { paddingTop: 10 } }, "Advanced"), R(ui.Checkbox, {
117
- value: this.state.design.implicitFiltersEnabled != null ? this.state.design.implicitFiltersEnabled : true,
118
- onChange: (value) => this.handleDesignChange((0, update_object_1.default)(this.state.design, { implicitFiltersEnabled: { $set: value } }))
119
- }, "Enable Implicit Filtering (leave unchecked for new dashboards)")));
83
+ return (react_1.default.createElement(ActionCancelModalComponent_1.default, { size: "large", onCancel: this.handleCancel, onAction: this.handleSave },
84
+ react_1.default.createElement("div", { style: { paddingBottom: 200 } },
85
+ react_1.default.createElement("h4", null, "Quick Filters"),
86
+ react_1.default.createElement("div", { className: "text-muted" }, "Quick filters are shown to the user as a dropdown at the top of the dashboard and can be used to filter data of widgets."),
87
+ filterableTables.length > 0 ? (react_1.default.createElement(QuickfiltersDesignComponent_1.default, { design: this.state.design.quickfilters || [], onDesignChange: (design) => this.handleDesignChange((0, update_object_1.default)(this.state.design, { quickfilters: { $set: design } })), schema: this.props.schema, dataSource: this.props.dataSource, tables: filterableTables })) : ("Nothing to quickfilter. Add widgets to the dashboard"),
88
+ react_1.default.createElement("h4", { style: { paddingTop: 10 } }, "Filters"),
89
+ react_1.default.createElement("div", { className: "text-muted" }, "Filters are built in to the dashboard and cannot be changed by viewers of the dashboard."),
90
+ filterableTables.length > 0 ? (react_1.default.createElement(FiltersDesignerComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, filters: this.state.design.filters, onFiltersChange: this.handleFiltersChange, filterableTables: filterableTables })) : ("Nothing to filter. Add widgets to the dashboard"),
91
+ react_1.default.createElement(MWaterContextComponent_1.GlobalFiltersElementFactoryContext.Consumer, null, globalFiltersElementFactory => globalFiltersElementFactory ? (react_1.default.createElement("div", null,
92
+ react_1.default.createElement("h4", { style: { paddingTop: 10 } }, "Global Filters"),
93
+ globalFiltersElementFactory({
94
+ schema: this.props.schema,
95
+ dataSource: this.props.dataSource,
96
+ filterableTables,
97
+ globalFilters: this.state.design.globalFilters || [],
98
+ onChange: this.handleGlobalFiltersChange
99
+ }))) : undefined),
100
+ react_1.default.createElement("h4", { style: { paddingTop: 10 } }, "Language"),
101
+ react_1.default.createElement("div", { className: "text-muted" }, "Controls the preferred language of widgets and uses specified language when available"),
102
+ react_1.default.createElement(react_select_1.default, { value: lodash_1.default.findWhere(localeOptions, { value: this.state.design.locale || "en" }) || null, options: localeOptions, onChange: (locale) => this.handleDesignChange((0, update_object_1.default)(this.state.design, { locale: { $set: locale.value } })) }),
103
+ this.state.design.implicitFiltersEnabled && (react_1.default.createElement(react_1.default.Fragment, null,
104
+ react_1.default.createElement("h4", { style: { paddingTop: 10 } }, "Advanced"),
105
+ react_1.default.createElement(ui.Checkbox, { value: this.state.design.implicitFiltersEnabled != null ? this.state.design.implicitFiltersEnabled : true, onChange: (value) => this.handleDesignChange((0, update_object_1.default)(this.state.design, { implicitFiltersEnabled: { $set: value } })) }, "Enable Implicit Filtering (leave unchecked for new dashboards)"))))));
120
106
  }
121
107
  }
122
108
  exports.default = SettingsModalComponent;
@@ -2,7 +2,7 @@
2
2
  import { Schema, DataSource } from "@mwater/expressions";
3
3
  import { JsonQLFilter } from "../JsonQLFilter";
4
4
  import { WidgetScope } from "../WidgetScope";
5
- import DashboardDataSource from "./DashboardDataSource";
5
+ import { WidgetDataSource } from "../widgets/WidgetDataSource";
6
6
  /**
7
7
  * Component which renders a widget and ensures that props do not change
8
8
  * unnecessarily.
@@ -18,8 +18,8 @@ export declare function WidgetComponent(props: {
18
18
  onDesignChange?: {
19
19
  (design: object): void;
20
20
  } | null;
21
- /** Data source for dashboard */
22
- dashboardDataSource: DashboardDataSource;
21
+ /** Data source for widget */
22
+ widgetDataSource: WidgetDataSource;
23
23
  /** schema to use **/
24
24
  schema: Schema;
25
25
  /** data source to use. Only used when designing, for display uses widgetDataSource **/
@@ -11,10 +11,6 @@ const WidgetFactory_1 = __importDefault(require("../widgets/WidgetFactory"));
11
11
  * unnecessarily.
12
12
  */
13
13
  function WidgetComponent(props) {
14
- // Get and stabilize widget data source
15
- // TODO!!! There is a global problem with DashboardDataSources being re-created on each render.
16
- // TODO!!! This now only uses the type of the dashboard data source. They should be more stable in the future.
17
- const widgetDataSource = (0, react_1.useMemo)(() => props.dashboardDataSource.getWidgetDataSource(props.type, props.id), [props.dashboardDataSource.constructor, props.type, props.id, props.schema, props.dataSource, props.refreshKey]);
18
14
  const widget = WidgetFactory_1.default.createWidget(props.type);
19
15
  // Stabilize functions
20
16
  const onDesignChange = useStabilizeFunction(props.onDesignChange);
@@ -27,7 +23,7 @@ function WidgetComponent(props) {
27
23
  return widget.createViewElement({
28
24
  schema: props.schema,
29
25
  dataSource: props.dataSource,
30
- widgetDataSource,
26
+ widgetDataSource: props.widgetDataSource,
31
27
  design: props.design,
32
28
  scope,
33
29
  filters,
@@ -40,7 +36,8 @@ function WidgetComponent(props) {
40
36
  namedStrings: props.namedStrings,
41
37
  tocEntries: props.tocEntries,
42
38
  onScrollToTOCEntry: props.onScrollToTOCEntry,
43
- widgetRef
39
+ widgetRef,
40
+ refreshKey: props.refreshKey
44
41
  });
45
42
  }
46
43
  exports.WidgetComponent = WidgetComponent;