@mwater/visualization 5.5.0 → 5.6.1

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 (275) hide show
  1. package/lib/ColorComponent.js +2 -2
  2. package/lib/MWaterContextComponent.d.ts +1 -1
  3. package/lib/MWaterGlobalFiltersComponent.d.ts +2 -2
  4. package/lib/MWaterGlobalFiltersComponent.js +11 -20
  5. package/lib/MWaterLoaderComponent.d.ts +4 -13
  6. package/lib/MWaterLoaderComponent.js +2 -11
  7. package/lib/TranslationsTabComponent.d.ts +34 -0
  8. package/lib/TranslationsTabComponent.js +256 -0
  9. package/lib/UndoStack.d.ts +2 -1
  10. package/lib/UndoStack.js +12 -6
  11. package/lib/dashboards/DashboardComponent.js +6 -5
  12. package/lib/dashboards/DashboardDesign.d.ts +1 -1
  13. package/lib/dashboards/ServerDashboardDataSource.d.ts +0 -1
  14. package/lib/dashboards/ServerDashboardDataSource.js +0 -25
  15. package/lib/dashboards/SettingsModalComponent.js +9 -233
  16. package/lib/datagrids/DatagridComponent.js +27 -2
  17. package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -3
  18. package/lib/datagrids/DatagridDesignerComponent.js +108 -120
  19. package/lib/datagrids/DatagridViewComponent.js +33 -6
  20. package/lib/datagrids/OrderBysDesignerComponent.d.ts +7 -7
  21. package/lib/datagrids/OrderBysDesignerComponent.js +19 -28
  22. package/lib/index.css +45 -2
  23. package/lib/index.d.ts +5 -5
  24. package/lib/index.js +2 -3
  25. package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +8 -1
  26. package/lib/layouts/blocks/BlocksDisplayComponent.js +46 -4
  27. package/lib/maps/BufferLayer.d.ts +0 -13
  28. package/lib/maps/BufferLayer.js +24 -237
  29. package/lib/maps/BufferLayerDesign.d.ts +1 -1
  30. package/lib/maps/BufferLayerDesignerComponent.d.ts +1 -1
  31. package/lib/maps/BufferLayerDesignerComponent.js +2 -7
  32. package/lib/maps/ChoroplethLayer.d.ts +1 -16
  33. package/lib/maps/ChoroplethLayer.js +25 -358
  34. package/lib/maps/ChoroplethLayerDesign.d.ts +5 -2
  35. package/lib/maps/ChoroplethLayerDesigner.d.ts +10 -32
  36. package/lib/maps/ChoroplethLayerDesigner.js +58 -89
  37. package/lib/maps/ClusterLayer.d.ts +0 -9
  38. package/lib/maps/ClusterLayer.js +0 -250
  39. package/lib/maps/DirectMapDataSource.js +1 -48
  40. package/lib/maps/EditHoverOver.d.ts +4 -3
  41. package/lib/maps/EditHoverOver.js +3 -3
  42. package/lib/maps/GridLayer.d.ts +0 -15
  43. package/lib/maps/GridLayer.js +0 -212
  44. package/lib/maps/HoverContent.js +1 -1
  45. package/lib/maps/Layer.d.ts +1 -26
  46. package/lib/maps/Layer.js +0 -13
  47. package/lib/maps/LeafletMapComponent.js +10 -19
  48. package/lib/maps/MapComponent.d.ts +19 -35
  49. package/lib/maps/MapComponent.js +135 -77
  50. package/lib/maps/MapControlComponent.d.ts +4 -5
  51. package/lib/maps/MapControlComponent.js +5 -12
  52. package/lib/maps/MapDesign.d.ts +8 -0
  53. package/lib/maps/MapDesignerComponent.d.ts +2 -0
  54. package/lib/maps/MapDesignerComponent.js +7 -2
  55. package/lib/maps/MapLayerDataSource.d.ts +0 -4
  56. package/lib/maps/MapLayerViewDesignerComponent.d.ts +3 -1
  57. package/lib/maps/MapLayerViewDesignerComponent.js +5 -1
  58. package/lib/maps/MapLayersDesignerComponent.d.ts +2 -0
  59. package/lib/maps/MapLayersDesignerComponent.js +2 -1
  60. package/lib/maps/MapTranslationsTab.d.ts +15 -0
  61. package/lib/maps/MapTranslationsTab.js +47 -0
  62. package/lib/maps/MapUtils.d.ts +11 -0
  63. package/lib/maps/MapUtils.js +57 -1
  64. package/lib/maps/MapViewComponent.d.ts +1 -1
  65. package/lib/maps/MapViewComponent.js +1 -8
  66. package/lib/maps/MarkersLayer.d.ts +1 -14
  67. package/lib/maps/MarkersLayer.js +89 -254
  68. package/lib/maps/MarkersLayerDesign.d.ts +5 -1
  69. package/lib/maps/MarkersLayerDesignerComponent.d.ts +32 -57
  70. package/lib/maps/MarkersLayerDesignerComponent.js +158 -134
  71. package/lib/maps/ServerMapDataSource.d.ts +0 -1
  72. package/lib/maps/ServerMapDataSource.js +0 -25
  73. package/lib/maps/SwitchableTileUrlLayer.d.ts +0 -2
  74. package/lib/maps/SwitchableTileUrlLayer.js +0 -9
  75. package/lib/maps/TileUrlLayer.d.ts +0 -1
  76. package/lib/maps/TileUrlLayer.js +0 -5
  77. package/lib/maps/VectorMapViewComponent.js +13 -10
  78. package/lib/maps/symbols/font-awesome/asterisk.png +0 -0
  79. package/lib/maps/symbols/font-awesome/ban.png +0 -0
  80. package/lib/maps/symbols/font-awesome/beer.png +0 -0
  81. package/lib/maps/symbols/font-awesome/bell.png +0 -0
  82. package/lib/maps/symbols/font-awesome/bolt.png +0 -0
  83. package/lib/maps/symbols/font-awesome/building.png +0 -0
  84. package/lib/maps/symbols/font-awesome/bullseye.png +0 -0
  85. package/lib/maps/symbols/font-awesome/bus.png +0 -0
  86. package/lib/maps/symbols/font-awesome/caret-up.png +0 -0
  87. package/lib/maps/symbols/font-awesome/certificate.png +0 -0
  88. package/lib/maps/symbols/font-awesome/check-circle.png +0 -0
  89. package/lib/maps/symbols/font-awesome/check.png +0 -0
  90. package/lib/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  91. package/lib/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  92. package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
  93. package/lib/maps/symbols/font-awesome/cloud.png +0 -0
  94. package/lib/maps/symbols/font-awesome/comment.png +0 -0
  95. package/lib/maps/symbols/font-awesome/crosshairs.png +0 -0
  96. package/lib/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  97. package/lib/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  98. package/lib/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  99. package/lib/maps/symbols/font-awesome/female.png +0 -0
  100. package/lib/maps/symbols/font-awesome/file.png +0 -0
  101. package/lib/maps/symbols/font-awesome/flag.png +0 -0
  102. package/lib/maps/symbols/font-awesome/flask.png +0 -0
  103. package/lib/maps/symbols/font-awesome/h-square.png +0 -0
  104. package/lib/maps/symbols/font-awesome/home.png +0 -0
  105. package/lib/maps/symbols/font-awesome/info-circle.png +0 -0
  106. package/lib/maps/symbols/font-awesome/male.png +0 -0
  107. package/lib/maps/symbols/font-awesome/medkit.png +0 -0
  108. package/lib/maps/symbols/font-awesome/mobile.png +0 -0
  109. package/lib/maps/symbols/font-awesome/plus-circle.png +0 -0
  110. package/lib/maps/symbols/font-awesome/plus-square.png +0 -0
  111. package/lib/maps/symbols/font-awesome/plus.png +0 -0
  112. package/lib/maps/symbols/font-awesome/square.png +0 -0
  113. package/lib/maps/symbols/font-awesome/star.png +0 -0
  114. package/lib/maps/symbols/font-awesome/thumbs-down.png +0 -0
  115. package/lib/maps/symbols/font-awesome/thumbs-up.png +0 -0
  116. package/lib/maps/symbols/font-awesome/ticket.png +0 -0
  117. package/lib/maps/symbols/font-awesome/times-circle.png +0 -0
  118. package/lib/maps/symbols/font-awesome/times.png +0 -0
  119. package/lib/maps/symbols/font-awesome/tint.png +0 -0
  120. package/lib/maps/symbols/font-awesome/tree.png +0 -0
  121. package/lib/maps/symbols/font-awesome/university.png +0 -0
  122. package/lib/maps/symbols/font-awesome/usd.png +0 -0
  123. package/lib/maps/symbols/font-awesome/user.png +0 -0
  124. package/lib/maps/symbols/font-awesome/users.png +0 -0
  125. package/lib/maps/symbols/font-awesome/wheelchair.png +0 -0
  126. package/lib/maps/symbols/sdf-ize.sh +93 -0
  127. package/lib/maps/vectorMaps.d.ts +6 -6
  128. package/lib/maps/vectorMaps.js +33 -45
  129. package/lib/mwater_table_selection/IndicatorsListComponent.d.ts +4 -2
  130. package/lib/mwater_table_selection/IndicatorsListComponent.js +103 -34
  131. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.d.ts +18 -0
  132. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.js +80 -0
  133. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.d.ts +26 -0
  134. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.js +237 -51
  135. package/lib/mwater_table_selection/MWaterTableSelectComponent.d.ts +2 -2
  136. package/lib/mwater_table_selection/MWaterTableSelectComponent.js +9 -4
  137. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.d.ts +19 -0
  138. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.js +111 -0
  139. package/lib/quickfilter/QuickfiltersComponent.d.ts +3 -102
  140. package/lib/quickfilter/QuickfiltersComponent.js +53 -110
  141. package/lib/quickfilter/TextLiteralComponent.d.ts +23 -47
  142. package/lib/quickfilter/TextLiteralComponent.js +85 -82
  143. package/lib/widgets/MapWidget.js +6 -3
  144. package/lib/widgets/text/ExprItemEditorComponent.d.ts +3 -8
  145. package/lib/widgets/text/ExprItemEditorComponent.js +36 -33
  146. package/lib/widgets/text/ExprUpdateModalComponent.d.ts +1 -0
  147. package/package.json +3 -4
  148. package/src/ColorComponent.tsx +2 -2
  149. package/src/MWaterContextComponent.tsx +1 -1
  150. package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
  151. package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +17 -18
  152. package/src/TranslationsTabComponent.tsx +429 -0
  153. package/src/UndoStack.ts +14 -6
  154. package/src/dashboards/DashboardComponent.tsx +6 -5
  155. package/src/dashboards/DashboardDesign.ts +1 -1
  156. package/src/dashboards/ServerDashboardDataSource.ts +0 -31
  157. package/src/dashboards/SettingsModalComponent.tsx +27 -383
  158. package/src/datagrids/DatagridComponent.tsx +36 -2
  159. package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
  160. package/src/datagrids/DatagridViewComponent.tsx +44 -7
  161. package/src/datagrids/OrderBysDesignerComponent.tsx +61 -70
  162. package/src/index.css +45 -2
  163. package/src/index.ts +5 -11
  164. package/src/layouts/blocks/BlocksDisplayComponent.tsx +60 -5
  165. package/src/maps/BufferLayer.ts +30 -263
  166. package/src/maps/BufferLayerDesign.ts +1 -1
  167. package/src/maps/BufferLayerDesignerComponent.tsx +2 -7
  168. package/src/maps/ChoroplethLayer.ts +30 -394
  169. package/src/maps/ChoroplethLayerDesign.ts +5 -2
  170. package/src/maps/ChoroplethLayerDesigner.tsx +169 -165
  171. package/src/maps/ClusterLayer.ts +0 -274
  172. package/src/maps/DirectMapDataSource.ts +2 -61
  173. package/src/maps/EditHoverOver.tsx +9 -5
  174. package/src/maps/GridLayer.ts +0 -224
  175. package/src/maps/HoverContent.tsx +1 -1
  176. package/src/maps/Layer.ts +1 -35
  177. package/src/maps/LeafletMapComponent.tsx +10 -19
  178. package/src/maps/MapComponent.tsx +448 -0
  179. package/src/maps/MapControlComponent.tsx +41 -0
  180. package/src/maps/MapDesign.ts +6 -0
  181. package/src/maps/MapDesignerComponent.tsx +18 -1
  182. package/src/maps/MapLayerDataSource.ts +0 -5
  183. package/src/maps/MapLayerViewDesignerComponent.ts +9 -2
  184. package/src/maps/MapLayersDesignerComponent.ts +4 -1
  185. package/src/maps/MapTranslationsTab.tsx +53 -0
  186. package/src/maps/MapUtils.ts +61 -1
  187. package/src/maps/MapViewComponent.tsx +2 -8
  188. package/src/maps/MarkersLayer.ts +101 -275
  189. package/src/maps/MarkersLayerDesign.ts +7 -1
  190. package/src/maps/MarkersLayerDesignerComponent.tsx +436 -0
  191. package/src/maps/ServerMapDataSource.ts +0 -31
  192. package/src/maps/SwitchableTileUrlLayer.tsx +0 -11
  193. package/src/maps/TileUrlLayer.tsx +0 -6
  194. package/src/maps/VectorMapViewComponent.tsx +15 -15
  195. package/src/maps/symbols/font-awesome/asterisk.png +0 -0
  196. package/src/maps/symbols/font-awesome/ban.png +0 -0
  197. package/src/maps/symbols/font-awesome/beer.png +0 -0
  198. package/src/maps/symbols/font-awesome/bell.png +0 -0
  199. package/src/maps/symbols/font-awesome/bolt.png +0 -0
  200. package/src/maps/symbols/font-awesome/building.png +0 -0
  201. package/src/maps/symbols/font-awesome/bullseye.png +0 -0
  202. package/src/maps/symbols/font-awesome/bus.png +0 -0
  203. package/src/maps/symbols/font-awesome/caret-up.png +0 -0
  204. package/src/maps/symbols/font-awesome/certificate.png +0 -0
  205. package/src/maps/symbols/font-awesome/check-circle.png +0 -0
  206. package/src/maps/symbols/font-awesome/check.png +0 -0
  207. package/src/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  208. package/src/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  209. package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
  210. package/src/maps/symbols/font-awesome/cloud.png +0 -0
  211. package/src/maps/symbols/font-awesome/comment.png +0 -0
  212. package/src/maps/symbols/font-awesome/crosshairs.png +0 -0
  213. package/src/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  214. package/src/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  215. package/src/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  216. package/src/maps/symbols/font-awesome/female.png +0 -0
  217. package/src/maps/symbols/font-awesome/file.png +0 -0
  218. package/src/maps/symbols/font-awesome/flag.png +0 -0
  219. package/src/maps/symbols/font-awesome/flask.png +0 -0
  220. package/src/maps/symbols/font-awesome/h-square.png +0 -0
  221. package/src/maps/symbols/font-awesome/home.png +0 -0
  222. package/src/maps/symbols/font-awesome/info-circle.png +0 -0
  223. package/src/maps/symbols/font-awesome/male.png +0 -0
  224. package/src/maps/symbols/font-awesome/medkit.png +0 -0
  225. package/src/maps/symbols/font-awesome/mobile.png +0 -0
  226. package/src/maps/symbols/font-awesome/plus-circle.png +0 -0
  227. package/src/maps/symbols/font-awesome/plus-square.png +0 -0
  228. package/src/maps/symbols/font-awesome/plus.png +0 -0
  229. package/src/maps/symbols/font-awesome/square.png +0 -0
  230. package/src/maps/symbols/font-awesome/star.png +0 -0
  231. package/src/maps/symbols/font-awesome/thumbs-down.png +0 -0
  232. package/src/maps/symbols/font-awesome/thumbs-up.png +0 -0
  233. package/src/maps/symbols/font-awesome/ticket.png +0 -0
  234. package/src/maps/symbols/font-awesome/times-circle.png +0 -0
  235. package/src/maps/symbols/font-awesome/times.png +0 -0
  236. package/src/maps/symbols/font-awesome/tint.png +0 -0
  237. package/src/maps/symbols/font-awesome/tree.png +0 -0
  238. package/src/maps/symbols/font-awesome/university.png +0 -0
  239. package/src/maps/symbols/font-awesome/usd.png +0 -0
  240. package/src/maps/symbols/font-awesome/user.png +0 -0
  241. package/src/maps/symbols/font-awesome/users.png +0 -0
  242. package/src/maps/symbols/font-awesome/wheelchair.png +0 -0
  243. package/src/maps/symbols/sdf-ize.sh +93 -0
  244. package/src/maps/vectorMaps.tsx +32 -53
  245. package/src/mwater_table_selection/IndicatorsListComponent.tsx +165 -37
  246. package/src/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.tsx +111 -0
  247. package/src/mwater_table_selection/MWaterCompleteTableSelectComponent.tsx +373 -37
  248. package/src/mwater_table_selection/MWaterTableSelectComponent.tsx +12 -8
  249. package/src/mwater_table_selection/MWaterWorkflowsSelectComponent.tsx +159 -0
  250. package/src/quickfilter/{QuickfiltersComponent.ts → QuickfiltersComponent.tsx} +165 -158
  251. package/src/quickfilter/TextLiteralComponent.tsx +197 -0
  252. package/src/widgets/MapWidget.tsx +11 -1
  253. package/src/widgets/text/ExprItemEditorComponent.tsx +83 -77
  254. package/src/widgets/text/ExprUpdateModalComponent.tsx +1 -0
  255. package/test/UndoStackTests.ts +52 -1
  256. package/.storybook/config.js +0 -7
  257. package/.storybook/head.html +0 -3
  258. package/.storybook/webpack.config.js +0 -15
  259. package/src/maps/BingLayer.ts +0 -146
  260. package/src/maps/MapComponent.ts +0 -312
  261. package/src/maps/MapControlComponent.ts +0 -46
  262. package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
  263. package/src/maps/RasterMapViewComponent.ts +0 -345
  264. package/src/quickfilter/TextLiteralComponent.ts +0 -165
  265. package/stories/UpdateableComponent.js +0 -29
  266. package/stories/consoles.js +0 -202
  267. package/stories/dashboards.js +0 -217
  268. package/stories/datagridDesign.js +0 -114
  269. package/stories/datagrids.js +0 -69
  270. package/stories/dates.js +0 -80
  271. package/stories/exprcomponent.js +0 -43
  272. package/stories/index.js +0 -18
  273. package/stories/leaflet.js +0 -59
  274. package/stories/maps.js +0 -24
  275. package/stories/pivotChart.js +0 -235
