@mwater/visualization 5.5.0 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/lib/MWaterContextComponent.d.ts +1 -1
  2. package/lib/MWaterGlobalFiltersComponent.d.ts +2 -2
  3. package/lib/MWaterGlobalFiltersComponent.js +11 -20
  4. package/lib/MWaterLoaderComponent.d.ts +4 -13
  5. package/lib/MWaterLoaderComponent.js +2 -11
  6. package/lib/UndoStack.d.ts +2 -1
  7. package/lib/UndoStack.js +12 -6
  8. package/lib/dashboards/DashboardComponent.js +5 -4
  9. package/lib/dashboards/DashboardDesign.d.ts +1 -1
  10. package/lib/dashboards/ServerDashboardDataSource.js +0 -10
  11. package/lib/dashboards/SettingsModalComponent.js +1 -1
  12. package/lib/datagrids/DatagridComponent.js +22 -2
  13. package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -3
  14. package/lib/datagrids/DatagridDesignerComponent.js +108 -120
  15. package/lib/datagrids/DatagridViewComponent.js +3 -2
  16. package/lib/datagrids/OrderBysDesignerComponent.d.ts +7 -7
  17. package/lib/datagrids/OrderBysDesignerComponent.js +19 -28
  18. package/lib/index.css +45 -2
  19. package/lib/index.d.ts +5 -5
  20. package/lib/index.js +2 -3
  21. package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +8 -1
  22. package/lib/layouts/blocks/BlocksDisplayComponent.js +46 -4
  23. package/lib/maps/BufferLayer.js +12 -0
  24. package/lib/maps/BufferLayerDesign.d.ts +1 -1
  25. package/lib/maps/BufferLayerDesignerComponent.js +2 -2
  26. package/lib/maps/ChoroplethLayer.js +12 -0
  27. package/lib/maps/ChoroplethLayerDesign.d.ts +5 -2
  28. package/lib/maps/ChoroplethLayerDesigner.d.ts +10 -32
  29. package/lib/maps/ChoroplethLayerDesigner.js +58 -89
  30. package/lib/maps/DirectMapDataSource.js +0 -10
  31. package/lib/maps/EditHoverOver.d.ts +4 -3
  32. package/lib/maps/EditHoverOver.js +3 -3
  33. package/lib/maps/HoverContent.js +1 -1
  34. package/lib/maps/LeafletMapComponent.js +10 -19
  35. package/lib/maps/MapComponent.js +0 -1
  36. package/lib/maps/MapUtils.js +10 -1
  37. package/lib/maps/MarkersLayer.js +18 -2
  38. package/lib/maps/MarkersLayerDesign.d.ts +1 -1
  39. package/lib/maps/MarkersLayerDesignerComponent.d.ts +12 -41
  40. package/lib/maps/MarkersLayerDesignerComponent.js +81 -111
  41. package/lib/maps/ServerMapDataSource.js +0 -10
  42. package/lib/maps/VectorMapViewComponent.js +1 -9
  43. package/lib/maps/symbols/font-awesome/asterisk.png +0 -0
  44. package/lib/maps/symbols/font-awesome/ban.png +0 -0
  45. package/lib/maps/symbols/font-awesome/beer.png +0 -0
  46. package/lib/maps/symbols/font-awesome/bell.png +0 -0
  47. package/lib/maps/symbols/font-awesome/bolt.png +0 -0
  48. package/lib/maps/symbols/font-awesome/building.png +0 -0
  49. package/lib/maps/symbols/font-awesome/bullseye.png +0 -0
  50. package/lib/maps/symbols/font-awesome/bus.png +0 -0
  51. package/lib/maps/symbols/font-awesome/caret-up.png +0 -0
  52. package/lib/maps/symbols/font-awesome/certificate.png +0 -0
  53. package/lib/maps/symbols/font-awesome/check-circle.png +0 -0
  54. package/lib/maps/symbols/font-awesome/check.png +0 -0
  55. package/lib/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  56. package/lib/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  57. package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
  58. package/lib/maps/symbols/font-awesome/cloud.png +0 -0
  59. package/lib/maps/symbols/font-awesome/comment.png +0 -0
  60. package/lib/maps/symbols/font-awesome/crosshairs.png +0 -0
  61. package/lib/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  62. package/lib/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  63. package/lib/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  64. package/lib/maps/symbols/font-awesome/female.png +0 -0
  65. package/lib/maps/symbols/font-awesome/file.png +0 -0
  66. package/lib/maps/symbols/font-awesome/flag.png +0 -0
  67. package/lib/maps/symbols/font-awesome/flask.png +0 -0
  68. package/lib/maps/symbols/font-awesome/h-square.png +0 -0
  69. package/lib/maps/symbols/font-awesome/home.png +0 -0
  70. package/lib/maps/symbols/font-awesome/info-circle.png +0 -0
  71. package/lib/maps/symbols/font-awesome/male.png +0 -0
  72. package/lib/maps/symbols/font-awesome/medkit.png +0 -0
  73. package/lib/maps/symbols/font-awesome/mobile.png +0 -0
  74. package/lib/maps/symbols/font-awesome/plus-circle.png +0 -0
  75. package/lib/maps/symbols/font-awesome/plus-square.png +0 -0
  76. package/lib/maps/symbols/font-awesome/plus.png +0 -0
  77. package/lib/maps/symbols/font-awesome/square.png +0 -0
  78. package/lib/maps/symbols/font-awesome/star.png +0 -0
  79. package/lib/maps/symbols/font-awesome/thumbs-down.png +0 -0
  80. package/lib/maps/symbols/font-awesome/thumbs-up.png +0 -0
  81. package/lib/maps/symbols/font-awesome/ticket.png +0 -0
  82. package/lib/maps/symbols/font-awesome/times-circle.png +0 -0
  83. package/lib/maps/symbols/font-awesome/times.png +0 -0
  84. package/lib/maps/symbols/font-awesome/tint.png +0 -0
  85. package/lib/maps/symbols/font-awesome/tree.png +0 -0
  86. package/lib/maps/symbols/font-awesome/university.png +0 -0
  87. package/lib/maps/symbols/font-awesome/usd.png +0 -0
  88. package/lib/maps/symbols/font-awesome/user.png +0 -0
  89. package/lib/maps/symbols/font-awesome/users.png +0 -0
  90. package/lib/maps/symbols/font-awesome/wheelchair.png +0 -0
  91. package/lib/maps/symbols/sdf-ize.sh +93 -0
  92. package/lib/maps/vectorMaps.d.ts +1 -0
  93. package/lib/maps/vectorMaps.js +20 -36
  94. package/lib/mwater_table_selection/IndicatorsListComponent.d.ts +4 -2
  95. package/lib/mwater_table_selection/IndicatorsListComponent.js +103 -34
  96. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.d.ts +18 -0
  97. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.js +80 -0
  98. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.d.ts +26 -0
  99. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.js +237 -51
  100. package/lib/mwater_table_selection/MWaterTableSelectComponent.d.ts +2 -2
  101. package/lib/mwater_table_selection/MWaterTableSelectComponent.js +9 -4
  102. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.d.ts +19 -0
  103. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.js +111 -0
  104. package/lib/quickfilter/QuickfiltersComponent.d.ts +3 -102
  105. package/lib/quickfilter/QuickfiltersComponent.js +53 -110
  106. package/lib/quickfilter/TextLiteralComponent.d.ts +23 -47
  107. package/lib/quickfilter/TextLiteralComponent.js +85 -82
  108. package/lib/widgets/MapWidget.js +4 -2
  109. package/lib/widgets/text/ExprItemEditorComponent.d.ts +3 -8
  110. package/lib/widgets/text/ExprItemEditorComponent.js +36 -33
  111. package/lib/widgets/text/ExprUpdateModalComponent.d.ts +1 -0
  112. package/package.json +2 -3
  113. package/src/MWaterContextComponent.tsx +1 -1
  114. package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
  115. package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +17 -18
  116. package/src/UndoStack.ts +14 -6
  117. package/src/dashboards/DashboardComponent.tsx +5 -4
  118. package/src/dashboards/DashboardDesign.ts +1 -1
  119. package/src/dashboards/ServerDashboardDataSource.ts +0 -12
  120. package/src/dashboards/SettingsModalComponent.tsx +1 -1
  121. package/src/datagrids/DatagridComponent.tsx +30 -2
  122. package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
  123. package/src/datagrids/DatagridViewComponent.tsx +3 -2
  124. package/src/datagrids/OrderBysDesignerComponent.tsx +61 -70
  125. package/src/index.css +45 -2
  126. package/src/index.ts +5 -11
  127. package/src/layouts/blocks/BlocksDisplayComponent.tsx +60 -5
  128. package/src/maps/BufferLayer.ts +14 -1
  129. package/src/maps/BufferLayerDesign.ts +1 -1
  130. package/src/maps/BufferLayerDesignerComponent.tsx +2 -1
  131. package/src/maps/ChoroplethLayer.ts +20 -7
  132. package/src/maps/ChoroplethLayerDesign.ts +5 -2
  133. package/src/maps/ChoroplethLayerDesigner.tsx +169 -165
  134. package/src/maps/DirectMapDataSource.ts +0 -12
  135. package/src/maps/EditHoverOver.tsx +9 -5
  136. package/src/maps/HoverContent.tsx +1 -1
  137. package/src/maps/LeafletMapComponent.tsx +10 -19
  138. package/src/maps/MapComponent.ts +0 -1
  139. package/src/maps/MapUtils.ts +13 -1
  140. package/src/maps/MarkersLayer.ts +22 -5
  141. package/src/maps/MarkersLayerDesign.ts +1 -1
  142. package/src/maps/MarkersLayerDesignerComponent.tsx +360 -0
  143. package/src/maps/ServerMapDataSource.ts +0 -12
  144. package/src/maps/VectorMapViewComponent.tsx +2 -13
  145. package/src/maps/symbols/font-awesome/asterisk.png +0 -0
  146. package/src/maps/symbols/font-awesome/ban.png +0 -0
  147. package/src/maps/symbols/font-awesome/beer.png +0 -0
  148. package/src/maps/symbols/font-awesome/bell.png +0 -0
  149. package/src/maps/symbols/font-awesome/bolt.png +0 -0
  150. package/src/maps/symbols/font-awesome/building.png +0 -0
  151. package/src/maps/symbols/font-awesome/bullseye.png +0 -0
  152. package/src/maps/symbols/font-awesome/bus.png +0 -0
  153. package/src/maps/symbols/font-awesome/caret-up.png +0 -0
  154. package/src/maps/symbols/font-awesome/certificate.png +0 -0
  155. package/src/maps/symbols/font-awesome/check-circle.png +0 -0
  156. package/src/maps/symbols/font-awesome/check.png +0 -0
  157. package/src/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  158. package/src/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  159. package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
  160. package/src/maps/symbols/font-awesome/cloud.png +0 -0
  161. package/src/maps/symbols/font-awesome/comment.png +0 -0
  162. package/src/maps/symbols/font-awesome/crosshairs.png +0 -0
  163. package/src/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  164. package/src/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  165. package/src/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  166. package/src/maps/symbols/font-awesome/female.png +0 -0
  167. package/src/maps/symbols/font-awesome/file.png +0 -0
  168. package/src/maps/symbols/font-awesome/flag.png +0 -0
  169. package/src/maps/symbols/font-awesome/flask.png +0 -0
  170. package/src/maps/symbols/font-awesome/h-square.png +0 -0
  171. package/src/maps/symbols/font-awesome/home.png +0 -0
  172. package/src/maps/symbols/font-awesome/info-circle.png +0 -0
  173. package/src/maps/symbols/font-awesome/male.png +0 -0
  174. package/src/maps/symbols/font-awesome/medkit.png +0 -0
  175. package/src/maps/symbols/font-awesome/mobile.png +0 -0
  176. package/src/maps/symbols/font-awesome/plus-circle.png +0 -0
  177. package/src/maps/symbols/font-awesome/plus-square.png +0 -0
  178. package/src/maps/symbols/font-awesome/plus.png +0 -0
  179. package/src/maps/symbols/font-awesome/square.png +0 -0
  180. package/src/maps/symbols/font-awesome/star.png +0 -0
  181. package/src/maps/symbols/font-awesome/thumbs-down.png +0 -0
  182. package/src/maps/symbols/font-awesome/thumbs-up.png +0 -0
  183. package/src/maps/symbols/font-awesome/ticket.png +0 -0
  184. package/src/maps/symbols/font-awesome/times-circle.png +0 -0
  185. package/src/maps/symbols/font-awesome/times.png +0 -0
  186. package/src/maps/symbols/font-awesome/tint.png +0 -0
  187. package/src/maps/symbols/font-awesome/tree.png +0 -0
  188. package/src/maps/symbols/font-awesome/university.png +0 -0
  189. package/src/maps/symbols/font-awesome/usd.png +0 -0
  190. package/src/maps/symbols/font-awesome/user.png +0 -0
  191. package/src/maps/symbols/font-awesome/users.png +0 -0
  192. package/src/maps/symbols/font-awesome/wheelchair.png +0 -0
  193. package/src/maps/symbols/sdf-ize.sh +93 -0
  194. package/src/maps/vectorMaps.tsx +20 -44
  195. package/src/mwater_table_selection/IndicatorsListComponent.tsx +165 -37
  196. package/src/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.tsx +111 -0
  197. package/src/mwater_table_selection/MWaterCompleteTableSelectComponent.tsx +373 -37
  198. package/src/mwater_table_selection/MWaterTableSelectComponent.tsx +12 -8
  199. package/src/mwater_table_selection/MWaterWorkflowsSelectComponent.tsx +159 -0
  200. package/src/quickfilter/{QuickfiltersComponent.ts → QuickfiltersComponent.tsx} +165 -158
  201. package/src/quickfilter/TextLiteralComponent.tsx +197 -0
  202. package/src/widgets/MapWidget.tsx +9 -1
  203. package/src/widgets/text/ExprItemEditorComponent.tsx +83 -77
  204. package/src/widgets/text/ExprUpdateModalComponent.tsx +1 -0
  205. package/test/UndoStackTests.ts +52 -1
  206. package/.storybook/config.js +0 -7
  207. package/.storybook/head.html +0 -3
  208. package/.storybook/webpack.config.js +0 -15
  209. package/src/maps/BingLayer.ts +0 -146
  210. package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
  211. package/src/quickfilter/TextLiteralComponent.ts +0 -165
  212. package/stories/UpdateableComponent.js +0 -29
  213. package/stories/consoles.js +0 -202
  214. package/stories/dashboards.js +0 -217
  215. package/stories/datagridDesign.js +0 -114
  216. package/stories/datagrids.js +0 -69
  217. package/stories/dates.js +0 -80
  218. package/stories/exprcomponent.js +0 -43
  219. package/stories/index.js +0 -18
  220. package/stories/leaflet.js +0 -59
  221. package/stories/maps.js +0 -24
  222. 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
  }
@@ -224,7 +224,6 @@ const DatagridViewComponent = forwardRef<DatagridViewComponentRef, DatagridViewC
224
224
  })
225
225
 
226
226
  function reload() {
227
- console.log("reload")
228
227
  setRows([])
229
228
  setEntirelyLoaded(false)
230
229
  }
@@ -437,7 +436,9 @@ const DatagridViewComponent = forwardRef<DatagridViewComponentRef, DatagridViewC
437
436
  fontWeight: "bold",
438
437
  height: "100%",
439
438
  display: "flex",
440
- alignItems: "center"
439
+ alignItems: "center",
440
+ overflow: "hidden",
441
+ width: options.width
441
442
  }}>
442
443
  {column.label || exprUtils.summarizeExpr(column.expr, props.design.locale)}
443
444
  </div>