@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
@@ -28,7 +28,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const lodash_1 = __importDefault(require("lodash"));
30
30
  const react_1 = __importStar(require("react"));
31
- const R = react_1.default.createElement;
32
31
  const react_select_1 = __importDefault(require("react-select"));
33
32
  const languages_1 = require("../languages");
34
33
  const expressions_1 = require("@mwater/expressions");
@@ -36,6 +35,7 @@ const expressions_2 = require("@mwater/expressions");
36
35
  const TabbedComponent_1 = __importDefault(require("@mwater/react-library/lib/TabbedComponent"));
37
36
  const expressions_ui_1 = require("@mwater/expressions-ui");
38
37
  const expressions_ui_2 = require("@mwater/expressions-ui");
38
+ const SelectExprModalComponent_1 = __importDefault(require("@mwater/expressions-ui/lib/SelectExprModalComponent"));
39
39
  const OrderBysDesignerComponent_1 = __importDefault(require("./OrderBysDesignerComponent"));
40
40
  const ReorderableListComponent_1 = __importDefault(require("@mwater/react-library/lib/reorderable/ReorderableListComponent"));
41
41
  const QuickfiltersDesignComponent_1 = __importDefault(require("../quickfilter/QuickfiltersDesignComponent"));
@@ -70,80 +70,54 @@ class DatagridDesignerComponent extends react_1.default.Component {
70
70
  };
71
71
  // Render the tabs of the designer
72
72
  renderTabs() {
73
- return R(TabbedComponent_1.default, {
74
- initialTabId: "columns",
75
- tabs: [
73
+ return react_1.default.createElement(TabbedComponent_1.default, { initialTabId: "columns", tabs: [
76
74
  {
77
75
  id: "columns",
78
76
  label: T `Columns`,
79
- elem: R(ColumnsDesignerComponent, {
80
- schema: this.props.schema,
81
- dataSource: this.props.dataSource,
82
- table: this.props.design.table,
83
- columns: this.props.design.columns,
84
- onColumnsChange: this.handleColumnsChange
85
- })
77
+ elem: react_1.default.createElement(ColumnsDesignerComponent, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, columns: this.props.design.columns, onColumnsChange: this.handleColumnsChange })
86
78
  },
87
79
  {
88
80
  id: "filter",
89
81
  label: T `Filter`,
90
82
  // Here because of modal scroll issue
91
- elem: R("div", { style: { marginBottom: 200 } }, R(expressions_ui_2.FilterExprComponent, {
92
- schema: this.props.schema,
93
- dataSource: this.props.dataSource,
94
- table: this.props.design.table,
95
- value: this.props.design.filter,
96
- onChange: this.handleFilterChange
97
- }), react_1.default.createElement(MWaterContextComponent_1.GlobalFiltersElementFactoryContext.Consumer, null, (globalFiltersElementFactory) => globalFiltersElementFactory
98
- ? R("div", { style: { marginTop: 20 } }, globalFiltersElementFactory({
99
- schema: this.props.schema,
100
- dataSource: this.props.dataSource,
101
- filterableTables: [this.props.design.table],
102
- globalFilters: this.props.design.globalFilters,
103
- onChange: this.handleGlobalFiltersChange,
104
- nullIfIrrelevant: true
105
- }))
106
- : undefined))
83
+ elem: react_1.default.createElement("div", { style: { marginBottom: 200 } },
84
+ react_1.default.createElement(expressions_ui_2.FilterExprComponent, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, value: this.props.design.filter, onChange: this.handleFilterChange }),
85
+ react_1.default.createElement(MWaterContextComponent_1.GlobalFiltersElementFactoryContext.Consumer, null, (globalFiltersElementFactory) => globalFiltersElementFactory
86
+ ? react_1.default.createElement("div", { style: { marginTop: 20 } }, globalFiltersElementFactory({
87
+ schema: this.props.schema,
88
+ dataSource: this.props.dataSource,
89
+ filterableTables: [this.props.design.table],
90
+ globalFilters: this.props.design.globalFilters,
91
+ onChange: this.handleGlobalFiltersChange,
92
+ nullIfIrrelevant: true
93
+ }))
94
+ : undefined))
107
95
  },
108
96
  {
109
97
  id: "order",
110
98
  label: T `Sorting`,
111
- elem: R("div", { style: { marginBottom: 200 } }, R(OrderBysDesignerComponent_1.default, {
112
- schema: this.props.schema,
113
- dataSource: this.props.dataSource,
114
- table: this.props.design.table,
115
- orderBys: this.props.design.orderBys,
116
- onChange: this.handleOrderBysChange
117
- }))
99
+ elem: react_1.default.createElement("div", { style: { marginBottom: 200 } },
100
+ react_1.default.createElement(OrderBysDesignerComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, orderBys: this.props.design.orderBys, onChange: this.handleOrderBysChange }))
118
101
  },
119
102
  {
120
103
  id: "quickfilters",
121
104
  label: T `Quickfilters`,
122
- elem: R("div", { style: { marginBottom: 200 } }, R(QuickfiltersDesignComponent_1.default, {
123
- design: this.props.design.quickfilters || [],
124
- onDesignChange: (design) => this.props.onDesignChange((0, update_object_1.default)(this.props.design, { quickfilters: { $set: design } })),
125
- schema: this.props.schema,
126
- dataSource: this.props.dataSource,
127
- tables: [this.props.design.table]
128
- }))
105
+ elem: react_1.default.createElement("div", { style: { marginBottom: 200 } },
106
+ react_1.default.createElement(QuickfiltersDesignComponent_1.default, { design: this.props.design.quickfilters || [], onDesignChange: (design) => this.props.onDesignChange((0, update_object_1.default)(this.props.design, { quickfilters: { $set: design } })), schema: this.props.schema, dataSource: this.props.dataSource, tables: [this.props.design.table] }))
129
107
  },
130
108
  {
131
109
  id: "options",
132
110
  label: T `Options`,
133
- elem: R("div", { style: { marginBottom: 200 } }, R(DatagridOptionsComponent, {
134
- design: this.props.design,
135
- onDesignChange: this.props.onDesignChange
136
- }))
111
+ elem: react_1.default.createElement("div", { style: { marginBottom: 200 } },
112
+ react_1.default.createElement(DatagridOptionsComponent, { design: this.props.design, onDesignChange: this.props.onDesignChange }))
137
113
  }
138
- ]
139
- });
114
+ ] });
140
115
  }
