@mwater/visualization 5.4.0 → 5.4.2

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 (271) 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 +6 -0
  21. package/lib/dashboards/DashboardComponent.js +44 -12
  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/layouts/blocks/HorizontalBlockComponent.js +2 -2
  47. package/lib/mWaterLoader.d.ts +1 -1
  48. package/lib/maps/BufferLayer.d.ts +7 -5
  49. package/lib/maps/BufferLayer.js +69 -48
  50. package/lib/maps/BufferLayerDesign.d.ts +21 -14
  51. package/lib/maps/BufferLayerDesignerComponent.d.ts +16 -31
  52. package/lib/maps/BufferLayerDesignerComponent.js +68 -102
  53. package/lib/maps/ChoroplethLayer.d.ts +5 -4
  54. package/lib/maps/ChoroplethLayer.js +32 -9
  55. package/lib/maps/ChoroplethLayerDesign.d.ts +6 -2
  56. package/lib/maps/ChoroplethLayerDesigner.js +4 -2
  57. package/lib/maps/ClusterLayer.d.ts +3 -4
  58. package/lib/maps/ClusterLayer.js +2 -1
  59. package/lib/maps/DetailLevelSelectComponent.js +1 -1
  60. package/lib/maps/DirectMapDataSource.js +2 -1
  61. package/lib/maps/EditPopupComponent.js +5 -3
  62. package/lib/maps/GridLayer.d.ts +3 -4
  63. package/lib/maps/GridLayer.js +2 -1
  64. package/lib/maps/GridLayerDesigner.js +5 -3
  65. package/lib/maps/HoverContent.d.ts +11 -3
  66. package/lib/maps/HoverContent.js +25 -9
  67. package/lib/maps/Layer.d.ts +24 -3
  68. package/lib/maps/Layer.js +5 -1
  69. package/lib/maps/LayerFactory.js +0 -8
  70. package/lib/maps/LayerLegendComponent.js +0 -1
  71. package/lib/maps/LayerSwitcherComponent.d.ts +1 -0
  72. package/lib/maps/LayerSwitcherComponent.js +1 -1
  73. package/lib/maps/LeafletMapComponent.js +3 -1
  74. package/lib/maps/LegendComponent.d.ts +1 -0
  75. package/lib/maps/LegendComponent.js +9 -1
  76. package/lib/maps/MWaterServerLayer.d.ts +2 -2
  77. package/lib/maps/MWaterServerLayer.js +2 -2
  78. package/lib/maps/MapComponent.js +3 -3
  79. package/lib/maps/MapDesign.d.ts +2 -0
  80. package/lib/maps/MapDesignerComponent.d.ts +4 -3
  81. package/lib/maps/MapDesignerComponent.js +68 -74
  82. package/lib/maps/MapLayerViewDesignerComponent.js +2 -2
  83. package/lib/maps/MapUtils.d.ts +4 -0
  84. package/lib/maps/MapUtils.js +19 -0
  85. package/lib/maps/MapViewComponent.d.ts +8 -3
  86. package/lib/maps/MarkersLayer.d.ts +5 -4
  87. package/lib/maps/MarkersLayer.js +33 -7
  88. package/lib/maps/MarkersLayerDesign.d.ts +19 -16
  89. package/lib/maps/PopupFilterJoinsUtils.d.ts +6 -3
  90. package/lib/maps/PopupFilterJoinsUtils.js +0 -6
  91. package/lib/maps/RasterMapViewComponent.d.ts +3 -31
  92. package/lib/maps/RasterMapViewComponent.js +7 -2
  93. package/lib/maps/ServerMapDataSource.js +2 -1
  94. package/lib/maps/SwitchableTileUrlLayer.d.ts +3 -3
  95. package/lib/maps/SwitchableTileUrlLayer.js +2 -1
  96. package/lib/maps/TileUrlLayer.d.ts +4 -5
  97. package/lib/maps/TileUrlLayer.js +2 -1
  98. package/lib/maps/VectorMapViewComponent.d.ts +5 -37
  99. package/lib/maps/VectorMapViewComponent.js +19 -8
  100. package/lib/maps/maps.d.ts +3 -0
  101. package/lib/quickfilter/QuickfiltersComponent.d.ts +2 -0
  102. package/lib/quickfilter/QuickfiltersComponent.js +9 -7
  103. package/lib/quickfilter/QuickfiltersDesignComponent.d.ts +1 -1
  104. package/lib/quickfilter/QuickfiltersDesignComponent.js +19 -35
  105. package/lib/richtext/ExprItemsHtmlConverter.d.ts +5 -2
  106. package/lib/richtext/ExprItemsHtmlConverter.js +4 -4
  107. package/lib/richtext/ExprItemsTranslator.d.ts +5 -0
  108. package/lib/richtext/ExprItemsTranslator.js +149 -0
  109. package/lib/richtext/ItemsHtmlConverter.d.ts +1 -1
  110. package/lib/richtext/ItemsHtmlConverter.js +31 -15
  111. package/lib/wellknown.js +12 -9
  112. package/lib/widgets/IFrameWidget.d.ts +4 -4
  113. package/lib/widgets/ImageWidget.d.ts +7 -4
  114. package/lib/widgets/ImageWidget.js +9 -1
  115. package/lib/widgets/ImageWidgetComponent.d.ts +1 -0
  116. package/lib/widgets/ImageWidgetComponent.js +1 -1
  117. package/lib/widgets/MapWidget.d.ts +5 -48
  118. package/lib/widgets/MapWidget.js +26 -63
  119. package/lib/widgets/MarkdownWidget.d.ts +3 -0
  120. package/lib/widgets/MarkdownWidget.js +3 -0
  121. package/lib/widgets/TOCWidget.d.ts +15 -27
  122. package/lib/widgets/TOCWidget.js +107 -183
  123. package/lib/widgets/Widget.d.ts +18 -7
  124. package/lib/widgets/Widget.js +4 -0
  125. package/lib/widgets/WidgetScopesViewComponent.js +1 -1
  126. package/lib/widgets/charts/Chart.d.ts +10 -1
  127. package/lib/widgets/charts/Chart.js +22 -11
  128. package/lib/widgets/charts/ChartViewComponent.d.ts +4 -0
  129. package/lib/widgets/charts/ChartViewComponent.js +6 -3
  130. package/lib/widgets/charts/ChartWidget.d.ts +2 -0
  131. package/lib/widgets/charts/ChartWidget.js +9 -1
  132. package/lib/widgets/charts/ChartWidgetComponent.d.ts +4 -0
  133. package/lib/widgets/charts/ChartWidgetComponent.js +2 -2
  134. package/lib/widgets/charts/calendar/CalendarChart.d.ts +1 -0
  135. package/lib/widgets/charts/calendar/CalendarChart.js +26 -0
  136. package/lib/widgets/charts/calendar/CalendarChartViewComponent.js +3 -1
  137. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.d.ts +1 -0
  138. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.js +8 -0
  139. package/lib/widgets/charts/layered/LayeredChart.d.ts +2 -0
  140. package/lib/widgets/charts/layered/LayeredChart.js +63 -3
  141. package/lib/widgets/charts/layered/LayeredChartCompiler.d.ts +1 -1
  142. package/lib/widgets/charts/layered/LayeredChartCompiler.js +3 -3
  143. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +2 -2
  144. package/lib/widgets/charts/layered/LayeredChartViewComponent.js +8 -3
  145. package/lib/widgets/charts/pivot/PivotChart.d.ts +1 -0
  146. package/lib/widgets/charts/pivot/PivotChart.js +63 -0
  147. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.d.ts +1 -0
  148. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +1 -1
  149. package/lib/widgets/charts/pivot/SegmentDesignerComponent.d.ts +6 -0
  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 +79 -14
  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/layouts/blocks/HorizontalBlockComponent.ts +2 -2
  192. package/src/mWaterLoader.ts +1 -1
  193. package/src/maps/BufferLayer.ts +83 -60
  194. package/src/maps/BufferLayerDesign.ts +20 -14
  195. package/src/maps/BufferLayerDesignerComponent.tsx +309 -0
  196. package/src/maps/ChoroplethLayer.ts +40 -19
  197. package/src/maps/ChoroplethLayerDesign.ts +4 -2
  198. package/src/maps/ChoroplethLayerDesigner.tsx +4 -2
  199. package/src/maps/ClusterLayer.ts +4 -10
  200. package/src/maps/DetailLevelSelectComponent.ts +1 -1
  201. package/src/maps/DirectMapDataSource.ts +2 -1
  202. package/src/maps/EditPopupComponent.ts +7 -3
  203. package/src/maps/GridLayer.ts +4 -10
  204. package/src/maps/GridLayerDesigner.tsx +5 -3
  205. package/src/maps/HoverContent.tsx +40 -16
  206. package/src/maps/Layer.ts +28 -10
  207. package/src/maps/LayerFactory.ts +0 -8
  208. package/src/maps/LayerLegendComponent.ts +2 -4
  209. package/src/maps/LayerSwitcherComponent.tsx +6 -2
  210. package/src/maps/LeafletMapComponent.tsx +3 -1
  211. package/src/maps/LegendComponent.tsx +10 -1
  212. package/src/maps/MWaterServerLayer.ts +3 -3
  213. package/src/maps/MapComponent.ts +3 -3
  214. package/src/maps/MapDesign.ts +3 -0
  215. package/src/maps/MapDesignerComponent.tsx +165 -162
  216. package/src/maps/MapLayerViewDesignerComponent.ts +2 -2
  217. package/src/maps/MapUtils.ts +24 -0
  218. package/src/maps/MapViewComponent.tsx +11 -3
  219. package/src/maps/MarkersLayer.ts +44 -18
  220. package/src/maps/MarkersLayerDesign.ts +19 -16
  221. package/src/maps/PopupFilterJoinsUtils.ts +6 -2
  222. package/src/maps/RasterMapViewComponent.ts +9 -45
  223. package/src/maps/ServerMapDataSource.ts +2 -2
  224. package/src/maps/SwitchableTileUrlLayer.tsx +4 -10
  225. package/src/maps/TileUrlLayer.tsx +4 -10
  226. package/src/maps/VectorMapViewComponent.tsx +28 -55
  227. package/src/maps/maps.ts +3 -0
  228. package/src/quickfilter/QuickfiltersComponent.ts +13 -7
  229. package/src/quickfilter/QuickfiltersDesignComponent.tsx +56 -74
  230. package/src/richtext/ExprItemsHtmlConverter.ts +9 -5
  231. package/src/richtext/ExprItemsTranslator.ts +176 -0
  232. package/src/richtext/ItemsHtmlConverter.ts +33 -18
  233. package/src/wellknown.ts +33 -30
  234. package/src/widgets/ImageWidget.ts +10 -1
  235. package/src/widgets/ImageWidgetComponent.ts +3 -2
  236. package/src/widgets/{MapWidget.ts → MapWidget.tsx} +90 -101
  237. package/src/widgets/MarkdownWidget.ts +3 -0
  238. package/src/widgets/TOCWidget.tsx +281 -0
  239. package/src/widgets/Widget.ts +25 -5
  240. package/src/widgets/WidgetScopesViewComponent.ts +2 -1
  241. package/src/widgets/charts/Chart.ts +31 -12
  242. package/src/widgets/charts/ChartViewComponent.ts +13 -3
  243. package/src/widgets/charts/ChartWidget.ts +11 -1
  244. package/src/widgets/charts/ChartWidgetComponent.tsx +9 -1
  245. package/src/widgets/charts/calendar/CalendarChart.ts +29 -0
  246. package/src/widgets/charts/calendar/CalendarChartViewComponent.tsx +3 -1
  247. package/src/widgets/charts/imagemosaic/ImageMosaicChart.ts +9 -0
  248. package/src/widgets/charts/layered/LayeredChart.ts +71 -3
  249. package/src/widgets/charts/layered/LayeredChartCompiler.ts +4 -4
  250. package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +4 -2
  251. package/src/widgets/charts/layered/LayeredChartViewComponent.ts +10 -4
  252. package/src/widgets/charts/pivot/PivotChart.ts +73 -0
  253. package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +1 -1
  254. package/src/widgets/charts/pivot/SegmentDesignerComponent.tsx +6 -4
  255. package/src/widgets/charts/table/OrderingsComponent.tsx +2 -1
  256. package/src/widgets/charts/table/TableChart.ts +17 -0
  257. package/src/widgets/text/TextComponent.tsx +22 -12
  258. package/src/widgets/text/TextWidget.ts +9 -2
  259. package/src/widgets/text/TextWidgetComponent.tsx +16 -1
  260. package/src/widgets/text/TextWidgetDesign.ts +4 -7
  261. package/test/IdSelectionTests.ts +54 -0
  262. package/test/LayeredChartCompilerTests.ts +0 -2
  263. package/test/richtext/ExprItemsTranslatorTests.ts +144 -0
  264. package/test/wellknownTests.ts +144 -0
  265. package/src/datagrids/DatagridComponent.ts +0 -478
  266. package/src/datagrids/DatagridViewComponent.ts +0 -464
  267. package/src/datagrids/EditExprCellComponent.tsx +0 -305
  268. package/src/datagrids/README.md +0 -3
  269. package/src/maps/BufferLayerDesignerComponent.ts +0 -311
  270. package/src/widgets/TOCWidget.ts +0 -326
  271. package/test/LegoLayoutEngineTests.ts +0 -69