@@ -1,14 +1,14 @@
1
1
  import _ from "lodash"
2
2
  import React, { useMemo } from "react"
3
- const R = React.createElement
4
3
  import { default as ReactSelect } from "react-select"
5
4
  import { languages } from "../languages"
6
5
 
7
- import { DataSource, ExprUtils, LiteralType, Schema } from "@mwater/expressions"
6
+ import { DataSource, Expr, ExprCleaner, ExprUtils, LiteralType, Schema } from "@mwater/expressions"
8
7
  import { ExprValidator } from "@mwater/expressions"
9
8
  import TabbedComponent from "@mwater/react-library/lib/TabbedComponent"
10
9
  import { ExprComponent } from "@mwater/expressions-ui"
11
10
  import { FilterExprComponent } from "@mwater/expressions-ui"
11
+ import SelectExprModalComponent from "@mwater/expressions-ui/lib/SelectExprModalComponent"
12
12
  import OrderBysDesignerComponent from "./OrderBysDesignerComponent"
13
13
  import ReorderableListComponent from "@mwater/react-library/lib/reorderable/ReorderableListComponent"
14
14
  import QuickfiltersDesignComponent from "../quickfilter/QuickfiltersDesignComponent"
@@ -63,114 +63,102 @@ export default class DatagridDesignerComponent extends React.Component<DatagridD
63
63
 