141
116
  render() {
142
- return R("div", null, R("label", null, T `Data Source:`), R(expressions_ui_3.TableSelectComponent, {
143
- schema: this.props.schema,
144
- value: this.props.design.table,
145
- onChange: this.handleTableChange
146
- }), this.props.design.table ? this.renderTabs() : undefined);
117
+ return react_1.default.createElement("div", null,
118
+ react_1.default.createElement("label", null, T `Data Source:`),
119
+ react_1.default.createElement(expressions_ui_3.TableSelectComponent, { schema: this.props.schema, value: this.props.design.table, onChange: this.handleTableChange }),
120
+ this.props.design.table ? this.renderTabs() : undefined);
147
121
  }
148
122
  }
149
123
  exports.default = DatagridDesignerComponent;
@@ -163,6 +137,9 @@ function DatagridOptionsComponent(props) {
163
137
  }
164
138
  // Columns list
165
139
  class ColumnsDesignerComponent extends react_1.default.Component {
140
+ state = {
141
+ showSelectExprModal: false
142
+ };
166
143
  handleColumnChange = (columnIndex, column) => {
167
144
  const columns = this.props.columns.slice();
168
145
  // Handle remove
@@ -171,7 +148,7 @@ class ColumnsDesignerComponent extends react_1.default.Component {
171
148
  }
172
149
  else if (lodash_1.default.isArray(column)) {
173
150
  // Handle array case
174
- Array.prototype.splice.apply(columns, [columnIndex, 1].concat(column));
151
+ columns.splice(columnIndex, 1, ...column);
175
152
  }
176
153
  else {
177
154
  columns[columnIndex] = column;
@@ -179,9 +156,28 @@ class ColumnsDesignerComponent extends react_1.default.Component {
179
156
  return this.props.onColumnsChange(columns);
180
157
  };
181
158
  handleAddColumn = () => {
159
+ this.setState({ showSelectExprModal: true });
160
+ };
161
+ handleExprSelect = (expr) => {
162
+ // Clean the expression first
163
+ const exprCleaner = new expressions_1.ExprCleaner(this.props.schema);
164
+ const cleanedExpr = exprCleaner.cleanExpr(expr, {
165
+ aggrStatuses: ["individual", "literal", "aggregate"]
166
+ });
167
+ const exprUtils = new expressions_1.ExprUtils(this.props.schema);
182
168
  const columns = this.props.columns.slice();
183
- columns.push({ id: (0, uuid_1.default)(), type: "expr", width: 150 });
184
- return this.props.onColumnsChange(columns);
169
+ columns.push({
170
+ id: (0, uuid_1.default)(),
171
+ type: "expr",
172
+ width: 150,
173
+ expr: cleanedExpr,
174
+ label: exprUtils.summarizeExpr(cleanedExpr).slice(0, 30)
175
+ });
176
+ this.props.onColumnsChange(columns);
177
+ this.setState({ showSelectExprModal: false });
178
+ };
179
+ handleExprCancel = () => {
180
+ this.setState({ showSelectExprModal: false });
185
181
  };
186
182
  handleAddIdColumn = () => {
187
183
  const columns = this.props.columns.slice();
@@ -206,7 +202,7 @@ class ColumnsDesignerComponent extends react_1.default.Component {
206
202
  id: (0, uuid_1.default)(),
207
203
  width: 150,
208
204
  type: "expr",
209
- label: null, // Use default label instead. # labeledExpr.label
205
+ label: undefined, // Use default label instead. # labeledExpr.label
210
206
  expr: labeledExpr.expr
211
207
  });
212
208
  }
@@ -217,45 +213,39 @@ class ColumnsDesignerComponent extends react_1.default.Component {
217
213
  return this.props.onColumnsChange([]);
218
214
  };
219
215
  renderColumn = (column, columnIndex, connectDragSource, connectDragPreview, connectDropTarget) => {
220
- return R(ColumnDesignerComponent, {
221
- key: columnIndex,
222
- schema: this.props.schema,
223
- table: this.props.table,
224
- dataSource: this.props.dataSource,
225
- column,
226
- onColumnChange: this.handleColumnChange.bind(null, columnIndex),
227
- connectDragSource,
228
- connectDragPreview,
229
- connectDropTarget
230
- });
216
+ return react_1.default.createElement(ColumnDesignerComponent, { key: columnIndex, schema: this.props.schema, table: this.props.table, dataSource: this.props.dataSource, column: column, onColumnChange: this.handleColumnChange.bind(null, columnIndex), connectDragSource: connectDragSource, connectDragPreview: connectDragPreview, connectDropTarget: connectDropTarget });
231
217
  };
232
218
  render() {
233
- return R("div", { style: { height: "auto", overflowY: "auto", overflowX: "hidden" } }, R("div", { style: { textAlign: "right" }, key: "options" }, R("button", {
234
- key: "addAll",
235
- type: "button",
236
- className: "btn btn-link btn-sm",
237
- onClick: this.handleAddDefaultColumns
238
- }, R("span", { className: "fas fa-plus" }), " " + T `Add Default Columns`), R("button", {
239
- key: "removeAll",
240
- type: "button",
241
- className: "btn btn-link btn-sm",
242
- onClick: this.handleRemoveAllColumns
243
- }, R("span", { className: "fas fa-times" }), " " + T `Remove All Columns`)), R(ReorderableListComponent_1.default, {
244
- items: this.props.columns,
245
- onReorder: this.props.onColumnsChange,
246
- renderItem: this.renderColumn,
247
- getItemId: (item) => item.id
248
- }), R("div", { className: "p-2" }, R("button", {
249
- key: "add",
250
- type: "button",
251
- className: "btn btn-link",
252
- onClick: this.handleAddColumn
253
- }, R("span", { className: "fas fa-plus" }), " " + T `Add Column`), R("button", {
254
- key: "add-id",
255
- type: "button",
256
- className: "btn btn-link",
257
- onClick: this.handleAddIdColumn
258
- }, R("span", { className: "fas fa-plus" }), " " + T `Add Unique Id (advanced)`)));
219
+ return react_1.default.createElement("div", { style: { height: "auto", overflowY: "auto", overflowX: "hidden" } },
220
+ react_1.default.createElement("div", { style: { textAlign: "right" }, key: "options" },
221
+ react_1.default.createElement("button", { key: "addAll", type: "button", className: "btn btn-link btn-sm", onClick: this.handleAddDefaultColumns },
222
+ react_1.default.createElement("span", { className: "fas fa-plus" }),
223
+ " " + T `Add Default Columns`),
224
+ react_1.default.createElement("button", { key: "removeAll", type: "button", className: "btn btn-link btn-sm", onClick: this.handleRemoveAllColumns },
225
+ react_1.default.createElement("span", { className: "fas fa-times" }),
226
+ " " + T `Remove All Columns`)),
227
+ react_1.default.createElement(ReorderableListComponent_1.default, { items: this.props.columns, onReorder: this.props.onColumnsChange, renderItem: this.renderColumn, getItemId: (item) => item.id }),
228
+ react_1.default.createElement("div", { className: "p-2" },
229
+ react_1.default.createElement("button", { key: "add", type: "button", className: "btn btn-link", onClick: this.handleAddColumn },
230
+ react_1.default.createElement("span", { className: "fas fa-plus" }),
231
+ " " + T `Add Column`),
232
+ react_1.default.createElement("button", { key: "add-id", type: "button", className: "btn btn-link", onClick: this.handleAddIdColumn },
233
+ react_1.default.createElement("span", { className: "fas fa-plus" }),
234
+ " " + T `Add Unique Id (advanced)`)),
235
+ this.state.showSelectExprModal && (react_1.default.createElement(SelectExprModalComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.table, value: null, allowCase: true, onSelect: this.handleExprSelect, onCancel: this.handleExprCancel, types: [
236
+ "text",
237
+ "number",
238
+ "enum",
239
+ "enumset",
240
+ "boolean",
241
+ "date",
242
+ "datetime",
243
+ "image",
244
+ "imagelist",
245
+ "text[]",
246
+ "geometry",
247
+ "id"
248
+ ], aggrStatuses: ["literal", "individual", "aggregate"] })));
259
249
  }
260
250
  }