@@ -8,7 +8,7 @@ export interface ChartCreateViewElementOptions {
8
8
  schema: Schema;
9
9
  /** data source to use. Only used when designing, for display uses data **/
10
10
  dataSource: DataSource;
11
- /** Chart design **/
11
+ /** Chart design. Should already be translated. */
12
12
  design: any;
13
13
  /** called with new design. null/undefined for readonly **/
14
14
  onDesignChange?: {
@@ -28,6 +28,8 @@ export interface ChartCreateViewElementOptions {
28
28
  height?: number;
29
29
  /** Called with (tableId, rowId) when item is clicked **/
30
30
  onRowClick?: (tableId: string, rowId: any) => void;
31
+ /** Locale to use for display */
32
+ locale: string;
31
33
  }
32
34
  export default class Chart {
33
35
  cleanDesign(design: any, schema: Schema): void;
@@ -45,6 +47,9 @@ export default class Chart {
45
47
  onDesignChange: (design: any) => void;
46
48
  }): ReactNode;
47
49
  getData(design: any, schema: Schema, dataSource: DataSource, filters: any, callback: any): void;
50
+ /** Create a view element for the chart.
51
+ * Chart design should already be translated. This is handled by ChartViewComponent.
52
+ */
48
53
  createViewElement(options: ChartCreateViewElementOptions): ReactNode;
49
54
  createDropdownItems(design: any, schema: Schema, widgetDataSource: WidgetDataSource, filters: any): {
50
55
  label: ReactNode;
@@ -53,4 +58,8 @@ export default class Chart {
53
58
  createDataTable(design: any, schema: Schema, dataSource: DataSource, data: any, locale: any): any[][];
54
59
  getFilterableTables(design: any, schema: Schema): string[];
55
60
  getPlaceholderIcon(): string;
61
+ /** Get a list of translatable strings in the design. No need to override in subclasses. Design should already be cleaned. */
62
+ getTranslatableStrings(design: any, schema: Schema): string[];
63
+ /** Translates the design. Override in subclasses. Design is already cleaned. */
64
+ translateDesign(design: any, translate: (input: string) => string): any;
56
65
  }
@@ -44,17 +44,9 @@ class Chart {
44
44
  getData(design, schema, dataSource, filters, callback) {
45
45
  throw new Error("Not implemented");
46
46
  }
47
- // Create a view element for the chart
48
- // Options include:
49
- // schema: schema to use
50
- // dataSource: dataSource to use
51
- // design: design of the chart
52
- // onDesignChange: when design changes
53
- // data: results from queries
54
- // width, height: size of the chart view
55
- // scope: current scope of the view element
56
- // onScopeChange: called when scope changes with new scope
57
- // onRowClick: Called with (tableId, rowId) when item is clicked
47
+ /** Create a view element for the chart.
48
+ * Chart design should already be translated. This is handled by ChartViewComponent.
49
+ */
58
50
  createViewElement(options) {
59
51
  throw new Error("Not implemented");
60
52
  }
@@ -79,5 +71,24 @@ class Chart {
79
71
  getPlaceholderIcon() {
80
72
  return "";
81
73
  }
74
+ /** Get a list of translatable strings in the design. No need to override in subclasses. Design should already be cleaned. */
75
+ getTranslatableStrings(design, schema) {
76
+ const strings = new Set();
77
+ // Create collector function that just saves strings and returns them unchanged
78
+ const collectStrings = (str) => {
79
+ // Only collect non-empty strings
80
+ if (str) {
81
+ strings.add(str);
82
+ }
83
+ return str;
84
+ };
85
+ // Use existing translation function but with collector
86
+ this.translateDesign(design, collectStrings);
87
+ return Array.from(strings);
88
+ }
89
+ /** Translates the design. Override in subclasses. Design is already cleaned. */
90
+ translateDesign(design, translate) {
91
+ return design;
92
+ }
82
93
  }
83
94
  exports.default = Chart;
@@ -26,6 +26,10 @@ export interface ChartViewComponentProps {
26
26
  onRowClick?: (tableId: string, rowId: any) => void;
27
27
  /** A key that changes when the widget should be refreshed */
28
28
  refreshKey?: any;
29
+ /** Locale to use for display */
30
+ locale: string;
31
+ /** Translate function to use for display */
32
+ translate: (input: string) => string;
29
33
  }
30
34
  interface ChartViewComponentState {
31
35
  cacheExpiry?: any;
@@ -108,11 +108,13 @@ class ChartViewComponent extends react_1.default.Component {
108
108
  if (this.state.dataError) {
109
109
  return this.renderError();
110
110
  }
111
- return R("div", { style }, this.state.validDesign
111
+ // Translate design if needed
112
+ const translatedDesign = this.props.onDesignChange || !this.props.translate || !this.state.validDesign ? this.state.validDesign : this.props.chart.translateDesign(this.state.validDesign, this.props.translate);
113
+ return R("div", { style }, translatedDesign
112
114
  ? this.props.chart.createViewElement({
113
115
  schema: this.props.schema,
114
116
  dataSource: this.props.dataSource,
115
- design: this.state.validDesign,
117
+ design: translatedDesign,
116
118
  onDesignChange: this.props.onDesignChange,
117
119
  data: this.state.data,
118
120
  scope: this.props.scope,
@@ -120,7 +122,8 @@ class ChartViewComponent extends react_1.default.Component {
120
122
  width: this.props.width,
121
123
  height: this.props.height,
122
124
  onRowClick: this.props.onRowClick,
123
- filters: this.props.filters
125
+ filters: this.props.filters,
126
+ locale: this.props.locale,
124
127
  })
125
128
  : undefined, this.state.dataLoading ? this.renderSpinner() : undefined);
126
129
  }
@@ -11,4 +11,6 @@ export default class ChartWidget extends Widget {
11
11
  getData(design: any, schema: Schema, dataSource: DataSource, filters: any, callback: any): void;
12
12
  getFilterableTables(design: any, schema: Schema): string[];
13
13
  isAutoHeight(): boolean;
14
+ /** Get a list of translatable strings in the design */
15
+ getTranslatableStrings(design: any, schema: Schema): string[];
14
16
  }
@@ -41,7 +41,9 @@ class ChartWidget extends Widget_1.default {
41
41
  width: options.width,
42
42
  height: options.height,
43
43
  onRowClick: options.onRowClick,
44
- refreshKey: options.refreshKey
44
+ refreshKey: options.refreshKey,
45
+ locale: options.locale,
46
+ translate: options.translate
45
47
  });
46
48
  }
47
49
  // Get the data that the widget needs. This will be called on the server, typically.
@@ -65,5 +67,11 @@ class ChartWidget extends Widget_1.default {
65
67
  isAutoHeight() {
66
68
  return this.chart.isAutoHeight();
67
69
  }
70
+ /** Get a list of translatable strings in the design */
71
+ getTranslatableStrings(design, schema) {
72
+ // Clean design first
73
+ const cleanDesign = this.chart.cleanDesign(design, schema);
74
+ return this.chart.getTranslatableStrings(cleanDesign, schema);
75
+ }
68
76
  }
69
77
  exports.default = ChartWidget;
@@ -33,6 +33,10 @@ export interface ChartWidgetComponentProps {
33
33
  connectResizeHandle?: any;
34
34
  /** A key that changes when the widget should be refreshed */
35
35
  refreshKey?: any;
36
+ /** Locale to use for display */
37
+ locale: string;
38
+ /** Translate function to use for display */
39
+ translate: (input: string) => string;
36
40
  }
37
41
  export declare class ChartWidgetComponent extends React.PureComponent<ChartWidgetComponentProps, {
38
42
  editDesign: any;
@@ -87,7 +87,7 @@ class ChartWidgetComponent extends react_1.default.PureComponent {
87
87
  this.setState({ editDesign: design });
88
88
  };
89
89
  renderChart(design, onDesignChange, width, height) {
90
- return react_1.default.createElement(ChartViewComponent_1.default, { chart: this.props.chart, design: design, onDesignChange: onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, widgetDataSource: this.props.widgetDataSource, scope: this.props.scope, filters: this.props.filters, width: width, height: height, onScopeChange: this.props.onScopeChange, onRowClick: this.props.onRowClick, refreshKey: this.props.refreshKey });
90
+ return react_1.default.createElement(ChartViewComponent_1.default, { chart: this.props.chart, design: design, onDesignChange: onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, widgetDataSource: this.props.widgetDataSource, scope: this.props.scope, filters: this.props.filters, width: width, height: height, onScopeChange: this.props.onScopeChange, onRowClick: this.props.onRowClick, refreshKey: this.props.refreshKey, locale: this.props.locale, translate: this.props.translate });
91
91
  }
92
92
  renderEditor() {
93
93
  if (!this.state.editDesign) {
@@ -149,7 +149,7 @@ class ChartWidgetComponent extends react_1.default.PureComponent {
149
149
  // Create dropdown items
150
150
  const dropdownItems = this.props.chart.createDropdownItems(design, this.props.schema, this.props.widgetDataSource, this.props.filters);
151
151
  if (!designError) {
152
- dropdownItems.push({ label: T `Export Data`, icon: "save-file", onClick: this.handleSaveCsvFile });
152
+ dropdownItems.push({ label: T `Export Data`, onClick: this.handleSaveCsvFile });
153
153
  }
154
154
  if (this.props.onDesignChange != null) {
155
155
  dropdownItems.unshift({
@@ -36,4 +36,5 @@ export default class CalendarChart extends Chart {
36
36
  createDataTable(design: any, schema: Schema, dataSource: DataSource, data: any): string[][];
37
37
  getFilterableTables(design: any, schema: Schema): any[];
38
38
  getPlaceholderIcon(): string;
39
+ translateDesign(design: CalendarChartDesign, translate: (input: string) => string): CalendarChartDesign;
39
40
  }
@@ -171,5 +171,31 @@ class CalendarChart extends Chart_1.default {
171
171
  getPlaceholderIcon() {
172
172
  return "fa-calendar";
173
173
  }
174
+ translateDesign(design, translate) {
175
+ return (0, immer_1.default)(design, draft => {
176
+ // Translate title text
177
+ if (draft.titleText) {
178
+ draft.titleText = translate(draft.titleText);
179
+ }
180
+ // Translate axis category labels
181
+ if (draft.dateAxis?.categoryLabels) {
182
+ for (const key in draft.dateAxis.categoryLabels) {
183
+ draft.dateAxis.categoryLabels[key] = translate(draft.dateAxis.categoryLabels[key]);
184
+ }
185
+ }
186
+ if (draft.valueAxis?.categoryLabels) {
187
+ for (const key in draft.valueAxis.categoryLabels) {
188
+ draft.valueAxis.categoryLabels[key] = translate(draft.valueAxis.categoryLabels[key]);
189
+ }
190
+ }
191
+ // Translate null labels
192
+ if (draft.dateAxis?.nullLabel) {
193
+ draft.dateAxis.nullLabel = translate(draft.dateAxis.nullLabel);
194
+ }
195
+ if (draft.valueAxis?.nullLabel) {
196
+ draft.valueAxis.nullLabel = translate(draft.valueAxis.nullLabel);
197
+ }
198
+ });
199
+ }
174
200
  }
175
201
  exports.default = CalendarChart;
@@ -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[];
@@ -557,8 +557,8 @@ class LayeredChartCompiler {
557
557
  if (layer.trendline === "linear") {
558
558
  const trendlineSeries = seriesY + ":trendline";
559
559
  columns.push([trendlineSeries].concat(calculateLinearRegression(yValues, xValues)));
560
- types[trendlineSeries] = (0, billboard_js_1.line)();
561
- names[trendlineSeries] = names[seriesY] + T ` Trendline`;
560
+ types[trendlineSeries] = billboard_js_1.line ? (0, billboard_js_1.line)() : "line";
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
@@ -803,7 +803,7 @@ class LayeredChartCompiler {
803
803
  trendYs = lodash_1.default.initial(trendYs);
804
804
  }
805
805
  columns.push([trendlineSeries].concat(calculateLinearRegression(trendYs, trendXs)));
806
- types[trendlineSeries] = (0, billboard_js_1.line)();
806
+ types[trendlineSeries] = billboard_js_1.line ? (0, billboard_js_1.line)() : "line";
807
807
  names[trendlineSeries] = names[series] + " Trendline";
808
808
  xs[trendlineSeries] = "x";
809
809
  colors[trendlineSeries] = layer.color || defaultColors[layerIndex];
@@ -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;
@@ -34,6 +34,7 @@ export default class PivotChartDesignerComponent extends React.Component<PivotCh
34
34
  hasSuccess?: boolean;
35
35
  hasWarnings?: boolean;
36
36
  hasErrors?: boolean;
37
+ horizontal?: boolean;
37
38
  }, ui.FormGroup> | null;
38
39
  renderSetup(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
39
40
  render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
@@ -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);
@@ -36,6 +36,7 @@ export default class SegmentDesignerComponent extends React.Component<SegmentDes
36
36
  hasSuccess?: boolean;
37
37
  hasWarnings?: boolean;
38
38
  hasErrors?: boolean;
39
+ horizontal?: boolean;
39
40
  }, ui.FormGroup>;
40
41
  renderLabel(): React.CElement<{
41
42
  label: React.ReactNode;
@@ -46,6 +47,7 @@ export default class SegmentDesignerComponent extends React.Component<SegmentDes
46
47
  hasSuccess?: boolean;
47
48
  hasWarnings?: boolean;
48
49
  hasErrors?: boolean;
50
+ horizontal?: boolean;
49
51
  }, ui.FormGroup>;
50
52
  renderValueAxis(): React.JSX.Element;
51
53
  renderFilter(): React.CElement<{
@@ -57,6 +59,7 @@ export default class SegmentDesignerComponent extends React.Component<SegmentDes
57
59
  hasSuccess?: boolean;
58
60
  hasWarnings?: boolean;
59
61
  hasErrors?: boolean;
62
+ horizontal?: boolean;
60
63
  }, ui.FormGroup>;
61
64
  renderStyling(): React.CElement<{
62
65
  label: React.ReactNode;
@@ -67,6 +70,7 @@ export default class SegmentDesignerComponent extends React.Component<SegmentDes
67
70
  hasSuccess?: boolean;
68
71
  hasWarnings?: boolean;
69
72
  hasErrors?: boolean;
73
+ horizontal?: boolean;
70
74
  }, ui.FormGroup>;
71
75
  renderBorders(): React.CElement<{
72
76
  label: React.ReactNode;
@@ -77,6 +81,7 @@ export default class SegmentDesignerComponent extends React.Component<SegmentDes
77
81
  hasSuccess?: boolean;
78
82
  hasWarnings?: boolean;
79
83
  hasErrors?: boolean;
84
+ horizontal?: boolean;
80
85
  }, ui.FormGroup>;
81
86
  renderOrderExpr(): React.CElement<{
82
87
  label: React.ReactNode;
@@ -87,6 +92,7 @@ export default class SegmentDesignerComponent extends React.Component<SegmentDes
87
92
  hasSuccess?: boolean;
88
93
  hasWarnings?: boolean;
89
94
  hasErrors?: boolean;
95
+ horizontal?: boolean;
90
96
  }, ui.FormGroup>;
91
97
  render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
92
98
  }
@@ -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;