64
64
  // Render the tabs of the designer
65
65
  renderTabs() {
66
- return R(TabbedComponent, {
67
- initialTabId: "columns",
68
- tabs: [
66
+ return <TabbedComponent
67
+ initialTabId="columns"
68
+ tabs={[
69
69
  {
70
70
  id: "columns",
71
71
  label: T`Columns`,
72
- elem: R(ColumnsDesignerComponent, {
73
- schema: this.props.schema,
74
- dataSource: this.props.dataSource,
75
- table: this.props.design.table!,
76
- columns: this.props.design.columns,
77
- onColumnsChange: this.handleColumnsChange
78
- })
72
+ elem: <ColumnsDesignerComponent
73
+ schema={this.props.schema}
74
+ dataSource={this.props.dataSource}
75
+ table={this.props.design.table!}
76
+ columns={this.props.design.columns}
77
+ onColumnsChange={this.handleColumnsChange}
78
+ />
79
79
  },
80
80
  {
81
81
  id: "filter",
82
82
  label: T`Filter`,
83
83
  // Here because of modal scroll issue
84
- elem: R(
85
- "div",
86
- { style: { marginBottom: 200 } },
87
- R(FilterExprComponent, {
88
- schema: this.props.schema,
89
- dataSource: this.props.dataSource,
90
- table: this.props.design.table!,
91
- value: this.props.design.filter,
92
- onChange: this.handleFilterChange
93
- }),
84
+ elem: <div style={{ marginBottom: 200 }}>
85
+ <FilterExprComponent
86
+ schema={this.props.schema}
87
+ dataSource={this.props.dataSource}
88
+ table={this.props.design.table!}
89
+ value={this.props.design.filter}
90
+ onChange={this.handleFilterChange}
91
+ />
94
92
  <GlobalFiltersElementFactoryContext.Consumer>
95
93
  {(globalFiltersElementFactory) =>
96
94
  globalFiltersElementFactory
97
- ? R(
98
- "div",
99
- { style: { marginTop: 20 } },
100
- globalFiltersElementFactory({
95
+ ? <div style={{ marginTop: 20 }}>
96
+ {globalFiltersElementFactory({
101
97
  schema: this.props.schema,
102
98
  dataSource: this.props.dataSource,
103
99
  filterableTables: [this.props.design.table!],
104
100
  globalFilters: this.props.design.globalFilters,
105
101
  onChange: this.handleGlobalFiltersChange,
106
102
  nullIfIrrelevant: true
107
- })
108
- )
103
+ })}
104
+ </div>
109
105
  : undefined
110
106
  }
111
107
  </GlobalFiltersElementFactoryContext.Consumer>
112
- )
108
+ </div>
113
109
  },
114
110
  {
115
111
  id: "order",
116
112
  label: T`Sorting`,
117
- elem: R(
118
- "div",
119
- { style: { marginBottom: 200 } },
120
- R(OrderBysDesignerComponent, {
121
- schema: this.props.schema,
122
- dataSource: this.props.dataSource,
123
- table: this.props.design.table!,
124
- orderBys: this.props.design.orderBys,
125
- onChange: this.handleOrderBysChange
126
- })
127
- )
113
+ elem: <div style={{ marginBottom: 200 }}>
114
+ <OrderBysDesignerComponent
115
+ schema={this.props.schema}
116
+ dataSource={this.props.dataSource}
117
+ table={this.props.design.table!}
118
+ orderBys={this.props.design.orderBys}
119
+ onChange={this.handleOrderBysChange}
120
+ />
121
+ </div>
128
122
  },
129
123
  {
130
124
  id: "quickfilters",
131
125
  label: T`Quickfilters`,
132
- elem: R(
133
- "div",
134
- { style: { marginBottom: 200 } },
135
- R(QuickfiltersDesignComponent, {
136
- design: this.props.design.quickfilters || [],
137
- onDesignChange: (design: any) =>
138
- this.props.onDesignChange(update(this.props.design, { quickfilters: { $set: design } })),
139
- schema: this.props.schema,
140
- dataSource: this.props.dataSource,
141
- tables: [this.props.design.table!]
142
- })
143
- )
126
+ elem: <div style={{ marginBottom: 200 }}>
127
+ <QuickfiltersDesignComponent
128
+ design={this.props.design.quickfilters || []}
129
+ onDesignChange={(design: any) =>
130
+ this.props.onDesignChange(update(this.props.design, { quickfilters: { $set: design } }))}
131
+ schema={this.props.schema}
132
+ dataSource={this.props.dataSource}
133
+ tables={[this.props.design.table!]}
134
+ />
135
+ </div>
144
136
  },
145
137
  {
146
138
  id: "options",
147
139
  label: T`Options`,
148
- elem: R(
149
- "div",
150
- { style: { marginBottom: 200 } },
151
- R(DatagridOptionsComponent, {
152
- design: this.props.design,
153
- onDesignChange: this.props.onDesignChange
154
- })
155
- )
140
+ elem: <div style={{ marginBottom: 200 }}>
141
+ <DatagridOptionsComponent
142
+ design={this.props.design}
143
+ onDesignChange={this.props.onDesignChange}
144
+ />
145
+ </div>
156
146
  }
157
- ]
158
- })
147
+ ]}
148
+ />
159
149
  }