261
251
  // Column item
@@ -317,10 +307,14 @@ class ColumnDesignerComponent extends react_1.default.Component {
317
307
  const exprType = exprUtils.getExprType(this.props.column.expr);
318
308
  switch (exprType) {
319
309
  case "enumset":
320
- return R("a", { className: "btn btn-sm btn-link", onClick: this.handleSplitEnumset }, R("i", { className: "fa fa-chain-broken" }), " " + T `Split by options`);
310
+ return react_1.default.createElement("a", { className: "btn btn-sm btn-link", onClick: this.handleSplitEnumset },
311
+ react_1.default.createElement("i", { className: "fa fa-chain-broken" }),
312
+ " " + T `Split by options`);
321
313
  break;
322
314
  case "geometry":
323
- return R("a", { className: "btn btn-sm btn-link", onClick: this.handleSplitGeometry }, R("i", { className: "fa fa-chain-broken" }), " " + T `Split by lat/lng`);
315
+ return react_1.default.createElement("a", { className: "btn btn-sm btn-link", onClick: this.handleSplitGeometry },
316
+ react_1.default.createElement("i", { className: "fa fa-chain-broken" }),
317
+ " " + T `Split by lat/lng`);
324
318
  break;
325
319
  }
326
320
  return null;
@@ -335,12 +329,10 @@ class ColumnDesignerComponent extends react_1.default.Component {
335
329
  if (!formats) {
336
330
  return null;
337
331
  }
338
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, T `Format`), ": ", R("select", {
339
- value: this.props.column.format != null ? this.props.column.format : (0, valueFormatter_2.getDefaultFormat)(exprType),
340
- className: "form-select",
341
- style: { width: "auto", display: "inline-block" },
342
- onChange: this.handleFormatChange
343
- }, lodash_1.default.map(formats, (format) => R("option", { key: format.value, value: format.value }, format.label))));
332
+ return react_1.default.createElement("div", { className: "mb-3" },
333
+ react_1.default.createElement("label", { className: "text-muted" }, T `Format`),
334
+ ": ",
335
+ react_1.default.createElement("select", { value: this.props.column.format != null ? this.props.column.format : (0, valueFormatter_2.getDefaultFormat)(exprType), className: "form-select", style: { width: "auto", display: "inline-block" }, onChange: this.handleFormatChange }, lodash_1.default.map(formats, (format) => react_1.default.createElement("option", { key: format.value, value: format.value }, format.label))));
344
336
  }
