@mwater/visualization 5.4.1 → 5.4.3

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 (273) hide show
  1. package/lib/ColorComponent.js +2 -1
  2. package/lib/IdSelection.d.ts +16 -0
  3. package/lib/IdSelection.js +59 -0
  4. package/lib/MWaterAddRelatedIndicatorComponent.js +2 -2
  5. package/lib/MWaterCompleteTableSelectComponent.d.ts +3 -8
  6. package/lib/MWaterCompleteTableSelectComponent.js +36 -42
  7. package/lib/MWaterLoaderComponent.d.ts +11 -10
  8. package/lib/MWaterLoaderComponent.js +1 -1
  9. package/lib/MWaterResponsesFilterComponent.js +1 -1
  10. package/lib/MWaterTableSelectComponent.d.ts +0 -1
  11. package/lib/MWaterTableSelectComponent.js +4 -6
  12. package/lib/autotranslate.d.ts +20 -0
  13. package/lib/autotranslate.js +122 -0
  14. package/lib/axes/AxisBuilder.js +3 -3
  15. package/lib/axes/AxisColorEditorComponent.js +4 -0
  16. package/lib/axes/AxisComponent.d.ts +8 -12
  17. package/lib/axes/AxisComponent.js +32 -80
  18. package/lib/axes/CategoryMapComponent.js +4 -4
  19. package/lib/axes/RangesComponent.js +2 -2
  20. package/lib/dashboards/DashboardComponent.d.ts +12 -20
  21. package/lib/dashboards/DashboardComponent.js +109 -69
  22. package/lib/dashboards/DashboardDesign.d.ts +11 -2
  23. package/lib/dashboards/DashboardUtils.d.ts +5 -0
  24. package/lib/dashboards/DashboardUtils.js +30 -0
  25. package/lib/dashboards/DashboardViewComponent.d.ts +2 -0
  26. package/lib/dashboards/DashboardViewComponent.js +16 -3
  27. package/lib/dashboards/ServerDashboardDataSource.js +2 -1
  28. package/lib/dashboards/SettingsModalComponent.d.ts +1 -1
  29. package/lib/dashboards/SettingsModalComponent.js +256 -19
  30. package/lib/dashboards/WidgetComponent.d.ts +6 -3
  31. package/lib/dashboards/WidgetComponent.js +3 -1
  32. package/lib/datagrids/CellEditor.d.ts +19 -0
  33. package/lib/datagrids/CellEditor.js +223 -0
  34. package/lib/datagrids/DatagridComponent.d.ts +18 -87
  35. package/lib/datagrids/DatagridComponent.js +304 -222
  36. package/lib/datagrids/DatagridViewComponent.d.ts +15 -53
  37. package/lib/datagrids/DatagridViewComponent.js +256 -257
  38. package/lib/datagrids/DirectDatagridDataSource.js +2 -3
  39. package/lib/datagrids/ExprCellComponent.d.ts +8 -15
  40. package/lib/datagrids/ExprCellComponent.js +11 -15
  41. package/lib/datagrids/FindReplaceModalComponent.d.ts +4 -6
  42. package/lib/datagrids/FindReplaceModalComponent.js +38 -75
  43. package/lib/index.css +1 -1
  44. package/lib/index.d.ts +0 -1
  45. package/lib/index.js +0 -1
  46. package/lib/languages.js +6 -1
  47. package/lib/layouts/blocks/HorizontalBlockComponent.js +2 -2
  48. package/lib/mWaterLoader.d.ts +1 -1
  49. package/lib/maps/BufferLayer.d.ts +7 -5
  50. package/lib/maps/BufferLayer.js +69 -48
  51. package/lib/maps/BufferLayerDesign.d.ts +21 -14
  52. package/lib/maps/BufferLayerDesignerComponent.d.ts +16 -31
  53. package/lib/maps/BufferLayerDesignerComponent.js +68 -102
  54. package/lib/maps/ChoroplethLayer.d.ts +5 -4
  55. package/lib/maps/ChoroplethLayer.js +32 -9
  56. package/lib/maps/ChoroplethLayerDesign.d.ts +6 -2
  57. package/lib/maps/ChoroplethLayerDesigner.js +4 -2
  58. package/lib/maps/ClusterLayer.d.ts +3 -4
  59. package/lib/maps/ClusterLayer.js +2 -1
  60. package/lib/maps/DetailLevelSelectComponent.js +1 -1
  61. package/lib/maps/DirectMapDataSource.js +2 -1
  62. package/lib/maps/EditPopupComponent.js +5 -3
  63. package/lib/maps/GridLayer.d.ts +3 -4
  64. package/lib/maps/GridLayer.js +2 -1
  65. package/lib/maps/GridLayerDesigner.js +5 -3
  66. package/lib/maps/HoverContent.d.ts +11 -3
  67. package/lib/maps/HoverContent.js +25 -9
  68. package/lib/maps/Layer.d.ts +24 -3
  69. package/lib/maps/Layer.js +5 -1
  70. package/lib/maps/LayerFactory.js +0 -8
  71. package/lib/maps/LayerLegendComponent.js +0 -1
  72. package/lib/maps/LayerSwitcherComponent.d.ts +1 -0
  73. package/lib/maps/LayerSwitcherComponent.js +1 -1
  74. package/lib/maps/LeafletMapComponent.js +3 -1
  75. package/lib/maps/LegendComponent.d.ts +1 -0
  76. package/lib/maps/LegendComponent.js +9 -1
  77. package/lib/maps/MWaterServerLayer.d.ts +2 -2
  78. package/lib/maps/MWaterServerLayer.js +2 -2
  79. package/lib/maps/MapComponent.js +3 -3
  80. package/lib/maps/MapDesign.d.ts +2 -0
  81. package/lib/maps/MapDesignerComponent.d.ts +4 -3
  82. package/lib/maps/MapDesignerComponent.js +68 -74
  83. package/lib/maps/MapLayerViewDesignerComponent.js +2 -2
  84. package/lib/maps/MapUtils.d.ts +4 -0
  85. package/lib/maps/MapUtils.js +19 -0
  86. package/lib/maps/MapViewComponent.d.ts +8 -3
  87. package/lib/maps/MarkersLayer.d.ts +5 -4
  88. package/lib/maps/MarkersLayer.js +33 -7
  89. package/lib/maps/MarkersLayerDesign.d.ts +19 -16
  90. package/lib/maps/PopupFilterJoinsUtils.d.ts +6 -3
  91. package/lib/maps/PopupFilterJoinsUtils.js +0 -6
  92. package/lib/maps/RasterMapViewComponent.d.ts +3 -31
  93. package/lib/maps/RasterMapViewComponent.js +7 -2
  94. package/lib/maps/ServerMapDataSource.js +2 -1
  95. package/lib/maps/SwitchableTileUrlLayer.d.ts +3 -3
  96. package/lib/maps/SwitchableTileUrlLayer.js +2 -1
  97. package/lib/maps/TileUrlLayer.d.ts +4 -5
  98. package/lib/maps/TileUrlLayer.js +2 -1
  99. package/lib/maps/VectorMapViewComponent.d.ts +5 -37
  100. package/lib/maps/VectorMapViewComponent.js +19 -8
  101. package/lib/maps/maps.d.ts +3 -0
  102. package/lib/quickfilter/Quickfilter.d.ts +2 -0
  103. package/lib/quickfilter/QuickfiltersComponent.d.ts +2 -0
  104. package/lib/quickfilter/QuickfiltersComponent.js +9 -7
  105. package/lib/quickfilter/QuickfiltersDesignComponent.d.ts +5 -30
  106. package/lib/quickfilter/QuickfiltersDesignComponent.js +56 -63
  107. package/lib/richtext/ExprItemsHtmlConverter.d.ts +5 -2
  108. package/lib/richtext/ExprItemsHtmlConverter.js +4 -4
  109. package/lib/richtext/ExprItemsTranslator.d.ts +5 -0
  110. package/lib/richtext/ExprItemsTranslator.js +149 -0
  111. package/lib/richtext/ItemsHtmlConverter.d.ts +1 -1
  112. package/lib/richtext/ItemsHtmlConverter.js +31 -15
  113. package/lib/wellknown.js +12 -9
  114. package/lib/widgets/IFrameWidget.d.ts +4 -4
  115. package/lib/widgets/ImageWidget.d.ts +7 -4
  116. package/lib/widgets/ImageWidget.js +9 -1
  117. package/lib/widgets/ImageWidgetComponent.d.ts +1 -0
  118. package/lib/widgets/ImageWidgetComponent.js +1 -1
  119. package/lib/widgets/MapWidget.d.ts +5 -48
  120. package/lib/widgets/MapWidget.js +26 -63
  121. package/lib/widgets/MarkdownWidget.d.ts +3 -0
  122. package/lib/widgets/MarkdownWidget.js +3 -0
  123. package/lib/widgets/TOCWidget.d.ts +15 -27
  124. package/lib/widgets/TOCWidget.js +107 -183
  125. package/lib/widgets/Widget.d.ts +18 -7
  126. package/lib/widgets/Widget.js +4 -0
  127. package/lib/widgets/WidgetScopesViewComponent.js +1 -1
  128. package/lib/widgets/charts/Chart.d.ts +10 -1
  129. package/lib/widgets/charts/Chart.js +22 -11
  130. package/lib/widgets/charts/ChartViewComponent.d.ts +4 -0
  131. package/lib/widgets/charts/ChartViewComponent.js +6 -3
  132. package/lib/widgets/charts/ChartWidget.d.ts +2 -0
  133. package/lib/widgets/charts/ChartWidget.js +9 -1
  134. package/lib/widgets/charts/ChartWidgetComponent.d.ts +4 -0
  135. package/lib/widgets/charts/ChartWidgetComponent.js +2 -2
  136. package/lib/widgets/charts/calendar/CalendarChart.d.ts +1 -0
  137. package/lib/widgets/charts/calendar/CalendarChart.js +26 -0
  138. package/lib/widgets/charts/calendar/CalendarChartViewComponent.js +3 -1
  139. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.d.ts +1 -0
  140. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.js +8 -0
  141. package/lib/widgets/charts/layered/LayeredChart.d.ts +2 -0
  142. package/lib/widgets/charts/layered/LayeredChart.js +63 -3
  143. package/lib/widgets/charts/layered/LayeredChartCompiler.d.ts +1 -1
  144. package/lib/widgets/charts/layered/LayeredChartCompiler.js +1 -1
  145. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +2 -2
  146. package/lib/widgets/charts/layered/LayeredChartViewComponent.js +8 -3
  147. package/lib/widgets/charts/pivot/PivotChart.d.ts +1 -0
  148. package/lib/widgets/charts/pivot/PivotChart.js +63 -0
  149. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +1 -1
  150. package/lib/widgets/charts/pivot/SegmentDesignerComponent.js +7 -4
  151. package/lib/widgets/charts/table/OrderingsComponent.js +1 -1
  152. package/lib/widgets/charts/table/TableChart.d.ts +1 -0
  153. package/lib/widgets/charts/table/TableChart.js +15 -0
  154. package/lib/widgets/text/TextComponent.d.ts +11 -4
  155. package/lib/widgets/text/TextComponent.js +11 -8
  156. package/lib/widgets/text/TextWidget.d.ts +6 -3
  157. package/lib/widgets/text/TextWidget.js +7 -1
  158. package/lib/widgets/text/TextWidgetComponent.d.ts +4 -0
  159. package/lib/widgets/text/TextWidgetComponent.js +7 -1
  160. package/lib/widgets/text/TextWidgetDesign.d.ts +2 -4
  161. package/lib/widgets/text/TextWidgetDesign.js +1 -1
  162. package/package.json +7 -8
  163. package/src/ColorComponent.tsx +1 -2
  164. package/src/IdSelection.ts +62 -0
  165. package/src/MWaterAddRelatedIndicatorComponent.ts +3 -2
  166. package/src/MWaterCompleteTableSelectComponent.tsx +36 -46
  167. package/src/MWaterLoaderComponent.ts +28 -26
  168. package/src/MWaterResponsesFilterComponent.ts +5 -2
  169. package/src/MWaterTableSelectComponent.tsx +5 -9
  170. package/src/autotranslate.ts +141 -0
  171. package/src/axes/AxisBuilder.ts +3 -3
  172. package/src/axes/AxisColorEditorComponent.tsx +5 -0
  173. package/src/axes/{AxisComponent.ts → AxisComponent.tsx} +106 -106
  174. package/src/axes/CategoryMapComponent.ts +4 -4
  175. package/src/axes/RangesComponent.ts +3 -2
  176. package/src/dashboards/DashboardComponent.tsx +189 -125
  177. package/src/dashboards/DashboardDesign.ts +9 -2
  178. package/src/dashboards/DashboardUtils.ts +39 -0
  179. package/src/dashboards/DashboardViewComponent.tsx +22 -3
  180. package/src/dashboards/ServerDashboardDataSource.ts +2 -1
  181. package/src/dashboards/SettingsModalComponent.tsx +450 -35
  182. package/src/dashboards/WidgetComponent.tsx +12 -6
  183. package/src/datagrids/CellEditor.tsx +354 -0
  184. package/src/datagrids/DatagridComponent.tsx +646 -0
  185. package/src/datagrids/DatagridViewComponent.tsx +539 -0
  186. package/src/datagrids/DirectDatagridDataSource.ts +2 -3
  187. package/src/datagrids/{ExprCellComponent.ts → ExprCellComponent.tsx} +28 -23
  188. package/src/datagrids/{FindReplaceModalComponent.ts → FindReplaceModalComponent.tsx} +109 -122
  189. package/src/index.css +1 -1
  190. package/src/index.ts +0 -1
  191. package/src/languages.ts +6 -1
  192. package/src/layouts/blocks/HorizontalBlockComponent.ts +2 -2
  193. package/src/mWaterLoader.ts +1 -1
  194. package/src/maps/BufferLayer.ts +83 -60
  195. package/src/maps/BufferLayerDesign.ts +20 -14
  196. package/src/maps/BufferLayerDesignerComponent.tsx +309 -0
  197. package/src/maps/ChoroplethLayer.ts +40 -19
  198. package/src/maps/ChoroplethLayerDesign.ts +4 -2
  199. package/src/maps/ChoroplethLayerDesigner.tsx +4 -2
  200. package/src/maps/ClusterLayer.ts +4 -10
  201. package/src/maps/DetailLevelSelectComponent.ts +1 -1
  202. package/src/maps/DirectMapDataSource.ts +2 -1
  203. package/src/maps/EditPopupComponent.ts +7 -3
  204. package/src/maps/GridLayer.ts +4 -10
  205. package/src/maps/GridLayerDesigner.tsx +5 -3
  206. package/src/maps/HoverContent.tsx +40 -16
  207. package/src/maps/Layer.ts +28 -10
  208. package/src/maps/LayerFactory.ts +0 -8
  209. package/src/maps/LayerLegendComponent.ts +2 -4
  210. package/src/maps/LayerSwitcherComponent.tsx +6 -2
  211. package/src/maps/LeafletMapComponent.tsx +3 -1
  212. package/src/maps/LegendComponent.tsx +10 -1
  213. package/src/maps/MWaterServerLayer.ts +3 -3
  214. package/src/maps/MapComponent.ts +3 -3
  215. package/src/maps/MapDesign.ts +3 -0
  216. package/src/maps/MapDesignerComponent.tsx +165 -162
  217. package/src/maps/MapLayerViewDesignerComponent.ts +2 -2
  218. package/src/maps/MapUtils.ts +24 -0
  219. package/src/maps/MapViewComponent.tsx +11 -3
  220. package/src/maps/MarkersLayer.ts +44 -18
  221. package/src/maps/MarkersLayerDesign.ts +19 -16
  222. package/src/maps/PopupFilterJoinsUtils.ts +6 -2
  223. package/src/maps/RasterMapViewComponent.ts +9 -45
  224. package/src/maps/ServerMapDataSource.ts +2 -2
  225. package/src/maps/SwitchableTileUrlLayer.tsx +4 -10
  226. package/src/maps/TileUrlLayer.tsx +4 -10
  227. package/src/maps/VectorMapViewComponent.tsx +28 -55
  228. package/src/maps/maps.ts +3 -0
  229. package/src/quickfilter/Quickfilter.ts +3 -0
  230. package/src/quickfilter/QuickfiltersComponent.ts +13 -7
  231. package/src/quickfilter/QuickfiltersDesignComponent.tsx +127 -128
  232. package/src/richtext/ExprItemsHtmlConverter.ts +9 -5
  233. package/src/richtext/ExprItemsTranslator.ts +176 -0
  234. package/src/richtext/ItemsHtmlConverter.ts +33 -18
  235. package/src/wellknown.ts +33 -30
  236. package/src/widgets/ImageWidget.ts +10 -1
  237. package/src/widgets/ImageWidgetComponent.ts +3 -2
  238. package/src/widgets/{MapWidget.ts → MapWidget.tsx} +90 -101
  239. package/src/widgets/MarkdownWidget.ts +3 -0
  240. package/src/widgets/TOCWidget.tsx +281 -0
  241. package/src/widgets/Widget.ts +25 -5
  242. package/src/widgets/WidgetScopesViewComponent.ts +2 -1
  243. package/src/widgets/charts/Chart.ts +31 -12
  244. package/src/widgets/charts/ChartViewComponent.ts +13 -3
  245. package/src/widgets/charts/ChartWidget.ts +11 -1
  246. package/src/widgets/charts/ChartWidgetComponent.tsx +9 -1
  247. package/src/widgets/charts/calendar/CalendarChart.ts +29 -0
  248. package/src/widgets/charts/calendar/CalendarChartViewComponent.tsx +3 -1
  249. package/src/widgets/charts/imagemosaic/ImageMosaicChart.ts +9 -0
  250. package/src/widgets/charts/layered/LayeredChart.ts +71 -3
  251. package/src/widgets/charts/layered/LayeredChartCompiler.ts +2 -2
  252. package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +4 -2
  253. package/src/widgets/charts/layered/LayeredChartViewComponent.ts +10 -4
  254. package/src/widgets/charts/pivot/PivotChart.ts +73 -0
  255. package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +1 -1
  256. package/src/widgets/charts/pivot/SegmentDesignerComponent.tsx +6 -4
  257. package/src/widgets/charts/table/OrderingsComponent.tsx +2 -1
  258. package/src/widgets/charts/table/TableChart.ts +17 -0
  259. package/src/widgets/text/TextComponent.tsx +22 -12
  260. package/src/widgets/text/TextWidget.ts +9 -2
  261. package/src/widgets/text/TextWidgetComponent.tsx +16 -1
  262. package/src/widgets/text/TextWidgetDesign.ts +4 -7
  263. package/test/IdSelectionTests.ts +54 -0
  264. package/test/LayeredChartCompilerTests.ts +0 -2
  265. package/test/richtext/ExprItemsTranslatorTests.ts +144 -0
  266. package/test/wellknownTests.ts +144 -0
  267. package/src/datagrids/DatagridComponent.ts +0 -478
  268. package/src/datagrids/DatagridViewComponent.ts +0 -464
  269. package/src/datagrids/EditExprCellComponent.tsx +0 -305
  270. package/src/datagrids/README.md +0 -3
  271. package/src/maps/BufferLayerDesignerComponent.ts +0 -311
  272. package/src/widgets/TOCWidget.ts +0 -326
  273. package/test/LegoLayoutEngineTests.ts +0 -69