160
150
 
161
151
  render() {
162
- return R(
163
- "div",
164
- null,
165
- R("label", null, T`Data Source:`),
166
- R(TableSelectComponent, {
167
- schema: this.props.schema,
168
- value: this.props.design.table,
169
- onChange: this.handleTableChange
170
- }),
171
-
172
- this.props.design.table ? this.renderTabs() : undefined
173
- )
152
+ return <div>
153
+ <label>{T`Data Source:`}</label>
154
+ <TableSelectComponent
155
+ schema={this.props.schema}
156
+ value={this.props.design.table}
157
+ onChange={this.handleTableChange}
158
+ />
159
+
160
+ {this.props.design.table ? this.renderTabs() : undefined}
161
+ </div>
174
162
  }
175
163
  }
176
164
 
@@ -225,13 +213,17 @@ interface ColumnsDesignerComponentProps {
225
213
  dataSource: DataSource
226
214
  table: string
227
215
  /** Columns list See README.md of this folder */
228
- columns: any
229
- onColumnsChange: any
216
+ columns: DatagridDesignColumn[]
217
+ onColumnsChange: (columns: DatagridDesignColumn[]) => void
230
218
  }
231
219
 
232
220
  // Columns list
233
221
  class ColumnsDesignerComponent extends React.Component<ColumnsDesignerComponentProps> {
234
- handleColumnChange = (columnIndex: any, column: any) => {
222
+ state = {
223
+ showSelectExprModal: false
224
+ }
225
+
226
+ handleColumnChange = (columnIndex: number, column: null | DatagridDesignColumn | DatagridDesignColumn[]) => {
235
227
  const columns = this.props.columns.slice()
236
228
 
237
229
  // Handle remove
@@ -239,7 +231,7 @@ class ColumnsDesignerComponent extends React.Component<ColumnsDesignerComponentP
239
231
  columns.splice(columnIndex, 1)
240
232
  } else if (_.isArray(column)) {
241
233
  // Handle array case
242
- Array.prototype.splice.apply(columns, [columnIndex, 1].concat(column))
234
+ columns.splice(columnIndex, 1, ...column)
243
235
  } else {
244
236
  columns[columnIndex] = column
245
237
  }
@@ -248,9 +240,31 @@ class ColumnsDesignerComponent extends React.Component<ColumnsDesignerComponentP
248
240
  }
249
241
 
250
242
  handleAddColumn = () => {
243
+ this.setState({ showSelectExprModal: true })
244
+ }
245
+
246
+ handleExprSelect = (expr: Expr) => {
247
+ // Clean the expression first
248
+ const exprCleaner = new ExprCleaner(this.props.schema)
249
+ const cleanedExpr = exprCleaner.cleanExpr(expr, {
250
+ aggrStatuses: ["individual", "literal", "aggregate"]
251
+ })
252
+
253
+ const exprUtils = new ExprUtils(this.props.schema)
251
254
  const columns = this.props.columns.slice()
252
- columns.push({ id: uuid(), type: "expr", width: 150 })
253
- return this.props.onColumnsChange(columns)
255
+ columns.push({
256
+ id: uuid(),
257
+ type: "expr",
258
+ width: 150,
259
+ expr: cleanedExpr,
260
+ label: exprUtils.summarizeExpr(cleanedExpr).slice(0, 30)
261
+ })
262
+ this.props.onColumnsChange(columns)
263
+ this.setState({ showSelectExprModal: false })
264
+ }
265
+
266
+ handleExprCancel = () => {
267
+ this.setState({ showSelectExprModal: false })
254
268
  }
255
269
 
256
270
  handleAddIdColumn = () => {
@@ -272,13 +286,13 @@ class ColumnsDesignerComponent extends React.Component<ColumnsDesignerComponentP
272
286
  headerFormat: "text"
273
287
  })