345
337
  render = () => {
346
338
  const exprUtils = new expressions_1.ExprUtils(this.props.schema);
@@ -368,25 +360,21 @@ class ColumnDesignerComponent extends react_1.default.Component {
368
360
  const error = exprValidator.validateExpr(this.props.column.expr, {
369
361
  aggrStatuses: ["individual", "literal", "aggregate"]
370
362
  });
371
- const elem = R("div", { className: "row" }, R("div", { className: "col-1" }, this.props.connectDragSource(R("span", { className: "text-muted fa fa-bars _mviz-move" }))), R("div", { className: "col-6" }, // style: { border: "solid 1px #DDD", padding: 4 },
372
- R(expressions_ui_1.ExprComponent, {
373
- schema: this.props.schema,
374
- dataSource: this.props.dataSource,
375
- table: this.props.table,
376
- value: this.props.column.expr,
377
- aggrStatuses: ["literal", "individual", "aggregate"],
378
- types: allowedTypes,
379
- onChange: this.handleExprChange
380
- }), this.renderSplit(), this.renderFormat(), error ? react_1.default.createElement("span", { className: "text-danger" },
381
- react_1.default.createElement("i", { className: "fa fa-exclamation-circle" }),
382
- " ",
383
- error) : undefined), R("div", { className: "col-4" }, R("input", {
384
- type: "text",
385
- className: "form-control",
386
- placeholder: exprUtils.summarizeExpr(this.props.column.expr),
387
- value: this.props.column.label,
388
- onChange: (ev) => this.handleLabelChange(ev.target.value)
389
- })), R("div", { className: "col-1" }, R("a", { className: "link-plain", onClick: this.props.onColumnChange.bind(null, null) }, R("span", { className: "fas fa-times" }))));
363
+ const elem = react_1.default.createElement("div", { className: "row" },
364
+ react_1.default.createElement("div", { className: "col-1" }, this.props.connectDragSource(react_1.default.createElement("span", { className: "text-muted fa fa-bars mwater-visualization-cursor-hover" }))),
365
+ react_1.default.createElement("div", { className: "col-6" },
366
+ react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.table, value: this.props.column.expr, aggrStatuses: ["literal", "individual", "aggregate"], types: allowedTypes, onChange: this.handleExprChange }),
367
+ this.renderSplit(),
368
+ this.renderFormat(),
369
+ error ? react_1.default.createElement("span", { className: "text-danger" },
370
+ react_1.default.createElement("i", { className: "fa fa-exclamation-circle" }),
371
+ " ",
372
+ error) : undefined),
373
+ react_1.default.createElement("div", { className: "col-4" },
374
+ react_1.default.createElement("input", { type: "text", className: "form-control", placeholder: exprUtils.summarizeExpr(this.props.column.expr), value: this.props.column.label, onChange: (ev) => this.handleLabelChange(ev.target.value) })),
375
+ react_1.default.createElement("div", { className: "col-1" },
376
+ react_1.default.createElement("a", { className: "link-plain", onClick: this.props.onColumnChange.bind(null, null) },
377
+ react_1.default.createElement("span", { className: "fas fa-times" }))));
390
378
  return this.props.connectDropTarget(this.props.connectDragPreview(elem));