@@ -92,7 +92,9 @@ class CalendarChartViewComponent extends react_1.default.Component {
92
92
  }
93
93
  const scopeData = {
94
94
  name: this.axisBuilder.summarizeAxis(this.props.design.dateAxis, this.context) +
95
- T ` is ` +
95
+ " " +
96
+ T `is` +
97
+ " " +
96
98
  this.axisBuilder.formatValue(this.props.design.dateAxis, data, this.context),
97
99
  filter: {
98
100
  jsonql: this.axisBuilder.createValueFilter(this.props.design.dateAxis, data),
@@ -31,4 +31,5 @@ export default class ImageMosaicChart extends Chart {
31
31
  createDataTable(design: any, schema: Schema, dataSource: DataSource, data: any): never[];
32
32
  getFilterableTables(design: any, schema: Schema): any[];
33
33
  getPlaceholderIcon(): string;
34
+ translateDesign(design: ImageMosaicChartDesign, translate: (input: string) => string): ImageMosaicChartDesign;
34
35
  }
@@ -178,5 +178,13 @@ class ImageMosaicChart extends Chart_1.default {
178
178
  getPlaceholderIcon() {
179
179
  return "fa-th";
180
180
  }
181
+ translateDesign(design, translate) {
182
+ return (0, immer_1.default)(design, draft => {
183
+ // Translate title text
184
+ if (draft.titleText) {
185
+ draft.titleText = translate(draft.titleText);
186
+ }
187
+ });
188
+ }
181
189
  }
182
190
  exports.default = ImageMosaicChart;
@@ -20,4 +20,6 @@ export default class LayeredChart extends Chart {
20
20
  createDataTable(design: LayeredChartDesign, schema: Schema, dataSource: DataSource, data: any, locale: string): any[][];
21
21
  getFilterableTables(design: LayeredChartDesign, schema: Schema): string[];
22
22
  getPlaceholderIcon(): string;
23
+ /** Translates the design */
24
+ translateDesign(design: LayeredChartDesign, translate: (input: string) => string): LayeredChartDesign;
23
25
  }
@@ -40,7 +40,7 @@ const LayeredChartUtils = __importStar(require("./LayeredChartUtils"));
40
40
  const TextWidget_1 = __importDefault(require("../../text/TextWidget"));
41
41
  const LayeredChartViewComponent_1 = __importDefault(require("./LayeredChartViewComponent"));
42
42
  const LayeredChartDesignerComponent_1 = __importDefault(require("./LayeredChartDesignerComponent"));
43
- // See LayeredChart Design.md for the design
43
+ const ExprItemsTranslator_1 = require("../../../richtext/ExprItemsTranslator");
44
44
  class LayeredChart extends Chart_1.default {
45
45
  cleanDesign(design, schema) {
46
46
  const exprCleaner = new expressions_1.ExprCleaner(schema);
@@ -126,7 +126,7 @@ class LayeredChart extends Chart_1.default {
126
126
  if (!layer.axes.y) {
127
127
  return T `Missing Y Axis`;
128
128
  }
129
- if (!layer.axes.x && compiler.isXAxisRequired(design, layerId)) {
129
+ if (!layer.axes.x && compiler.isXAxisRequired(design)) {
130
130
  return T `Missing X Axis`;
131
131
  }
132
132
  if (!layer.axes.color && compiler.isColorAxisRequired(design, layerId)) {
@@ -222,7 +222,8 @@ class LayeredChart extends Chart_1.default {
222
222
  width: options.width,
223
223
  height: options.height,
224
224
  scope: options.scope,
225
- onScopeChange: options.onScopeChange
225
+ onScopeChange: options.onScopeChange,
226
+ locale: options.locale,
226
227
  };
227
228
  return react_1.default.createElement(LayeredChartViewComponent_1.default, props);
228
229
  }
@@ -319,5 +320,64 @@ class LayeredChart extends Chart_1.default {
319
320
  getPlaceholderIcon() {
320
321
  return "fa-bar-chart";
321
322
  }
323
+ /** Translates the design */
324
+ translateDesign(design, translate) {
325
+ return (0, immer_1.default)(design, draft => {
326
+ // Translate axis labels
327
+ if (draft.xAxisLabelText) {
328
+ draft.xAxisLabelText = translate(draft.xAxisLabelText);
329
+ }
330
+ if (draft.yAxisLabelText) {
331
+ draft.yAxisLabelText = translate(draft.yAxisLabelText);
332
+ }
333
+ // Translate layer names
334
+ for (const layer of draft.layers) {
335
+ if (layer.name) {
336
+ layer.name = translate(layer.name);
337
+ }
338
+ // Translate axis category labels
339
+ if (layer.axes.x?.categoryLabels) {
340
+ for (const key in layer.axes.x.categoryLabels) {
341
+ layer.axes.x.categoryLabels[key] = translate(layer.axes.x.categoryLabels[key]);
342
+ }
343
+ }
344
+ if (layer.axes.y?.categoryLabels) {
345
+ for (const key in layer.axes.y.categoryLabels) {
346
+ layer.axes.y.categoryLabels[key] = translate(layer.axes.y.categoryLabels[key]);
347
+ }
348
+ }
349
+ if (layer.axes.color?.categoryLabels) {
350
+ for (const key in layer.axes.color.categoryLabels) {
351
+ layer.axes.color.categoryLabels[key] = translate(layer.axes.color.categoryLabels[key]);
352
+ }
353
+ }
354
+ // Translate null labels
355
+ if (layer.axes.x?.nullLabel) {
356
+ layer.axes.x.nullLabel = translate(layer.axes.x.nullLabel);
357
+ }
358
+ if (layer.axes.y?.nullLabel) {
359
+ layer.axes.y.nullLabel = translate(layer.axes.y.nullLabel);
360
+ }
361
+ if (layer.axes.color?.nullLabel) {
362
+ layer.axes.color.nullLabel = translate(layer.axes.color.nullLabel);
363
+ }
364
+ }
365
+ // Translate y thresholds
366
+ if (draft.yThresholds) {
367
+ for (const threshold of draft.yThresholds) {
368
+ if (threshold.label) {
369
+ threshold.label = translate(threshold.label);
370
+ }
371
+ }
372
+ }
373
+ // Translate header and footer using ExprItemsTranslator
374
+ if (draft.header) {
375
+ draft.header.items = (0, ExprItemsTranslator_1.translateHtmlItems)(draft.header.items || [], translate);
376
+ }
377
+ if (draft.footer) {
378
+ draft.footer.items = (0, ExprItemsTranslator_1.translateHtmlItems)(draft.footer.items || [], translate);
379
+ }
380
+ });
381
+ }
322
382
  }
323
383
  exports.default = LayeredChart;
@@ -91,7 +91,7 @@ export default class LayeredChartCompiler {
91
91
  }): ChartOptions;
92
92
  isCategoricalX(design: LayeredChartDesign): boolean;
93
93
  compileData(design: LayeredChartDesign, data: C3ChartData, locale?: string): C3Data;
94
- compileDataPolar(design: LayeredChartDesign, data: C3ChartData, locale: any): C3Data;
94
+ compileDataPolar(design: LayeredChartDesign, data: C3ChartData, locale?: string): C3Data;
95
95
  compileDataNonCategorical(design: LayeredChartDesign, data: C3ChartData, locale?: string): C3Data;
96
96
  fixStringYValues(rows?: any): any;
97
97
  flattenRowData(rows: any): any[];
@@ -558,7 +558,7 @@ class LayeredChartCompiler {
558
558
  const trendlineSeries = seriesY + ":trendline";
559
559
  columns.push([trendlineSeries].concat(calculateLinearRegression(yValues, xValues)));
560
560
  types[trendlineSeries] = billboard_js_1.line ? (0, billboard_js_1.line)() : "line";
561
- names[trendlineSeries] = names[seriesY] + T ` Trendline`;
561
+ names[trendlineSeries] = names[seriesY] + " " + T `Trendline`;
562
562
  xs[trendlineSeries] = seriesX;
563
563
  colors[trendlineSeries] = layer.color || defaultColors[layerIndex];
564
564
  legendHide.push(trendlineSeries); // Hide in legend
@@ -195,7 +195,7 @@ class LayeredChartDesignerComponent extends react_1.default.Component {
195
195
  return R("div", null, lodash_1.default.map(this.props.design.layers, (layer, i) => this.renderLayer(i)),
196
196
  // Only add if last has table
197
197
  this.props.design.layers.length > 0 && lodash_1.default.last(this.props.design.layers).table
198
- ? R("button", { className: "btn btn-link", type: "button", onClick: this.handleAddLayer }, R("span", { className: "fas fa-plus" }), T ` Add Another Series`)
198
+ ? R("button", { className: "btn btn-link", type: "button", onClick: this.handleAddLayer }, R("span", { className: "fas fa-plus" }), " ", T `Add Another Series`)
199
199
  : undefined);
200
200
  }
201
201
  renderOptions() {
@@ -306,7 +306,7 @@ class ThresholdsComponent extends react_1.default.Component {
306
306
  onRemove: this.handleRemove.bind(null, index),
307
307
  showHighlightColor: this.props.showHighlightColor
308
308
  });
309
- }), R("button", { type: "button", className: "btn btn-sm btn-link", onClick: this.handleAdd }, R("i", { className: "fa fa-plus" }), T ` Add Y Threshold`));
309
+ }), R("button", { type: "button", className: "btn btn-sm btn-link", onClick: this.handleAdd }, R("i", { className: "fa fa-plus" }), " ", T `Add Y Threshold`));
310
310
  }