274
288
 
275
- let columns = []
289
+ let columns: DatagridDesignColumn[] = []
276
290
  for (let labeledExpr of labeledExprs) {
277
291
  columns.push({
278
292
  id: uuid(),
279
293
  width: 150,
280
294
  type: "expr",
281
- label: null, // Use default label instead. # labeledExpr.label
295
+ label: undefined, // Use default label instead. # labeledExpr.label
282
296
  expr: labeledExpr.expr
283
297
  })
284
298
  }
@@ -298,85 +312,101 @@ class ColumnsDesignerComponent extends React.Component<ColumnsDesignerComponentP
298
312
  connectDragPreview: any,
299
313
  connectDropTarget: any
300
314
  ) => {
301
- return R(ColumnDesignerComponent, {
302
- key: columnIndex,
303
- schema: this.props.schema,
304
- table: this.props.table,
305
- dataSource: this.props.dataSource,
306
- column,
307
- onColumnChange: this.handleColumnChange.bind(null, columnIndex),
308
- connectDragSource,
309
- connectDragPreview,
310
- connectDropTarget
311
- })
315
+ return <ColumnDesignerComponent
316
+ key={columnIndex}
317
+ schema={this.props.schema}
318
+ table={this.props.table}
319
+ dataSource={this.props.dataSource}
320
+ column={column}
321
+ onColumnChange={this.handleColumnChange.bind(null, columnIndex)}
322
+ connectDragSource={connectDragSource}
323
+ connectDragPreview={connectDragPreview}
324
+ connectDropTarget={connectDropTarget}
325
+ />
312
326
  }