391
379
  };
392
380
  }
@@ -19,6 +19,10 @@ const DatagridViewComponent = (0, react_2.forwardRef)((props, ref) => {
19
19
  const [rows, setRows] = (0, react_2.useState)([]);
20
20
  const [entirelyLoaded, setEntirelyLoaded] = (0, react_2.useState)(false);
21
21
  const loadStateRef = (0, react_2.useRef)(null);
22
+ // Track which design key the current rows were loaded with to avoid rendering stale data
23
+ // with a mismatched column structure (e.g. after column reorder)
24
+ const [loadedDesignKey, setLoadedDesignKey] = (0, react_2.useState)(null);
25
+ const currentDesignKey = getDatagridReloadKey(props.design);
22
26
  // Get row header width based on selection and showRowNumbers
23
27
  const rowHeaderWidth = props.selectedRows
24
28
  ? (props.design.showRowNumbers ? 70 : 30) // With selection: 70 for both, 30 for just checkbox
@@ -75,13 +79,17 @@ const DatagridViewComponent = (0, react_2.forwardRef)((props, ref) => {
75
79
  whiteSpace: "nowrap",
76
80
  padding: "0 8px"
77
81
  };
78
- const rowId = options.row < rows.length ? rows[options.row].id : null;
82
+ // If design key doesn't match, rows are stale - show loading state
83
+ if (loadedDesignKey !== currentDesignKey || options.row >= rows.length) {
84
+ return (react_1.default.createElement("div", { style: rowHeaderStyle }, props.design.showRowNumbers ? (react_1.default.createElement("div", { style: { flex: 1, textAlign: "right" } }, options.row + 1)) : null));
85
+ }
86
+ const rowId = rows[options.row].id;
79
87
  const isSelected = rowId != null && props.selectedRows ? props.selectedRows.isSelected(rowId) : false;
80
- const isSubtable = options.row < rows.length ? rows[options.row].subtable >= 0 : false;
88
+ const isSubtable = rows[options.row].subtable >= 0;
81
89
  return (react_1.default.createElement("div", { style: rowHeaderStyle },
82
90
  props.selectedRows && !isSubtable && (react_1.default.createElement("input", { type: "checkbox", style: { marginRight: 4 }, checked: isSelected, onChange: rowId != null && props.onSelectedRowsChange ? () => handleRowSelect(rowId) : undefined, readOnly: !props.onSelectedRowsChange })),
83
91
  props.design.showRowNumbers ? (react_1.default.createElement("div", { style: { flex: 1, textAlign: "right" } }, options.row + 1)) : null));
84
- }, [rows, props.selectedRows, props.onSelectedRowsChange, props.design.showRowNumbers, handleRowSelect]);
92
+ }, [rows, props.selectedRows, props.onSelectedRowsChange, props.design.showRowNumbers, handleRowSelect, loadedDesignKey, currentDesignKey]);
85
93
  const loadMoreRows = (0, useStableCallback_1.useStableCallback)((callback) => {
86
94
  const loadState = {
87
95
  design: props.design,
@@ -103,14 +111,15 @@ const DatagridViewComponent = (0, react_2.forwardRef)((props, ref) => {
103
111
  loadStateRef.current = null;
104
112
  setRows(prev => [...prev, ...newRows]);
105
113
  setEntirelyLoaded(newRows.length < (props.pageSize || 100));
114
+ setLoadedDesignKey(getDatagridReloadKey(loadState.design));
106
115
  callback?.();
107
116
  }
108
117
  });
109
118
  });