311
311
  }
312
312
  class ThresholdComponent extends react_1.default.Component {
@@ -93,7 +93,8 @@ class LayeredChartViewComponent extends react_1.default.Component {
93
93
  schema: this.props.schema,
94
94
  dataSource: this.props.dataSource,
95
95
  exprValues: this.props.data.header || {},
96
- width: this.props.width
96
+ width: this.props.width,
97
+ locale: this.context
97
98
  }));
98
99
  }
99
100
  renderFooter() {
@@ -109,7 +110,8 @@ class LayeredChartViewComponent extends react_1.default.Component {
109
110
  schema: this.props.schema,
110
111
  dataSource: this.props.dataSource,
111
112
  exprValues: this.props.data.footer || {},
112
- width: this.props.width
113
+ width: this.props.width,
114
+ locale: this.context
113
115
  }));
114
116
  }
115
117
  render() {
@@ -147,6 +149,9 @@ class C3ChartComponent extends react_1.default.Component {
147
149
  if (this.chart) {
148
150
  this.chart.destroy();
149
151
  }
152
+ if (!this.chartDiv) {
153
+ return;
154
+ }
150
155
  const compiler = new LayeredChartCompiler_1.default({ schema: props.schema });
151
156
  const chartOptions = compiler.createChartOptions({
152
157
  design: this.props.design,
@@ -450,7 +455,7 @@ class C3ChartComponent extends react_1.default.Component {
450
455
  // css += ".c3-title { font-size: #{scale * 14}px; }\n"
451
456
  return R("div", {
452
457
  ref: c => {
453
- return (this.chartDiv = c);
458
+ this.chartDiv = c;
454
459
  }
455
460
  });
456
461
  }
@@ -39,4 +39,5 @@ export default class PivotChart extends Chart {
39
39
  createDataTable(design: PivotChartDesign, schema: Schema, dataSource: DataSource, data: any, locale: string): (string | undefined)[][];
40
40
  getFilterableTables(design: PivotChartDesign, schema: Schema): string[];
41
41
  getPlaceholderIcon(): string;
42
+ translateDesign(design: PivotChartDesign, translate: (input: string) => string): PivotChartDesign;
42
43
  }
@@ -39,6 +39,7 @@ const TextWidget_1 = __importDefault(require("../../text/TextWidget"));
39
39
  const PivotChartUtils = __importStar(require("./PivotChartUtils"));
40
40
  const PivotChartQueryBuilder_1 = __importDefault(require("./PivotChartQueryBuilder"));
41
41
  const PivotChartLayoutBuilder_1 = __importDefault(require("./PivotChartLayoutBuilder"));
42
+ const ExprItemsTranslator_1 = require("../../../richtext/ExprItemsTranslator");
42
43
  // Store true as a weakly cached value if a design is already clean
43
44
  const cleanDesignCache = new expressions_1.WeakCache();
44
45
  class PivotChart extends Chart_1.default {
@@ -377,5 +378,67 @@ class PivotChart extends Chart_1.default {
377
378
  getPlaceholderIcon() {
378
379
  return "fa-magic";
379
380
  }
381
+ translateDesign(design, translate) {
382
+ return (0, immer_1.default)(design, draft => {
383
+ // Helper function to translate a segment and its children
384
+ const translateSegment = (segment) => {
385
+ // Translate segment label
386
+ if (segment.label) {
387
+ segment.label = translate(segment.label);
388
+ }
389
+ // Translate value axis labels
390
+ if (segment.valueAxis?.categoryLabels) {
391
+ for (const key in segment.valueAxis.categoryLabels) {
392
+ segment.valueAxis.categoryLabels[key] = translate(segment.valueAxis.categoryLabels[key]);
393
+ }
394
+ }
395
+ // Translate null label
396
+ if (segment.valueAxis?.nullLabel) {
397
+ segment.valueAxis.nullLabel = translate(segment.valueAxis.nullLabel);
398
+ }
399
+ // Recursively translate children
400
+ if (segment.children) {
401
+ segment.children.forEach(translateSegment);
402
+ }
403
+ };
404
+ // Translate all row segments
405
+ draft.rows.forEach(translateSegment);
406
+ // Translate all column segments
407
+ draft.columns.forEach(translateSegment);
408
+ // Translate all intersections
409
+ for (const intersection of Object.values(draft.intersections)) {
410
+ // Translate value axis labels
411
+ if (intersection.valueAxis?.categoryLabels) {
412
+ for (const key in intersection.valueAxis.categoryLabels) {
413
+ intersection.valueAxis.categoryLabels[key] = translate(intersection.valueAxis.categoryLabels[key]);
414
+ }
415
+ }
416
+ // Translate null label
417
+ if (intersection.valueAxis?.nullLabel) {
418
+ intersection.valueAxis.nullLabel = translate(intersection.valueAxis.nullLabel);
419
+ }
420
+ // Translate segment value axis override labels
421
+ if (intersection.segmentValueAxisOverrides) {
422
+ for (const axis of Object.values(intersection.segmentValueAxisOverrides)) {
423
+ if (axis?.categoryLabels) {
424
+ for (const key in axis.categoryLabels) {
425
+ axis.categoryLabels[key] = translate(axis.categoryLabels[key]);
426
+ }
427
+ }
428
+ if (axis?.nullLabel) {
429
+ axis.nullLabel = translate(axis.nullLabel);
430
+ }
431
+ }
432
+ }
433
+ }
434
+ // Translate header and footer using ExprItemsTranslator
435
+ if (draft.header?.items) {
436
+ draft.header.items = (0, ExprItemsTranslator_1.translateHtmlItems)(draft.header.items, translate);
437
+ }
438
+ if (draft.footer?.items) {
439
+ draft.footer.items = (0, ExprItemsTranslator_1.translateHtmlItems)(draft.footer.items, translate);
440
+ }
441
+ });
442
+ }
380
443
  }
381
444
  exports.default = PivotChart;
@@ -252,7 +252,7 @@ class LayoutCellComponent extends react_1.default.Component {
252
252
  }
253
253
  return R("span", { style: { fontSize: "90%" } }, R("a", { className: "link-plain", onClick: this.props.onEditSection }, T `Edit`), cell.summarize
254
254
  ? [
255
- R("span", { className: "text-muted" }, T ` / `),
255
+ R("span", { className: "text-muted" }, ` / `),
256
256
  R("a", { className: "link-plain", onClick: this.props.onSummarizeSegment }, T `Summarize`)
257
257
  ]
258
258
  : undefined);
@@ -83,9 +83,12 @@ class SegmentDesignerComponent extends react_1.default.Component {
83
83
  label: T `Type`
84
84
  }, react_1.default.createElement(ui.Radio, { key: "single", value: this.state.mode, radioValue: "single", onChange: this.handleMode },
85
85
  T `Single ${this.props.segmentType}`,
86
- react_1.default.createElement("span", { className: "text-muted" }, T ` - used for summary ${this.props.segmentType}s and empty ${this.props.segmentType}s`)), react_1.default.createElement(ui.Radio, { key: "multiple", value: this.state.mode, radioValue: "multiple", onChange: this.handleMode },
86
+ react_1.default.createElement("span", { className: "text-muted" },
87
+ ` - `,
88
+ T `used for summary ${this.props.segmentType}s and empty ${this.props.segmentType}s`)), react_1.default.createElement(ui.Radio, { key: "multiple", value: this.state.mode, radioValue: "multiple", onChange: this.handleMode },
87
89
  T `Multiple ${this.props.segmentType}s`,
88
- react_1.default.createElement("span", { className: "text-muted" }, T ` - disaggregate data by a field`)));
90
+ " - ",
91
+ react_1.default.createElement("span", { className: "text-muted" }, T `disaggregate data by a field`)));
89
92
  }
90
93
  renderLabel() {
91
94
  return R(ui.FormGroup, {
@@ -132,7 +135,7 @@ class SegmentDesignerComponent extends react_1.default.Component {
132
135
  renderFilter() {
133
136
  return R(ui.FormGroup, {
134
137
  labelMuted: true,
135
- label: [R(ui.Icon, { id: "glyphicon-filter" }), T ` Filters`],
138
+ label: [R(ui.Icon, { id: "glyphicon-filter" }), " ", T `Filters`],
136
139
  hint: T `Filters all data associated with this ${this.props.segmentType}`
137
140
  }, R(expressions_ui_2.FilterExprComponent, {
138
141
  schema: this.props.schema,
@@ -180,7 +183,7 @@ class SegmentDesignerComponent extends react_1.default.Component {
180
183
  renderOrderExpr() {
181
184
  return R(ui.FormGroup, {
182
185
  labelMuted: true,
183
- label: [R(ui.Icon, { id: "fa-sort-amount-asc" }), T ` Sort`],
186
+ label: [R(ui.Icon, { id: "fa-sort-amount-asc" }), " ", T `Sort`],
184
187
  hint: T `Sorts the display of this ${this.props.segmentType}`
185
188
  }, R(expressions_ui_1.ExprComponent, {
186
189
  schema: this.props.schema,
@@ -37,7 +37,7 @@ class OrderingsComponent extends react_1.default.Component {
37
37
  onOrderingChange: this.handleOrderingChange.bind(null, i),
38
38
  onOrderingRemove: this.handleOrderingRemove.bind(null, i)
39
39
  });
40
- }), R("button", { type: "button", className: "btn btn-sm btn-secondary", onClick: this.handleAdd, key: "add" }, R("span", { className: "fas fa-plus" }), T ` Add Ordering`));
40
+ }), R("button", { type: "button", className: "btn btn-sm btn-secondary", onClick: this.handleAdd, key: "add" }, R("span", { className: "fas fa-plus" }), " ", T `Add Ordering`));
41
41
  }
42
42
  }
43
43
  exports.default = OrderingsComponent;
@@ -54,4 +54,5 @@ export default class TableChart extends Chart {
54
54
  createDataTable(design: any, schema: Schema, dataSource: DataSource, data: any, locale: any): any[][];
55
55
  getFilterableTables(design: any, schema: Schema): any[];
56
56
  getPlaceholderIcon(): string;
57
+ translateDesign(design: TableChartDesign, translate: (input: string) => string): TableChartDesign;
57
58
  }
@@ -321,5 +321,20 @@ class TableChart extends Chart_1.default {
321
321
  getPlaceholderIcon() {
322
322
  return "fa-table";
323
323
  }
324
+ translateDesign(design, translate) {
325
+ return (0, immer_1.default)(design, draft => {
326
+ // Translate title text
327
+ if (draft.titleText) {
328
+ draft.titleText = translate(draft.titleText);
329
+ }
330
+ // Translate column headers and axis labels
331
+ for (const column of draft.columns) {
332
+ // Translate header text
333
+ if (column.headerText) {
334
+ column.headerText = translate(column.headerText);
335
+ }
336
+ }
337
+ });
338
+ }
324
339
  }
325
340
  exports.default = TableChart;
@@ -2,11 +2,12 @@ import React from "react";
2
2
  import RichTextComponent from "../../richtext/RichTextComponent";
3
3
  import ExprInsertModalComponent from "./ExprInsertModalComponent";
4
4
  import ExprUpdateModalComponent from "./ExprUpdateModalComponent";
5
- import ExprItemsHtmlConverter from "../../richtext/ExprItemsHtmlConverter";
5
+ import ExprItemsHtmlConverter, { HtmlItemExpr, HtmlItemOrExpr } from "../../richtext/ExprItemsHtmlConverter";
6
6
  import { TextWidgetDesign } from "./TextWidgetDesign";
7
7
  import { DataSource, Schema } from "@mwater/expressions";
8
8
  export interface TextComponentProps {
9
9
  design: TextWidgetDesign;
10
+ /** Called when design changes. If not set, will be in display mode, otherwise in edit mode */
10
11
  onDesignChange?: (design: TextWidgetDesign) => void;
11
12
  schema: Schema;
12
13
  dataSource: DataSource;
@@ -22,17 +23,23 @@ export interface TextComponentProps {
22
23
  namedStrings?: {
23
24
  [key: string]: string;
24
25
  };
26
+ /** Locale to use for display */
27
+ locale: string;
25
28
  }
29
+ /**
30
+ * Text component which is provided with the data it needs, rather than loading it.
31
+ * Used by TextWidgetComponent and also by other components that embed text fields
32
+ */
26
33
  export default class TextComponent extends React.Component<TextComponentProps> {
27
34
  static contextType: React.Context<string>;
28
35
  exprInsertModal: ExprInsertModalComponent | null;
29
36
  exprUpdateModal: ExprUpdateModalComponent | null;
30
37
  editor: RichTextComponent | null;
31
38
  createItemsHtmlConverter(): ExprItemsHtmlConverter;
32
- handleItemsChange: (items: any) => void;
33
- handleInsertExpr: (item: any) => void;
39
+ handleItemsChange: (items: HtmlItemOrExpr[]) => void;
40
+ handleInsertExpr: (item: HtmlItemExpr) => void;
34
41
  replaceItem(item: any): void;
35
- handleItemClick: (item: any) => void;
42
+ handleItemClick: (item: HtmlItemExpr) => void;
36
43
  handleAddExpr: (ev: React.MouseEvent<HTMLDivElement>) => void;
37
44
  renderExtraPaletteButtons(): React.JSX.Element;
38
45
  renderModals(): React.JSX.Element[];
@@ -10,8 +10,10 @@ const ExprInsertModalComponent_1 = __importDefault(require("./ExprInsertModalCom
10
10
  const ExprUpdateModalComponent_1 = __importDefault(require("./ExprUpdateModalComponent"));
11
11
  const ExprItemsHtmlConverter_1 = __importDefault(require("../../richtext/ExprItemsHtmlConverter"));
12
12
  const expressions_ui_1 = require("@mwater/expressions-ui");
13
- // Text component which is provided with the data it needs, rather than loading it.
14
- // Used by TextWidgetComponent and also by other components that embed text fields
13
+ /**
14
+ * Text component which is provided with the data it needs, rather than loading it.
15
+ * Used by TextWidgetComponent and also by other components that embed text fields
16
+ */
15
17
  class TextComponent extends react_1.default.Component {
16
18
  static contextType = expressions_ui_1.LocaleContext;
17
19
  exprInsertModal = null;
@@ -19,7 +21,7 @@ class TextComponent extends react_1.default.Component {
19
21
  editor = null;
20
22
  createItemsHtmlConverter() {
21
23
  return new ExprItemsHtmlConverter_1.default(this.props.schema, this.props.onDesignChange != null, this.props.exprValues,
22
- // Display summaries if in design more and singleRowTable is set
24
+ // Display summaries if in design mode and singleRowTable is set
23
25
  this.props.onDesignChange != null && this.props.singleRowTable != null,
24
26
  // Only replace named strings if not editing
25
27
  this.props.onDesignChange == null ? this.props.namedStrings : undefined, this.context);
@@ -45,22 +47,23 @@ class TextComponent extends react_1.default.Component {
45
47
  }
46
48
  });
47
49
  const items = replaceItemInItems(this.props.design.items || [], item);
48
- return this.props.onDesignChange({ ...this.props.design, items });
50
+ this.props.onDesignChange({ ...this.props.design, items });
49
51
  }
50
52
  handleItemClick = (item) => {
51
- return this.exprUpdateModal.open(item, (item) => {
53
+ this.exprUpdateModal.open(item, (item) => {
52
54
  // Replace in items
53
- return this.replaceItem(item);
55
+ this.replaceItem(item);
54
56
  });
55
57
  };
56
58
  handleAddExpr = (ev) => {
57
59
  ev.preventDefault();
58
- return this.exprInsertModal.open();
60
+ this.exprInsertModal.open();
59
61
  };
60
62
  renderExtraPaletteButtons() {
61
63
  return (react_1.default.createElement("div", { key: "expr", className: "mwater-visualization-text-palette-item", onMouseDown: this.handleAddExpr },
62
64
  react_1.default.createElement("i", { className: "fa fa-plus" }),
63
- T ` Expression`));
65
+ " ",
66
+ T `Expression`));
64
67
  }
65
68
  renderModals() {
66
69
  return [
@@ -11,8 +11,8 @@ export default class TextWidget extends Widget {
11
11
  dataSource: DataSource;
12
12
  widgetDataSource: import("../WidgetDataSource").WidgetDataSource;
13
13
  filters: JsonQLFilter[];
14
- design: object;
15
- onDesignChange: ((design: object) => void) | null | undefined;
14
+ design: any;
15
+ onDesignChange: ((design: any) => void) | null | undefined;
16
16
  width: number | undefined;
17
17
  height: number | undefined;
18
18
  singleRowTable: string | undefined;
@@ -21,10 +21,13 @@ export default class TextWidget extends Widget {
21
21
  } | undefined;
22
22
  ref: ((widget: any) => void) | undefined;
23
23
  refreshKey: any;
24
+ locale: string;
25
+ translate: (input: string) => string;
24
26
  }, any>;
25
27
  getData(design: any, schema: Schema, dataSource: DataSource, filters: JsonQLFilter[], callback: any): any;
26
28
  isAutoHeight(): boolean;
27
- getExprItems(items: HtmlItem[]): HtmlItemExpr[];
29
+ getExprItems(items?: HtmlItem[]): HtmlItemExpr[];
28
30
  getFilterableTables(design: TextWidgetDesign | undefined, schema: Schema): string[];
29
31
  getTOCEntries(design: any, namedStrings: any): any;
32
+ getTranslatableStrings(design: TextWidgetDesign, schema: Schema): string[];
30
33
  }
@@ -12,6 +12,7 @@ const expressions_2 = require("@mwater/expressions");
12
12
  const expressions_3 = require("@mwater/expressions");
13
13
  const expressions_4 = require("@mwater/expressions");
14
14
  const Widget_1 = __importDefault(require("../Widget"));
15
+ const ExprItemsTranslator_1 = require("../../richtext/ExprItemsTranslator");
15
16
  class TextWidget extends Widget_1.default {
16
17
  // Creates a React element that is a view of the widget
17
18
  // options:
@@ -42,7 +43,9 @@ class TextWidget extends Widget_1.default {
42
43
  singleRowTable: options.singleRowTable,
43
44
  namedStrings: options.namedStrings,
44
45
  ref: options.widgetRef,
45
- refreshKey: options.refreshKey
46
+ refreshKey: options.refreshKey,
47
+ locale: options.locale,
48
+ translate: options.translate
46
49
  });
47
50
  }
48
51
  // Get the data that the widget needs. This will be called on the server, typically.
@@ -243,5 +246,8 @@ class TextWidget extends Widget_1.default {
243
246
  findRecursive(design.items);
244
247
  return entries;
245
248
  }
249
+ getTranslatableStrings(design, schema) {
250
+ return (0, ExprItemsTranslator_1.getHtmlItemsStrings)(design.items || []);
251
+ }
246
252
  }
247
253
  exports.default = TextWidget;
@@ -19,6 +19,10 @@ export interface TextWidgetComponentProps {
19
19
  namedStrings?: any;
20
20
  /** A key that changes when the widget should be refreshed */
21
21
  refreshKey?: any;
22
+ /** Locale to use for display */
23
+ locale: string;
24
+ /** Translate function to use for display. Returns same string when editing. */
25
+ translate: (input: string) => string;
22
26
  }
23
27
  export default class TextWidgetComponent extends AsyncLoadComponent<TextWidgetComponentProps, {
24
28
  loading: boolean;
@@ -13,6 +13,7 @@ const ActionCancelModalComponent_1 = __importDefault(require("@mwater/react-libr
13
13
  const bootstrap_1 = require("@mwater/react-library/lib/bootstrap");
14
14
  const ColorComponent_1 = __importDefault(require("../../ColorComponent"));
15
15
  const bootstrap_2 = require("@mwater/react-library/lib/bootstrap");
16
+ const ExprItemsTranslator_1 = require("../../richtext/ExprItemsTranslator");
16
17
  // Widget which displays styled text with embedded expressions
17
18
  class TextWidgetComponent extends AsyncLoadComponent_1.default {
18
19
  divComp;
@@ -123,7 +124,12 @@ class TextWidgetComponent extends AsyncLoadComponent_1.default {
123
124
  // If loading, don't display old values
124
125
  const exprValues = !this.state.loading ? this.state.exprValues : {};
125
126
  const padding = this.props.design.padding ?? 0;
126
- return (react_1.default.createElement(TextComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, exprValues: exprValues, width: this.props.width ? this.props.width - padding * 2 : undefined, height: this.props.height ? this.props.height - padding * 2 : undefined, singleRowTable: this.props.singleRowTable, namedStrings: this.props.namedStrings }));
127
+ // Translate items if needed
128
+ const translatedDesign = this.props.onDesignChange ? this.props.design : {
129
+ ...this.props.design,
130
+ items: (0, ExprItemsTranslator_1.translateHtmlItems)(this.props.design.items || [], this.props.translate)
131
+ };
132
+ return (react_1.default.createElement(TextComponent_1.default, { design: translatedDesign, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, exprValues: exprValues, width: this.props.width ? this.props.width - padding * 2 : undefined, height: this.props.height ? this.props.height - padding * 2 : undefined, singleRowTable: this.props.singleRowTable, namedStrings: this.props.namedStrings, locale: this.props.locale }));
127
133
  }
128
134
  render() {
129
135
  const borderStyle = this.props.design.borderThickness && this.props.design.borderColor
@@ -1,9 +1,7 @@
1
- import { HtmlItemExpr } from "../../richtext/ExprItemsHtmlConverter";
2
- import { HtmlItem } from "../../richtext/ItemsHtmlConverter";
3
- export type TextWidgetItem = HtmlItem | HtmlItemExpr;
1
+ import { HtmlItemOrExpr } from "../../richtext/ExprItemsHtmlConverter";
4
2
  export interface TextWidgetDesign {
5
3
  /** Text widget stores its content as array of items. See ItemsHtmlConverter TODO */
6
- items: TextWidgetItem[];
4
+ items?: HtmlItemOrExpr[];
7
5
  /** "title" for title block. default is "default" */
8
6
  style?: "title" | "default" | "header" | "footer";
9
7
  /** Background color of the text widget (optional) */
@@ -3,5 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isEmptyTextWidgetDesign = isEmptyTextWidgetDesign;
4
4
  /** Returns true if the text widget design is empty. */
5
5
  function isEmptyTextWidgetDesign(design) {
6
- return design == null || design.items.length === 0;
6
+ return design == null || (design.items != null && design.items.length === 0);
7
7
  }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@mwater/visualization",
3
- "version": "5.4.1",
3
+ "version": "5.4.3",
4
4
  "description": "Visualization library",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
7
- "test": "../../node_modules/build-library/test-cli",
8
- "test-browser": "../../node_modules/build-library/test-browser",
9
- "watch": "../../node_modules/build-library/watch",
7
+ "test": "./node_modules/build-library/test-cli",
8
+ "test-browser": "./node_modules/build-library/test-browser",
9
+ "watch": "./node_modules/build-library/watch",
10
10
  "build": "rsync -av --exclude '*.ts' --exclude '*.tsx' src/ lib/ ; tsc -p tsconfig.build.json",
11
11
  "prepublish": "npm run build"
12
12
  },
@@ -29,7 +29,7 @@
29
29
  "async": "^1.2.1",
30
30
  "async-latest": "^1.0.0",
31
31
  "backbone": "~1.1.2",
32
- "billboard.js": "3.12.2",
32
+ "billboard.js": "3.14.0",
33
33
  "canonical-json": "0.0.4",
34
34
  "classnames": "^2.3.1",
35
35
  "color": "^3.2.1",
@@ -41,9 +41,8 @@
41
41
  "d3-tip": "^0.9.0",
42
42
  "dayjs": "^1.11.10",
43
43
  "dompurify": "^1.0.11",
44
- "ez-localize": "^2.10.5",
44
+ "ez-localize": "^2.13.0",
45
45
  "file-saver": "^2.0.5",
46
- "fixed-data-table-2": "^1.2.15",
47
46
  "immer": "^8.0.0",
48
47
  "immutable-setter": "^1.1.1",
49
48
  "jquery": "^3.6.3",
@@ -85,7 +84,7 @@
85
84
  "@types/d3": "^5.16.4",
86
85
  "@types/d3-format": "^1.4.1",
87
86
  "@types/dompurify": "0.0.32",
88
- "@types/fixed-data-table-2": "^0.8.6",
87
+ "@types/file-saver": "^2.0.7",
89
88
  "@types/jquery": "^3.5.5",
90
89
  "@types/leaflet": "^1.7.9",
91
90
  "@types/lodash": "^3.10.3",
@@ -64,8 +64,7 @@ export default class ColorComponent extends React.Component<ColorComponentProps,
64
64
  <div style={popupPosition}>
65
65
  {!this.props.disableReset && (
66
66
  <button type="button" className="btn btn-link btn-sm" onClick={this.handleReset}>
67
- <i className="fa fa-undo" />
68
- {T` Reset Color`}
67
+ <i className="fa fa-undo" /> {T`Reset Color`}
69
68
  </button>
70
69
  )}
71
70
  <button type="button" className="btn btn-link btn-sm" onClick={this.handleAdvanced}>