313
327
 
314
328
  render() {
315
- return R(
316
- "div",
317
- { style: { height: "auto", overflowY: "auto", overflowX: "hidden" } },
318
- R(
319
- "div",
320
- { style: { textAlign: "right" }, key: "options" },
321
- R(
322
- "button",
323
- {
324
- key: "addAll",
325
- type: "button",
326
- className: "btn btn-link btn-sm",
327
- onClick: this.handleAddDefaultColumns
328
- },
329
- R("span", { className: "fas fa-plus" }),
330
- " " + T`Add Default Columns`
331
- ),
332
- R(
333
- "button",
334
- {
335
- key: "removeAll",
336
- type: "button",
337
- className: "btn btn-link btn-sm",
338
- onClick: this.handleRemoveAllColumns
339
- },
340
- R("span", { className: "fas fa-times" }),
341
- " " + T`Remove All Columns`
342
- )
343
- ),
344
-
345
- R(ReorderableListComponent, {
346
- items: this.props.columns,
347
- onReorder: this.props.onColumnsChange,
348
- renderItem: this.renderColumn,
349
- getItemId: (item: DatagridDesignColumn) => item.id
350
- }),
351
-
352
- R("div", { className: "p-2" },
353
- R(
354
- "button",
355
- {
356
- key: "add",
357
- type: "button",
358
- className: "btn btn-link",
359
- onClick: this.handleAddColumn
360
- },
361
- R("span", { className: "fas fa-plus" }),
362
- " " + T`Add Column`
363
- ),
364
-
365
- R(
366
- "button",
367
- {
368
- key: "add-id",
369
- type: "button",
370
- className: "btn btn-link",
371
- onClick: this.handleAddIdColumn
372
- },
373
- R("span", { className: "fas fa-plus" }),
374
- " " + T`Add Unique Id (advanced)`
375
- )
376
- )
377
- )
329
+ return <div style={{ height: "auto", overflowY: "auto", overflowX: "hidden" }}>
330
+ <div style={{ textAlign: "right" }} key="options">
331
+ <button
332
+ key="addAll"
333
+ type="button"
334
+ className="btn btn-link btn-sm"
335
+ onClick={this.handleAddDefaultColumns}
336
+ >
337
+ <span className="fas fa-plus" />
338
+ {" " + T`Add Default Columns`}
339
+ </button>
340
+ <button
341
+ key="removeAll"
342
+ type="button"
343
+ className="btn btn-link btn-sm"
344
+ onClick={this.handleRemoveAllColumns}
345
+ >
346
+ <span className="fas fa-times" />
347
+ {" " + T`Remove All Columns`}
348
+ </button>
349
+ </div>
350
+
351
+ <ReorderableListComponent
352
+ items={this.props.columns}
353
+ onReorder={this.props.onColumnsChange}
354
+ renderItem={this.renderColumn}
355
+ getItemId={(item: DatagridDesignColumn) => item.id}
356
+ />
357
+
358
+ <div className="p-2">
359
+ <button
360
+ key="add"
361
+ type="button"
362
+ className="btn btn-link"
363
+ onClick={this.handleAddColumn}
364
+ >
365
+ <span className="fas fa-plus" />
366
+ {" " + T`Add Column`}
367
+ </button>
368
+
369
+ <button
370
+ key="add-id"
371
+ type="button"
372
+ className="btn btn-link"
373
+ onClick={this.handleAddIdColumn}
374
+ >
375
+ <span className="fas fa-plus" />
376
+ {" " + T`Add Unique Id (advanced)`}
377
+ </button>
378
+ </div>
379
+
380
+ {this.state.showSelectExprModal && (
381
+ <SelectExprModalComponent
382
+ schema={this.props.schema}
383
+ dataSource={this.props.dataSource}
384
+ table={this.props.table}
385
+ value={null}
386
+ allowCase
387
+ onSelect={this.handleExprSelect}
388
+ onCancel={this.handleExprCancel}
389
+ types={[
390
+ "text",
391
+ "number",
392
+ "enum",
393
+ "enumset",
394
+ "boolean",
395
+ "date",
396
+ "datetime",
397
+ "image",
398
+ "imagelist",
399
+ "text[]",
400
+ "geometry",
401
+ "id"
402
+ ]}
403
+ aggrStatuses={["literal", "individual", "aggregate"]}
404
+ />
405
+ )}
406
+ </div>
378
407
  }