110
119
  function reload() {
111
- console.log("reload");
112
120
  setRows([]);
113
121
  setEntirelyLoaded(false);
122
+ setLoadedDesignKey(null);
114
123
  }
115
124
  // Reset rows when design, filters or refreshKey changes
116
125
  (0, react_2.useEffect)(() => {
@@ -204,6 +213,10 @@ const DatagridViewComponent = (0, react_2.forwardRef)((props, ref) => {
204
213
  return false;
205
214
  });
206
215
  const handleCopy = (0, useStableCallback_1.useStableCallback)((rowIndex, colIndex) => {
216
+ // If design key doesn't match, rows are stale - don't copy
217
+ if (loadedDesignKey !== currentDesignKey || rowIndex >= rows.length) {
218
+ return;
219
+ }
207
220
  const row = rows[rowIndex];
208
221
  const col = props.design.columns[colIndex];
209
222
  const value = row[`c${colIndex}`];
@@ -228,6 +241,13 @@ const DatagridViewComponent = (0, react_2.forwardRef)((props, ref) => {
228
241
  navigator.clipboard.writeText(formattedValue || "");
229
242
  });
230
243
  const renderCell = (0, useStableCallback_1.useStableCallback)((options) => {
244
+ // If rows were loaded with a different design key, show loading state to avoid
245
+ // rendering stale data with mismatched column structure (e.g. after column reorder)
246
+ if (loadedDesignKey !== currentDesignKey) {
247
+ lodash_1.default.defer(() => loadMoreRows());
248
+ return react_1.default.createElement("div", { style: { padding: 8 } },
249
+ react_1.default.createElement("i", { className: "fa fa-spinner fa-spin text-muted" }));
250
+ }
231
251
  if (options.row >= rows.length) {
232
252
  lodash_1.default.defer(() => loadMoreRows());
233
253
  return react_1.default.createElement("div", { style: { padding: 8 } },
@@ -267,11 +287,14 @@ const DatagridViewComponent = (0, react_2.forwardRef)((props, ref) => {
267
287
  fontWeight: "bold",
268
288
  height: "100%",
269
289
  display: "flex",
270
- alignItems: "center"
290
+ alignItems: "center",
291
+ overflow: "hidden",
292
+ width: options.width
271
293
  } }, column.label || exprUtils.summarizeExpr(column.expr, props.design.locale)));
272
294
  });
273
295
  const renderCellEditor = (0, useStableCallback_1.useStableCallback)((options) => {
274
- if (options.row >= rows.length) {
296
+ // If design key doesn't match, rows are stale - don't render editor
297
+ if (loadedDesignKey !== currentDesignKey || options.row >= rows.length) {
275
298
  return react_1.default.createElement("div", null);
276
299
  }
277
300
  const column = props.design.columns[options.col];
@@ -287,6 +310,10 @@ const DatagridViewComponent = (0, react_2.forwardRef)((props, ref) => {
287
310
  if (options.col === -1) {
288
311
  return false;
289
312
  }
313
+ // If design key doesn't match, rows are stale - don't allow edit
314
+ if (loadedDesignKey !== currentDesignKey || options.row >= rows.length) {
315
+ return false;
316
+ }
290
317
  const rowId = rows[options.row].id;
291
318
  if (rowId == null) {
292
319
  return false;
@@ -1,22 +1,22 @@
1
1
  import React from "react";
2
2
  import { DataSource, Schema } from "@mwater/expressions";
3
+ import { DatagridDesignOrderBy } from "./DatagridDesign";
3
4
  export interface OrderBysDesignerComponentProps {
4
5
  /** schema to use */
5
6
  schema: Schema;
6
7
  /** dataSource to use */
7
8
  dataSource: DataSource;
8
9
  table: string;
9
- /** Columns list See README.md of this folder */
10
- orderBys: any;
10
+ orderBys: DatagridDesignOrderBy[];
11
11
  /** Called when columns changes */
12
- onChange: any;
12
+ onChange: (orderBys: DatagridDesignOrderBy[]) => void;
13
13
  }
14
14
  export default class OrderBysDesignerComponent extends React.Component<OrderBysDesignerComponentProps> {
15
15
  static defaultProps: {
16
16
  orderBys: never[];
17
17
  };
18
- handleChange: (index: any, orderBy: any) => any;
19
- handleRemove: (index: any) => any;
20
- handleAdd: () => any;
21
- render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
18
+ handleChange: (index: any, orderBy: any) => void;
19
+ handleRemove: (index: any) => void;
20
+ handleAdd: () => void;
21
+ render(): React.JSX.Element;
22
22
  }
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const lodash_1 = __importDefault(require("lodash"));
7
7
  const react_1 = __importDefault(require("react"));
8
- const R = react_1.default.createElement;
9
8
  const expressions_ui_1 = require("@mwater/expressions-ui");
10
9
  const bootstrap_1 = require("@mwater/react-library/lib/bootstrap");
11
10
  // Edits an orderBys which is a list of expressions and directions. See README.md
@@ -27,22 +26,13 @@ class OrderBysDesignerComponent extends react_1.default.Component {
27
26
  return this.props.onChange(orderBys);
28
27
  };
29
28
  render() {
30
- return R("div", null, lodash_1.default.map(this.props.orderBys, (orderBy, index) => {
31
- return R(OrderByDesignerComponent, {
32
- key: index,
33
- schema: this.props.schema,
34
- table: this.props.table,
35
- dataSource: this.props.dataSource,
36
- orderBy,
37
- onChange: this.handleChange.bind(null, index),
38
- onRemove: this.handleRemove.bind(null, index)
39
- });
40
- }), R("button", {
41
- key: "add",
42
- type: "button",
43
- className: "btn btn-link",
44
- onClick: this.handleAdd
45
- }, R("span", { className: "fas fa-plus" }), " " + T `Add Ordering`));
29
+ return (react_1.default.createElement("div", null,
30
+ lodash_1.default.map(this.props.orderBys, (orderBy, index) => {
31
+ return react_1.default.createElement(OrderByDesignerComponent, { key: index, schema: this.props.schema, table: this.props.table, dataSource: this.props.dataSource, orderBy: orderBy, onChange: this.handleChange.bind(null, index), onRemove: this.handleRemove.bind(null, index) });
32
+ }),
33
+ react_1.default.createElement("button", { key: "add", type: "button", className: "btn btn-link", onClick: this.handleAdd },
34
+ react_1.default.createElement("span", { className: "fas fa-plus" }),
35
+ " " + T `Add Ordering`)));
46
36
  }
47
37
  }
48
38
  exports.default = OrderBysDesignerComponent;
@@ -50,18 +40,19 @@ class OrderByDesignerComponent extends react_1.default.Component {
50
40
  handleExprChange = (expr) => {
51
41
  return this.props.onChange(lodash_1.default.extend({}, this.props.orderBy, { expr }));
52
42
  };
53
- handleDirectionChange = (value) => {
54
- return this.props.onChange(lodash_1.default.extend({}, this.props.orderBy, { direction: value ? "desc" : "asc" }));
43
+ handleDirectionChange = (direction) => {
44
+ return this.props.onChange(lodash_1.default.extend({}, this.props.orderBy, { direction }));
55
45
  };
56
46
  render() {
57
- return R("div", { className: "row" }, R("div", { className: "col-7" }, R(expressions_ui_1.ExprComponent, {
58
- schema: this.props.schema,
59
- dataSource: this.props.dataSource,
60
- table: this.props.table,
61
- types: ["text", "number", "boolean", "date", "datetime"],
62
- aggrStatuses: ["individual", "literal", "aggregate"],
63
- value: this.props.orderBy.expr,
64
- onChange: this.handleExprChange
65
- })), R("div", { className: "col-3" }, react_1.default.createElement(bootstrap_1.Checkbox, { inline: true, value: this.props.orderBy.direction === "desc", onChange: this.handleDirectionChange }, T `Reverse`)), R("div", { className: "col-1" }, R("button", { className: "btn btn-sm btn-link", type: "button", onClick: this.props.onRemove }, R("span", { className: "fas fa-times" }))));
47
+ return (react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "8px" } },
48
+ react_1.default.createElement("div", { style: { flex: 1 } },
49
+ react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.table, types: ["text", "number", "boolean", "date", "datetime"], aggrStatuses: ["individual", "literal", "aggregate"], value: this.props.orderBy.expr, onChange: this.handleExprChange })),
50
+ react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: "8px" } },
51
+ react_1.default.createElement(bootstrap_1.Toggle, { size: "xs", value: this.props.orderBy.direction, onChange: this.handleDirectionChange, options: [
52
+ { value: "asc", label: T `Ascending` },
53
+ { value: "desc", label: T `Descending` }
54
+ ] }),
55
+ react_1.default.createElement("button", { className: "btn btn-sm btn-link", type: "button", onClick: this.props.onRemove },
56
+ react_1.default.createElement("span", { className: "fas fa-times" })))));
66
57
  }
67
58
  }
package/lib/index.css CHANGED
@@ -55,6 +55,12 @@ Lato, Lora, Inter, Merriweather, Roboto
55
55
  }
56
56
  }
57
57
 
58
+ @media only screen and (max-width: 800px) {
59
+ .hide-800px {
60
+ display: none;
61
+ }
62
+ }
63
+
58
64
  /* Dashed thresholds */
59
65
  .bb-grid line {
60
66
  stroke-dasharray: 3;
@@ -133,6 +139,20 @@ Lato, Lora, Inter, Merriweather, Roboto
133
139
  visibility: visible;
134
140
  }
135
141
 
142
+ /* Use these to make a grandchild that displays only when parent is hovered */
143
+ .hover-display-parent > * > .hover-display-grandchild {
144
+ visibility: hidden;
145
+ }
146
+
147
+ .hover-display-parent:hover > * > .hover-display-grandchild {
148
+ visibility: visible;
149
+ }
150
+
151
+ /* Use these to set a faint background on hover */
152
+ .hover-grey:hover {
153
+ background-color: #f8f8f8;
154
+ }
155
+
136
156
  .bb-title {
137
157
  font: 14px sans-serif;
138
158
  font-weight: bold;
@@ -342,6 +362,29 @@ Lato, Lora, Inter, Merriweather, Roboto
342
362
  background-color: #363b3e;
343
363
  padding: 5px;
344
364
  padding-top: 6px;
365
+ transform: translateX(-100%);
366
+ animation: slideIn 0.3s ease-in-out;
367
+ }
368
+
369
+ @keyframes slideIn {
370
+ from {
371
+ transform: translateX(-100%);
372
+ }
373
+ to {
374
+ transform: translateX(0);
375
+ }
376
+ }
377
+
378
+ .mwater-visualization-palette-container {
379
+ position: absolute;
380
+ top: 0;
381
+ left: 0;
382
+ height: 100%;
383
+ z-index: 1000;
384
+ }
385
+
386
+ .mwater-visualization-palette-container:not(.hidden) .mwater-visualization-palette {
387
+ transform: translateX(0);
345
388
  }
346
389
 
347
390
  .mwater-visualization-palette-item {
@@ -543,11 +586,11 @@ Lato, Lora, Inter, Merriweather, Roboto
543
586
  background-color: rgba(0, 0, 0, 0.075);
544
587
  }
545
588
 
546
- ._mviz-move:hover {
589
+ .mwater-visualization-cursor-hover:hover {
547
590
  cursor: move;
548
591
  }
549
592
 
550
- ._mviz-map-hover-content {
593
+ .mwater-visualization-map-hover-content {
551
594
  display: grid;
552
595
  grid-template-columns: 1fr 2fr;
553
596
  grid-auto-rows: min-content;