379
408
  }
409
+
380
410
  interface ColumnDesignerComponentProps {
381
411
  /** schema to use */
382
412
  schema: Schema
@@ -464,20 +494,16 @@ class ColumnDesignerComponent extends React.Component<ColumnDesignerComponentPro
464
494
 
465
495
  switch (exprType) {
466
496
  case "enumset":
467
- return R(
468
- "a",
469
- { className: "btn btn-sm btn-link", onClick: this.handleSplitEnumset },
470
- R("i", { className: "fa fa-chain-broken" }),
471
- " " + T`Split by options`
472
- )
497
+ return <a className="btn btn-sm btn-link" onClick={this.handleSplitEnumset}>
498
+ <i className="fa fa-chain-broken" />
499
+ {" " + T`Split by options`}
500
+ </a>
473
501
  break
474
502
  case "geometry":
475
- return R(
476
- "a",
477
- { className: "btn btn-sm btn-link", onClick: this.handleSplitGeometry },
478
- R("i", { className: "fa fa-chain-broken" }),
479
- " " + T`Split by lat/lng`
480
- )
503
+ return <a className="btn btn-sm btn-link" onClick={this.handleSplitGeometry}>
504
+ <i className="fa fa-chain-broken" />
505
+ {" " + T`Split by lat/lng`}
506
+ </a>
481
507
  break
482
508
  }
483
509
 
@@ -496,22 +522,18 @@ class ColumnDesignerComponent extends React.Component<ColumnDesignerComponentPro
496
522
  return null
497
523
  }
498
524
 
499
- return R(
500
- "div",
501
- { className: "mb-3" },
502
- R("label", { className: "text-muted" }, T`Format`),
503
- ": ",
504
- R(
505
- "select",
506
- {
507
- value: this.props.column.format != null ? this.props.column.format : getDefaultFormat(exprType),
508
- className: "form-select",
509
- style: { width: "auto", display: "inline-block" },
510
- onChange: this.handleFormatChange
511
- },
512
- _.map(formats, (format) => R("option", { key: format.value, value: format.value }, format.label))
513
- )
514
- )
525
+ return <div className="mb-3">
526
+ <label className="text-muted">{T`Format`}</label>
527
+ {": "}
528
+ <select
529
+ value={this.props.column.format != null ? this.props.column.format : getDefaultFormat(exprType)}
530
+ className="form-select"
531
+ style={{ width: "auto", display: "inline-block" }}
532
+ onChange={this.handleFormatChange}
533
+ >
534
+ {_.map(formats, (format) => <option key={format.value} value={format.value}>{format.label}</option>)}
535
+ </select>
536
+ </div>
515
537
  }
516
538
 
517
539
  render = () => {
@@ -545,52 +567,42 @@ class ColumnDesignerComponent extends React.Component<ColumnDesignerComponentPro
545
567
  aggrStatuses: ["individual", "literal", "aggregate"]
546
568
  })
547
569
 
548
- const elem = R(
549
- "div",
550
- { className: "row" },
551
- R("div", { className: "col-1" }, this.props.connectDragSource(R("span", { className: "text-muted fa fa-bars _mviz-move" }))),
552
-
553
- R(
554
- "div",
555
- { className: "col-6" }, // style: { border: "solid 1px #DDD", padding: 4 },
556
- R(ExprComponent, {
557
- schema: this.props.schema,
558
- dataSource: this.props.dataSource,
559
- table: this.props.table,
560
- value: this.props.column.expr,
561
- aggrStatuses: ["literal", "individual", "aggregate"],
562
- types: allowedTypes,
563
- onChange: this.handleExprChange
564
- }),
565
- this.renderSplit(),
566
- this.renderFormat(),
567
- error ? <span className="text-danger">
570
+ const elem = <div className="row">
571
+ <div className="col-1">{this.props.connectDragSource(<span className="text-muted fa fa-bars mwater-visualization-cursor-hover" />)}</div>
572
+
573
+ <div className="col-6">
574
+ <ExprComponent
575
+ schema={this.props.schema}
576
+ dataSource={this.props.dataSource}
577
+ table={this.props.table}
578
+ value={this.props.column.expr}
579
+ aggrStatuses={["literal", "individual", "aggregate"]}
580
+ types={allowedTypes}
581
+ onChange={this.handleExprChange}
582
+ />
583
+ {this.renderSplit()}
584
+ {this.renderFormat()}
585
+ {error ? <span className="text-danger">
568
586
  <i className="fa fa-exclamation-circle" /> {error}
569
- </span> : undefined
570
- ),
571
-
572
- R(
573
- "div",
574
- { className: "col-4" },
575
- R("input", {
576
- type: "text",
577
- className: "form-control",
578
- placeholder: exprUtils.summarizeExpr(this.props.column.expr),
579
- value: this.props.column.label,
580
- onChange: (ev: any) => this.handleLabelChange(ev.target.value)
581
- })
582
- ),
583
-
584
- R(
585
- "div",
586
- { className: "col-1" },
587
- R(
588
- "a",
589
- { className: "link-plain", onClick: this.props.onColumnChange.bind(null, null) },
590
- R("span", { className: "fas fa-times" })
591
- )
592
- )
593
- )
587
+ </span> : undefined}
588
+ </div>
589
+
590
+ <div className="col-4">
591
+ <input
592
+ type="text"
593
+ className="form-control"
594
+ placeholder={exprUtils.summarizeExpr(this.props.column.expr)}
595
+ value={this.props.column.label}
596
+ onChange={(ev: any) => this.handleLabelChange(ev.target.value)}
597
+ />
598
+ </div>
599
+
600
+ <div className="col-1">
601
+ <a className="link-plain" onClick={this.props.onColumnChange.bind(null, null)}>
602
+ <span className="fas fa-times" />
603
+ </a>
604
+ </div>
605
+ </div>
594
606
 
595
607
  return this.props.connectDropTarget(this.props.connectDragPreview(elem))
596
608
  }