@mwater/visualization 5.4.1 → 5.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/lib/ColorComponent.js +2 -1
  2. package/lib/IdSelection.d.ts +16 -0
  3. package/lib/IdSelection.js +59 -0
  4. package/lib/MWaterAddRelatedIndicatorComponent.js +2 -2
  5. package/lib/MWaterCompleteTableSelectComponent.d.ts +3 -8
  6. package/lib/MWaterCompleteTableSelectComponent.js +36 -42
  7. package/lib/MWaterLoaderComponent.d.ts +11 -10
  8. package/lib/MWaterLoaderComponent.js +1 -1
  9. package/lib/MWaterResponsesFilterComponent.js +1 -1
  10. package/lib/MWaterTableSelectComponent.d.ts +0 -1
  11. package/lib/MWaterTableSelectComponent.js +4 -6
  12. package/lib/autotranslate.d.ts +20 -0
  13. package/lib/autotranslate.js +122 -0
  14. package/lib/axes/AxisBuilder.js +3 -3
  15. package/lib/axes/AxisColorEditorComponent.js +4 -0
  16. package/lib/axes/AxisComponent.d.ts +8 -12
  17. package/lib/axes/AxisComponent.js +32 -80
  18. package/lib/axes/CategoryMapComponent.js +4 -4
  19. package/lib/axes/RangesComponent.js +2 -2
  20. package/lib/dashboards/DashboardComponent.d.ts +12 -20
  21. package/lib/dashboards/DashboardComponent.js +109 -69
  22. package/lib/dashboards/DashboardDesign.d.ts +11 -2
  23. package/lib/dashboards/DashboardUtils.d.ts +5 -0
  24. package/lib/dashboards/DashboardUtils.js +30 -0
  25. package/lib/dashboards/DashboardViewComponent.d.ts +2 -0
  26. package/lib/dashboards/DashboardViewComponent.js +16 -3
  27. package/lib/dashboards/ServerDashboardDataSource.js +2 -1
  28. package/lib/dashboards/SettingsModalComponent.d.ts +1 -1
  29. package/lib/dashboards/SettingsModalComponent.js +256 -19
  30. package/lib/dashboards/WidgetComponent.d.ts +6 -3
  31. package/lib/dashboards/WidgetComponent.js +3 -1
  32. package/lib/datagrids/CellEditor.d.ts +19 -0
  33. package/lib/datagrids/CellEditor.js +223 -0
  34. package/lib/datagrids/DatagridComponent.d.ts +18 -87
  35. package/lib/datagrids/DatagridComponent.js +304 -222
  36. package/lib/datagrids/DatagridViewComponent.d.ts +15 -53
  37. package/lib/datagrids/DatagridViewComponent.js +256 -257
  38. package/lib/datagrids/DirectDatagridDataSource.js +2 -3
  39. package/lib/datagrids/ExprCellComponent.d.ts +8 -15
  40. package/lib/datagrids/ExprCellComponent.js +11 -15
  41. package/lib/datagrids/FindReplaceModalComponent.d.ts +4 -6
  42. package/lib/datagrids/FindReplaceModalComponent.js +38 -75
  43. package/lib/index.css +1 -1
  44. package/lib/index.d.ts +0 -1
  45. package/lib/index.js +0 -1
  46. package/lib/languages.js +6 -1
  47. package/lib/layouts/blocks/HorizontalBlockComponent.js +2 -2
  48. package/lib/mWaterLoader.d.ts +1 -1
  49. package/lib/maps/BufferLayer.d.ts +7 -5
  50. package/lib/maps/BufferLayer.js +69 -48
  51. package/lib/maps/BufferLayerDesign.d.ts +21 -14
  52. package/lib/maps/BufferLayerDesignerComponent.d.ts +16 -31
  53. package/lib/maps/BufferLayerDesignerComponent.js +68 -102
  54. package/lib/maps/ChoroplethLayer.d.ts +5 -4
  55. package/lib/maps/ChoroplethLayer.js +32 -9
  56. package/lib/maps/ChoroplethLayerDesign.d.ts +6 -2
  57. package/lib/maps/ChoroplethLayerDesigner.js +4 -2
  58. package/lib/maps/ClusterLayer.d.ts +3 -4
  59. package/lib/maps/ClusterLayer.js +2 -1
  60. package/lib/maps/DetailLevelSelectComponent.js +1 -1
  61. package/lib/maps/DirectMapDataSource.js +2 -1
  62. package/lib/maps/EditPopupComponent.js +5 -3
  63. package/lib/maps/GridLayer.d.ts +3 -4
  64. package/lib/maps/GridLayer.js +2 -1
  65. package/lib/maps/GridLayerDesigner.js +5 -3
  66. package/lib/maps/HoverContent.d.ts +11 -3
  67. package/lib/maps/HoverContent.js +25 -9
  68. package/lib/maps/Layer.d.ts +24 -3
  69. package/lib/maps/Layer.js +5 -1
  70. package/lib/maps/LayerFactory.js +0 -8
  71. package/lib/maps/LayerLegendComponent.js +0 -1
  72. package/lib/maps/LayerSwitcherComponent.d.ts +1 -0
  73. package/lib/maps/LayerSwitcherComponent.js +1 -1
  74. package/lib/maps/LeafletMapComponent.js +3 -1
  75. package/lib/maps/LegendComponent.d.ts +1 -0
  76. package/lib/maps/LegendComponent.js +9 -1
  77. package/lib/maps/MWaterServerLayer.d.ts +2 -2
  78. package/lib/maps/MWaterServerLayer.js +2 -2
  79. package/lib/maps/MapComponent.js +3 -3
  80. package/lib/maps/MapDesign.d.ts +2 -0
  81. package/lib/maps/MapDesignerComponent.d.ts +4 -3
  82. package/lib/maps/MapDesignerComponent.js +68 -74
  83. package/lib/maps/MapLayerViewDesignerComponent.js +2 -2
  84. package/lib/maps/MapUtils.d.ts +4 -0
  85. package/lib/maps/MapUtils.js +19 -0
  86. package/lib/maps/MapViewComponent.d.ts +8 -3
  87. package/lib/maps/MarkersLayer.d.ts +5 -4
  88. package/lib/maps/MarkersLayer.js +33 -7
  89. package/lib/maps/MarkersLayerDesign.d.ts +19 -16
  90. package/lib/maps/PopupFilterJoinsUtils.d.ts +6 -3
  91. package/lib/maps/PopupFilterJoinsUtils.js +0 -6
  92. package/lib/maps/RasterMapViewComponent.d.ts +3 -31
  93. package/lib/maps/RasterMapViewComponent.js +7 -2
  94. package/lib/maps/ServerMapDataSource.js +2 -1
  95. package/lib/maps/SwitchableTileUrlLayer.d.ts +3 -3
  96. package/lib/maps/SwitchableTileUrlLayer.js +2 -1
  97. package/lib/maps/TileUrlLayer.d.ts +4 -5
  98. package/lib/maps/TileUrlLayer.js +2 -1
  99. package/lib/maps/VectorMapViewComponent.d.ts +5 -37
  100. package/lib/maps/VectorMapViewComponent.js +19 -8
  101. package/lib/maps/maps.d.ts +3 -0
  102. package/lib/quickfilter/Quickfilter.d.ts +2 -0
  103. package/lib/quickfilter/QuickfiltersComponent.d.ts +2 -0
  104. package/lib/quickfilter/QuickfiltersComponent.js +9 -7
  105. package/lib/quickfilter/QuickfiltersDesignComponent.d.ts +5 -30
  106. package/lib/quickfilter/QuickfiltersDesignComponent.js +56 -63
  107. package/lib/richtext/ExprItemsHtmlConverter.d.ts +5 -2
  108. package/lib/richtext/ExprItemsHtmlConverter.js +4 -4
  109. package/lib/richtext/ExprItemsTranslator.d.ts +5 -0
  110. package/lib/richtext/ExprItemsTranslator.js +149 -0
  111. package/lib/richtext/ItemsHtmlConverter.d.ts +1 -1
  112. package/lib/richtext/ItemsHtmlConverter.js +31 -15
  113. package/lib/wellknown.js +12 -9
  114. package/lib/widgets/IFrameWidget.d.ts +4 -4
  115. package/lib/widgets/ImageWidget.d.ts +7 -4
  116. package/lib/widgets/ImageWidget.js +9 -1
  117. package/lib/widgets/ImageWidgetComponent.d.ts +1 -0
  118. package/lib/widgets/ImageWidgetComponent.js +1 -1
  119. package/lib/widgets/MapWidget.d.ts +5 -48
  120. package/lib/widgets/MapWidget.js +26 -63
  121. package/lib/widgets/MarkdownWidget.d.ts +3 -0
  122. package/lib/widgets/MarkdownWidget.js +3 -0
  123. package/lib/widgets/TOCWidget.d.ts +15 -27
  124. package/lib/widgets/TOCWidget.js +107 -183
  125. package/lib/widgets/Widget.d.ts +18 -7
  126. package/lib/widgets/Widget.js +4 -0
  127. package/lib/widgets/WidgetScopesViewComponent.js +1 -1
  128. package/lib/widgets/charts/Chart.d.ts +10 -1
  129. package/lib/widgets/charts/Chart.js +22 -11
  130. package/lib/widgets/charts/ChartViewComponent.d.ts +4 -0
  131. package/lib/widgets/charts/ChartViewComponent.js +6 -3
  132. package/lib/widgets/charts/ChartWidget.d.ts +2 -0
  133. package/lib/widgets/charts/ChartWidget.js +9 -1
  134. package/lib/widgets/charts/ChartWidgetComponent.d.ts +4 -0
  135. package/lib/widgets/charts/ChartWidgetComponent.js +2 -2
  136. package/lib/widgets/charts/calendar/CalendarChart.d.ts +1 -0
  137. package/lib/widgets/charts/calendar/CalendarChart.js +26 -0
  138. package/lib/widgets/charts/calendar/CalendarChartViewComponent.js +3 -1
  139. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.d.ts +1 -0
  140. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.js +8 -0
  141. package/lib/widgets/charts/layered/LayeredChart.d.ts +2 -0
  142. package/lib/widgets/charts/layered/LayeredChart.js +63 -3
  143. package/lib/widgets/charts/layered/LayeredChartCompiler.d.ts +1 -1
  144. package/lib/widgets/charts/layered/LayeredChartCompiler.js +1 -1
  145. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +2 -2
  146. package/lib/widgets/charts/layered/LayeredChartViewComponent.js +8 -3
  147. package/lib/widgets/charts/pivot/PivotChart.d.ts +1 -0
  148. package/lib/widgets/charts/pivot/PivotChart.js +63 -0
  149. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +1 -1
  150. package/lib/widgets/charts/pivot/SegmentDesignerComponent.js +7 -4
  151. package/lib/widgets/charts/table/OrderingsComponent.js +1 -1
  152. package/lib/widgets/charts/table/TableChart.d.ts +1 -0
  153. package/lib/widgets/charts/table/TableChart.js +15 -0
  154. package/lib/widgets/text/TextComponent.d.ts +11 -4
  155. package/lib/widgets/text/TextComponent.js +11 -8
  156. package/lib/widgets/text/TextWidget.d.ts +6 -3
  157. package/lib/widgets/text/TextWidget.js +7 -1
  158. package/lib/widgets/text/TextWidgetComponent.d.ts +4 -0
  159. package/lib/widgets/text/TextWidgetComponent.js +7 -1
  160. package/lib/widgets/text/TextWidgetDesign.d.ts +2 -4
  161. package/lib/widgets/text/TextWidgetDesign.js +1 -1
  162. package/package.json +7 -8
  163. package/src/ColorComponent.tsx +1 -2
  164. package/src/IdSelection.ts +62 -0
  165. package/src/MWaterAddRelatedIndicatorComponent.ts +3 -2
  166. package/src/MWaterCompleteTableSelectComponent.tsx +36 -46
  167. package/src/MWaterLoaderComponent.ts +28 -26
  168. package/src/MWaterResponsesFilterComponent.ts +5 -2
  169. package/src/MWaterTableSelectComponent.tsx +5 -9
  170. package/src/autotranslate.ts +141 -0
  171. package/src/axes/AxisBuilder.ts +3 -3
  172. package/src/axes/AxisColorEditorComponent.tsx +5 -0
  173. package/src/axes/{AxisComponent.ts → AxisComponent.tsx} +106 -106
  174. package/src/axes/CategoryMapComponent.ts +4 -4
  175. package/src/axes/RangesComponent.ts +3 -2
  176. package/src/dashboards/DashboardComponent.tsx +189 -125
  177. package/src/dashboards/DashboardDesign.ts +9 -2
  178. package/src/dashboards/DashboardUtils.ts +39 -0
  179. package/src/dashboards/DashboardViewComponent.tsx +22 -3
  180. package/src/dashboards/ServerDashboardDataSource.ts +2 -1
  181. package/src/dashboards/SettingsModalComponent.tsx +450 -35
  182. package/src/dashboards/WidgetComponent.tsx +12 -6
  183. package/src/datagrids/CellEditor.tsx +354 -0
  184. package/src/datagrids/DatagridComponent.tsx +646 -0
  185. package/src/datagrids/DatagridViewComponent.tsx +539 -0
  186. package/src/datagrids/DirectDatagridDataSource.ts +2 -3
  187. package/src/datagrids/{ExprCellComponent.ts → ExprCellComponent.tsx} +28 -23
  188. package/src/datagrids/{FindReplaceModalComponent.ts → FindReplaceModalComponent.tsx} +109 -122
  189. package/src/index.css +1 -1
  190. package/src/index.ts +0 -1
  191. package/src/languages.ts +6 -1
  192. package/src/layouts/blocks/HorizontalBlockComponent.ts +2 -2
  193. package/src/mWaterLoader.ts +1 -1
  194. package/src/maps/BufferLayer.ts +83 -60
  195. package/src/maps/BufferLayerDesign.ts +20 -14
  196. package/src/maps/BufferLayerDesignerComponent.tsx +309 -0
  197. package/src/maps/ChoroplethLayer.ts +40 -19
  198. package/src/maps/ChoroplethLayerDesign.ts +4 -2
  199. package/src/maps/ChoroplethLayerDesigner.tsx +4 -2
  200. package/src/maps/ClusterLayer.ts +4 -10
  201. package/src/maps/DetailLevelSelectComponent.ts +1 -1
  202. package/src/maps/DirectMapDataSource.ts +2 -1
  203. package/src/maps/EditPopupComponent.ts +7 -3
  204. package/src/maps/GridLayer.ts +4 -10
  205. package/src/maps/GridLayerDesigner.tsx +5 -3
  206. package/src/maps/HoverContent.tsx +40 -16
  207. package/src/maps/Layer.ts +28 -10
  208. package/src/maps/LayerFactory.ts +0 -8
  209. package/src/maps/LayerLegendComponent.ts +2 -4
  210. package/src/maps/LayerSwitcherComponent.tsx +6 -2
  211. package/src/maps/LeafletMapComponent.tsx +3 -1
  212. package/src/maps/LegendComponent.tsx +10 -1
  213. package/src/maps/MWaterServerLayer.ts +3 -3
  214. package/src/maps/MapComponent.ts +3 -3
  215. package/src/maps/MapDesign.ts +3 -0
  216. package/src/maps/MapDesignerComponent.tsx +165 -162
  217. package/src/maps/MapLayerViewDesignerComponent.ts +2 -2
  218. package/src/maps/MapUtils.ts +24 -0
  219. package/src/maps/MapViewComponent.tsx +11 -3
  220. package/src/maps/MarkersLayer.ts +44 -18
  221. package/src/maps/MarkersLayerDesign.ts +19 -16
  222. package/src/maps/PopupFilterJoinsUtils.ts +6 -2
  223. package/src/maps/RasterMapViewComponent.ts +9 -45
  224. package/src/maps/ServerMapDataSource.ts +2 -2
  225. package/src/maps/SwitchableTileUrlLayer.tsx +4 -10
  226. package/src/maps/TileUrlLayer.tsx +4 -10
  227. package/src/maps/VectorMapViewComponent.tsx +28 -55
  228. package/src/maps/maps.ts +3 -0
  229. package/src/quickfilter/Quickfilter.ts +3 -0
  230. package/src/quickfilter/QuickfiltersComponent.ts +13 -7
  231. package/src/quickfilter/QuickfiltersDesignComponent.tsx +127 -128
  232. package/src/richtext/ExprItemsHtmlConverter.ts +9 -5
  233. package/src/richtext/ExprItemsTranslator.ts +176 -0
  234. package/src/richtext/ItemsHtmlConverter.ts +33 -18
  235. package/src/wellknown.ts +33 -30
  236. package/src/widgets/ImageWidget.ts +10 -1
  237. package/src/widgets/ImageWidgetComponent.ts +3 -2
  238. package/src/widgets/{MapWidget.ts → MapWidget.tsx} +90 -101
  239. package/src/widgets/MarkdownWidget.ts +3 -0
  240. package/src/widgets/TOCWidget.tsx +281 -0
  241. package/src/widgets/Widget.ts +25 -5
  242. package/src/widgets/WidgetScopesViewComponent.ts +2 -1
  243. package/src/widgets/charts/Chart.ts +31 -12
  244. package/src/widgets/charts/ChartViewComponent.ts +13 -3
  245. package/src/widgets/charts/ChartWidget.ts +11 -1
  246. package/src/widgets/charts/ChartWidgetComponent.tsx +9 -1
  247. package/src/widgets/charts/calendar/CalendarChart.ts +29 -0
  248. package/src/widgets/charts/calendar/CalendarChartViewComponent.tsx +3 -1
  249. package/src/widgets/charts/imagemosaic/ImageMosaicChart.ts +9 -0
  250. package/src/widgets/charts/layered/LayeredChart.ts +71 -3
  251. package/src/widgets/charts/layered/LayeredChartCompiler.ts +2 -2
  252. package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +4 -2
  253. package/src/widgets/charts/layered/LayeredChartViewComponent.ts +10 -4
  254. package/src/widgets/charts/pivot/PivotChart.ts +73 -0
  255. package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +1 -1
  256. package/src/widgets/charts/pivot/SegmentDesignerComponent.tsx +6 -4
  257. package/src/widgets/charts/table/OrderingsComponent.tsx +2 -1
  258. package/src/widgets/charts/table/TableChart.ts +17 -0
  259. package/src/widgets/text/TextComponent.tsx +22 -12
  260. package/src/widgets/text/TextWidget.ts +9 -2
  261. package/src/widgets/text/TextWidgetComponent.tsx +16 -1
  262. package/src/widgets/text/TextWidgetDesign.ts +4 -7
  263. package/test/IdSelectionTests.ts +54 -0
  264. package/test/LayeredChartCompilerTests.ts +0 -2
  265. package/test/richtext/ExprItemsTranslatorTests.ts +144 -0
  266. package/test/wellknownTests.ts +144 -0
  267. package/src/datagrids/DatagridComponent.ts +0 -478
  268. package/src/datagrids/DatagridViewComponent.ts +0 -464
  269. package/src/datagrids/EditExprCellComponent.tsx +0 -305
  270. package/src/datagrids/README.md +0 -3
  271. package/src/maps/BufferLayerDesignerComponent.ts +0 -311
  272. package/src/widgets/TOCWidget.ts +0 -326
  273. package/test/LegoLayoutEngineTests.ts +0 -69
@@ -5,318 +5,317 @@ 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
- const fixed_data_table_2_1 = require("fixed-data-table-2");
8
+ const react_2 = require("react");
9
+ const GridComponent_1 = require("@mwater/react-library/lib/GridComponent");
10
10
  const expressions_1 = require("@mwater/expressions");
11
11
  const ExprCellComponent_1 = __importDefault(require("./ExprCellComponent"));
12
- const EditExprCellComponent_1 = __importDefault(require("./EditExprCellComponent"));
13
12
  const immer_1 = __importDefault(require("immer"));
14
- /** Datagrid table itself without decorations such as edit button etc.
15
- * See README.md for description of datagrid format
16
- * Design should be cleaned already before being passed in (see DatagridUtils)
17
- */
18
- class DatagridViewComponent extends react_1.default.Component {
19
- static defaultProps = { pageSize: 100 };
20
- loadState;
21
- editCellComp;
22
- constructor(props) {
23
- super(props);
24
- this.state = {
25
- rows: [],
26
- entirelyLoaded: false,
27
- editingCell: null, // set to { rowIndex: 0, 1, 2, columnIndex: 0, 1, 2... } if editing a cell
28
- savingCell: false // True when saving a cell's contents
29
- };
30
- }
31
- componentWillReceiveProps(nextProps) {
32
- // If design or filters changed, delete all rows
33
- // TODO won't this reload on column resize?
34
- if (!lodash_1.default.isEqual(nextProps.design, this.props.design) || !lodash_1.default.isEqual(nextProps.filters, this.props.filters) || nextProps.refreshKey !== this.props.refreshKey) {
35
- this.setState({ rows: [], entirelyLoaded: false });
13
+ const CellEditor_1 = require("./CellEditor");
14
+ const useStableCallback_1 = require("@mwater/react-library/lib/useStableCallback");
15
+ const valueFormatter_1 = require("../valueFormatter");
16
+ const valueFormatter_2 = require("../valueFormatter");
17
+ /** Datagrid view component. It does not show any quick filters, but only the grid itself. */
18
+ const DatagridViewComponent = (0, react_2.forwardRef)((props, ref) => {
19
+ const [rows, setRows] = (0, react_2.useState)([]);
20
+ const [entirelyLoaded, setEntirelyLoaded] = (0, react_2.useState)(false);
21
+ const loadStateRef = (0, react_2.useRef)(null);
22
+ // Get row header width based on selection and showRowNumbers
23
+ const rowHeaderWidth = props.selectedRows
24
+ ? (props.design.showRowNumbers ? 70 : 30) // With selection: 70 for both, 30 for just checkbox
25
+ : (props.design.showRowNumbers ? 50 : 20); // Without selection: 50 for numbers, 20 for neither
26
+ const handleRowSelect = (0, react_2.useCallback)((rowId) => {
27
+ if (props.onSelectedRowsChange) {
28
+ props.onSelectedRowsChange(props.selectedRows.toggle(rowId));
36
29
  }
37
- }
38
- // Loads more rows because the placeholder last row has been rendered
39
- loadMoreRows() {
40
- // Get the current load state (the values that determine what to load and if the loaded results can still be used or are stale)
30
+ }, [props.selectedRows, props.onSelectedRowsChange]);
31
+ const handleSelectAll = (0, react_2.useCallback)(() => {
32
+ if (props.onSelectedRowsChange) {
33
+ props.onSelectedRowsChange(props.selectedRows.all());
34
+ }
35
+ }, [props.selectedRows, props.onSelectedRowsChange]);
36
+ const handleSelectNone = (0, react_2.useCallback)(() => {
37
+ if (props.onSelectedRowsChange) {
38
+ props.onSelectedRowsChange(props.selectedRows.none());
39
+ }
40
+ }, [props.selectedRows, props.onSelectedRowsChange]);
41
+ const handleSelectInvert = (0, react_2.useCallback)(() => {
42
+ if (props.onSelectedRowsChange) {
43
+ props.onSelectedRowsChange(props.selectedRows.invert());
44
+ }
45
+ }, [props.selectedRows, props.onSelectedRowsChange]);
46
+ /** Render top left corner with optional selection dropdown */
47
+ const renderTopLeft = (0, react_2.useCallback)(() => {
48
+ if (!props.selectedRows) {
49
+ return null;
50
+ }
51
+ if (!props.onSelectedRowsChange) {
52
+ return (react_1.default.createElement("div", { style: { padding: 8, textAlign: "right" } },
53
+ react_1.default.createElement("input", { type: "checkbox", checked: false, readOnly: true })));
54
+ }
55
+ return (react_1.default.createElement("div", { className: "dropdown", style: { marginTop: 6 } },
56
+ react_1.default.createElement("div", { style: { textAlign: "center" }, className: "dropdown-toggle", "data-bs-toggle": "dropdown" },
57
+ react_1.default.createElement("input", { type: "checkbox", checked: false, readOnly: true, style: { marginTop: 7 } })),
58
+ react_1.default.createElement("ul", { className: "dropdown-menu" },
59
+ react_1.default.createElement("li", null,
60
+ react_1.default.createElement("a", { className: "dropdown-item", onClick: handleSelectAll }, T `All`)),
61
+ react_1.default.createElement("li", null,
62
+ react_1.default.createElement("a", { className: "dropdown-item", onClick: handleSelectNone }, T `None`)),
63
+ react_1.default.createElement("li", null,
64
+ react_1.default.createElement("a", { className: "dropdown-item", onClick: handleSelectInvert }, T `Invert`)))));
65
+ }, [props.selectedRows, props.onSelectedRowsChange, handleSelectAll, handleSelectNone, handleSelectInvert]);
66
+ /** Render row headers with optional selection checkboxes */
67
+ const renderRowHeader = (0, react_2.useCallback)((options) => {
68
+ const rowHeaderStyle = {
69
+ width: options.width,
70
+ height: options.height,
71
+ display: "flex",
72
+ alignItems: "center",
73
+ overflow: "hidden",
74
+ textOverflow: "ellipsis",
75
+ whiteSpace: "nowrap",
76
+ padding: "0 8px"
77
+ };
78
+ const rowId = options.row < rows.length ? rows[options.row].id : null;
79
+ const isSelected = rowId != null && props.selectedRows ? props.selectedRows.isSelected(rowId) : false;
80
+ const isSubtable = options.row < rows.length ? rows[options.row].subtable >= 0 : false;
81
+ return (react_1.default.createElement("div", { style: rowHeaderStyle },
82
+ 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
+ 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]);
85
+ const loadMoreRows = (0, useStableCallback_1.useStableCallback)((callback) => {
41
86
  const loadState = {
42
- design: this.props.design,
43
- offset: this.state.rows.length,
44
- limit: this.props.pageSize,
45
- filters: this.props.filters
87
+ design: props.design,
88
+ offset: rows.length,
89
+ limit: props.pageSize || 100,
90
+ filters: props.filters
46
91
  };
47
- // If already loading what we want, return
48
- if (lodash_1.default.isEqual(loadState, this.loadState)) {
92
+ if (lodash_1.default.isEqual(loadState, loadStateRef.current)) {
49
93
  return;
50
94
  }
51
- // Record what we're loading
52
- this.loadState = loadState;
53
- // Perform the actual load
54
- this.props.datagridDataSource.getRows(loadState.design, loadState.offset, loadState.limit, loadState.filters, (error, newRows) => {
95
+ loadStateRef.current = loadState;
96
+ props.datagridDataSource.getRows(loadState.design, loadState.offset, loadState.limit, loadState.filters, (error, newRows) => {
55
97
  if (error) {
56
98
  console.error(error);
57
99
  alert(T `Error loading data`);
58
100
  return;
59
101
  }
60
- // Check that the required load state has not changed
61
- if (lodash_1.default.isEqual(loadState, this.loadState)) {
62
- // Load is complete
63
- this.loadState = null;
64
- // Add rows, setting entirelyLoaded based on whether fewer than requested were returned
65
- const rows = this.state.rows.concat(newRows);
66
- return this.setState({ rows, entirelyLoaded: newRows.length < this.props.pageSize });
102
+ if (lodash_1.default.isEqual(loadState, loadStateRef.current)) {
103
+ loadStateRef.current = null;
104
+ setRows(prev => [...prev, ...newRows]);
105
+ setEntirelyLoaded(newRows.length < (props.pageSize || 100));
106
+ callback?.();
67
107
  }
68
108
  });
109
+ });
110
+ function reload() {
111
+ console.log("reload");
112
+ setRows([]);
113
+ setEntirelyLoaded(false);
69
114
  }
70
- // Reloads all data
71
- reload = () => {
72
- return this.setState({ rows: [], entirelyLoaded: false });
73
- };
74
- deleteRow(rowIndex, callback) {
75
- const newRows = this.state.rows.slice();
76
- lodash_1.default.pullAt(newRows, rowIndex);
77
- this.setState({ rows: newRows });
78
- callback();
115
+ // Reset rows when design, filters or refreshKey changes
116
+ (0, react_2.useEffect)(() => {
117
+ reload();
118
+ }, [getDatagridReloadKey(props.design), JSON.stringify(props.filters), props.refreshKey]);
119
+ function getRows() {
120
+ return rows;
79
121
  }
80
- /** Reload a single row by index and id. Note that the row might be in a different
81
- * ordinal position within the datagrid, or might have vanished from view if the change
82
- * caused the row to be excluded by the filter. Always replace
83
- * it where it was, unless it has disappeared from view in which case the row
84
- * is removed.
85
- */
86
- reloadRow(rowIndex, rowId, callback) {
87
- // Create new filters that only include one row
88
- const filters = (0, immer_1.default)(this.props.filters || [], draft => {
122
+ function reloadRow(rowIndex, rowId, callback) {
123
+ const filters = (0, immer_1.default)(props.filters || [], draft => {
89
124
  draft.push({
90
- table: this.props.design.table,
125
+ table: props.design.table,
91
126
  jsonql: {
92
127
  type: "op",
93
128
  op: "=",
94
129
  exprs: [
95
- { type: "field", tableAlias: "{alias}", column: this.props.schema.getTable(this.props.design.table)?.primaryKey },
130
+ { type: "field", tableAlias: "{alias}", column: props.schema.getTable(props.design.table)?.primaryKey },
96
131
  { type: "literal", value: rowId }
97
132
  ]
98
133
  }
99
134
  });
100
135
  });
101
- this.props.datagridDataSource.getRows(this.props.design, 0, 1, filters, (error, rows) => {
136
+ props.datagridDataSource.getRows(props.design, 0, 1, filters, (error, newRows) => {
102
137
  if (error) {
103
138
  console.error(error);
104
139
  alert(T `Error loading data`);
105
140
  callback();
106
141
  return;
107
142
  }
108
- const newRows = (0, immer_1.default)(this.state.rows, draft => {
109
- if (rows[0]) {
110
- draft[rowIndex] = rows[0];
143
+ setRows(currentRows => (0, immer_1.default)(currentRows, draft => {
144
+ if (newRows[0]) {
145
+ draft[rowIndex] = newRows[0];
111
146
  }
112
147
  else {
113
- // If row missing, remove it from list
114
148
  draft.splice(rowIndex, 1);
115
149
  }
116
- });
117
- this.setState({ rows: newRows });
150
+ }));
118
151
  callback();
119
152
  });
120
153
  }
121
- handleColumnResize = (newColumnWidth, columnKey) => {
122
- // Find index of column
123
- const columnIndex = lodash_1.default.findIndex(this.props.design.columns, { id: columnKey });
124
- // Set new width
125
- let column = this.props.design.columns[columnIndex];
126
- column = lodash_1.default.extend({}, column, { width: newColumnWidth });
127
- // Re-add to list
128
- const columns = this.props.design.columns.slice();
129
- columns[columnIndex] = column;
130
- this.props.onDesignChange(lodash_1.default.extend({}, this.props.design, { columns }));
131
- };
132
- handleCellClick = (rowIndex, columnIndex) => {
133
- // Ignore if already editing
134
- if (this.state.editingCell?.rowIndex === rowIndex && this.state.editingCell?.columnIndex === columnIndex) {
135
- return;
154
+ function deleteRow(rowIndex, callback) {
155
+ const newRows = rows.slice();
156
+ newRows.splice(rowIndex, 1);
157
+ setRows(newRows);
158
+ callback();
159
+ }
160
+ // Expose methods via ref
161
+ (0, react_2.useImperativeHandle)(ref, () => ({
162
+ getRows: getRows,
163
+ getEntirelyLoaded: () => entirelyLoaded,
164
+ reload: reload,
165
+ reloadRow: reloadRow,
166
+ deleteRow: deleteRow,
167
+ loadMoreRows: loadMoreRows
168
+ }), [rows, entirelyLoaded, reload, reloadRow, deleteRow, loadMoreRows]);
169
+ const handleColWidthsChange = (0, useStableCallback_1.useStableCallback)((colWidths) => {
170
+ const columns = props.design.columns.map((col, index) => ({
171
+ ...col,
172
+ width: colWidths[index]
173
+ }));
174
+ props.onDesignChange?.({ ...props.design, columns });
175
+ });
176
+ const updateCellValue = (0, useStableCallback_1.useStableCallback)(async (value, rowIndex, colIndex) => {
177
+ try {
178
+ const rowId = rows[rowIndex].id;
179
+ const { expr } = props.design.columns[colIndex];
180
+ await props.updateExprValues(props.design.table, [{ primaryKey: rowId, expr, value }]);
181
+ await new Promise(resolve => {
182
+ reloadRow(rowIndex, rowId, resolve);
183
+ });
184
+ return true;
136
185
  }
137
- // Ignore if saving
138
- if (this.state.savingCell) {
139
- return;
186
+ catch (error) {
187
+ alert(T `Error saving data`);
188
+ console.error(error);
189
+ return false;
140
190
  }
141
- // Save editing if editing and return
142
- if (this.state.editingCell) {
143
- this.handleSaveEdit();
144
- return;
191
+ });
192
+ const handleRowDoubleClick = (0, useStableCallback_1.useStableCallback)((rowIndex) => {
193
+ if (props.onRowDoubleClick != null && rows[rowIndex]?.id) {
194
+ props.onRowDoubleClick(props.design.table, rows[rowIndex].id, rowIndex);
195
+ return true;
145
196
  }
146
- // Check if can edit
147
- if (!this.props.canEditExpr) {
148
- return;
197
+ return false;
198
+ });
199
+ const handleRowClick = (0, useStableCallback_1.useStableCallback)((rowIndex) => {
200
+ if (props.onRowClick != null && rows[rowIndex]?.id) {
201
+ props.onRowClick(props.design.table, rows[rowIndex].id, rowIndex);
202
+ return true;
149
203
  }
150
- // Get column
151
- const column = this.props.design.columns[columnIndex];
152
- // Get expression type
153
- const exprType = new expressions_1.ExprUtils(this.props.schema).getExprType(column.expr);
154
- // If cannot edit type, return
155
- if (!["text", "number", "enum", "date", "datetime"].includes(exprType)) {
204
+ return false;
205
+ });
206
+ const handleCopy = (0, useStableCallback_1.useStableCallback)((rowIndex, colIndex) => {
207
+ const row = rows[rowIndex];
208
+ const col = props.design.columns[colIndex];
209
+ const value = row[`c${colIndex}`];
210
+ // Format value as text using ExprCellComponent logic
211
+ const exprUtils = new expressions_1.ExprUtils(props.schema);
212
+ const exprType = exprUtils.getExprType(col.expr);
213
+ if (!exprType) {
156
214
  return;
157
215
  }
158
- // Get row id
159
- const rowId = this.state.rows[rowIndex].id;
160
- if (rowId == null) {
161
- // No row id means aggregated table. Cannot edti
162
- return;
216
+ let formattedValue = value;
217
+ // Parse JSON values
218
+ if (["image", "imagelist", "geometry", "text[]"].includes(exprType) && lodash_1.default.isString(value)) {
219
+ formattedValue = JSON.parse(value);
163
220
  }
164
- this.props.canEditExpr(this.props.design.table, rowId, column.expr)
165
- .then(canEdit => {
166
- if (canEdit) {
167
- // Start editing
168
- this.setState({ editingCell: { rowIndex, columnIndex, rowId } });
169
- }
170
- }).catch(error => {
171
- console.error(error);
172
- });
173
- };
174
- // Called to save
175
- handleSaveEdit = () => {
176
- // Ignore if not changed
177
- if (!this.editCellComp || !this.editCellComp.hasChanged()) {
178
- this.setState({ editingCell: null, savingCell: false });
179
- return;
221
+ // Format based on type
222
+ if ((0, valueFormatter_2.canFormatType)(exprType)) {
223
+ formattedValue = (0, valueFormatter_1.formatValue)(exprType, formattedValue, col.format);
180
224
  }
181
- const rowId = this.state.editingCell.rowId;
182
- const { expr } = this.props.design.columns[this.state.editingCell.columnIndex];
183
- const value = this.editCellComp.getValue();
184
- this.setState({ savingCell: true }, () => {
185
- this.props.updateExprValues(this.props.design.table, [{ primaryKey: rowId, expr, value }])
186
- .then(() => {
187
- // Reload row
188
- this.reloadRow(this.state.editingCell.rowIndex, rowId, () => {
189
- this.setState({ editingCell: null, savingCell: false });
190
- });
191
- }).catch(error => {
192
- alert(T `Error saving data`);
193
- console.error(error);
194
- });
195
- });
196
- };
197
- handleCancelEdit = () => {
198
- this.setState({ editingCell: null, savingCell: false });
199
- };
200
- // Called with current ref edit. Save
201
- refEditCell = (comp) => {
202
- this.editCellComp = comp;
203
- };
204
- handleRowDoubleClick = (ev, rowIndex) => {
205
- if (this.props.onRowDoubleClick != null && this.state.rows[rowIndex]?.id) {
206
- this.props.onRowDoubleClick(this.props.design.table, this.state.rows[rowIndex].id, rowIndex);
225
+ else {
226
+ formattedValue = exprUtils.stringifyExprLiteral(col.expr, formattedValue, props.design.locale);
207
227
  }
208
- };
209
- handleRowClick = (ev, rowIndex) => {
210
- if (this.props.onRowClick != null && this.state.rows[rowIndex].id) {
211
- this.props.onRowClick(this.props.design.table, this.state.rows[rowIndex].id, rowIndex);
228
+ navigator.clipboard.writeText(formattedValue || "");
229
+ });
230
+ const renderCell = (0, useStableCallback_1.useStableCallback)((options) => {
231
+ if (options.row >= rows.length) {
232
+ lodash_1.default.defer(() => loadMoreRows());
233
+ return react_1.default.createElement("div", { style: { padding: 8 } },
234
+ react_1.default.createElement("i", { className: "fa fa-spinner fa-spin text-muted" }));
212
235
  }
213
- };
214
- // Render a single cell. exprType is passed in for performance purposes and is calculated once per column
215
- renderCell = (column, columnIndex, exprType, cellProps) => {
216
- // If rendering placeholder row
217
- if (cellProps.rowIndex >= this.state.rows.length) {
218
- // Load next tick as cannot update while rendering
219
- lodash_1.default.defer(() => {
220
- this.loadMoreRows();
221
- });
222
- return R(fixed_data_table_2_1.Cell, cellProps, R("i", { className: "fa fa-spinner fa-spin" }));
236
+ if (options.col === -1) {
237
+ return (react_1.default.createElement("div", { style: { padding: 8, textAlign: "right" } }, options.row + 1));
223
238
  }
224
- // Special case for row number
225
- if (columnIndex === -1) {
226
- return R(fixed_data_table_2_1.Cell, {
227
- width: cellProps.width,
228
- height: cellProps.height,
229
- style: {
230
- whiteSpace: "nowrap",
231
- textAlign: "right"
232
- }
233
- }, cellProps.rowIndex + 1);
239
+ const column = props.design.columns[options.col];
240
+ const exprUtils = new expressions_1.ExprUtils(props.schema);
241
+ const exprType = exprUtils.getExprType(column.expr);
242
+ const value = rows[options.row][`c${options.col}`];
243
+ if (column.type === "expr" && exprType) {
244
+ const muted = !column.subtable && rows[options.row].subtable >= 0;
245
+ return react_1.default.createElement("div", { style: { width: options.width, height: options.height } },
246
+ react_1.default.createElement(ExprCellComponent_1.default, { schema: props.schema, dataSource: props.dataSource, locale: props.design.locale, width: options.width, height: options.height, value: value, expr: column.expr, format: column.format, exprType: exprType, muted: muted }));
234
247
  }
235
- // Get value (columns are c0, c1, c2, etc.)
236
- const value = this.state.rows[cellProps.rowIndex][`c${columnIndex}`];
237
- // Render special if editing
238
- if (this.state.editingCell?.rowIndex === cellProps.rowIndex &&
239
- this.state.editingCell?.columnIndex === columnIndex) {
240
- // Special if saving
241
- if (this.state.savingCell) {
242
- return R(fixed_data_table_2_1.Cell, cellProps, R("i", { className: "fa fa-spinner fa-spin" }));
243
- }
244
- return R(EditExprCellComponent_1.default, {
245
- ref: this.refEditCell,
246
- schema: this.props.schema,
247
- dataSource: this.props.dataSource,
248
- locale: this.props.design.locale,
249
- width: cellProps.width,
250
- height: cellProps.height,
251
- value,
252
- expr: column.expr,
253
- onSave: this.handleSaveEdit,
254
- onCancel: this.handleCancelEdit
255
- });
248
+ return null;
249
+ });
250
+ const renderColHeader = (0, useStableCallback_1.useStableCallback)((options) => {
251
+ if (options.col === -1) {
252
+ return (react_1.default.createElement("div", { style: {
253
+ padding: 5,
254
+ textAlign: "right",
255
+ fontWeight: "bold",
256
+ height: "100%",
257
+ display: "flex",
258
+ alignItems: "center",
259
+ justifyContent: "flex-end"
260
+ } }, "#"));
256
261
  }
257
- if (column.type === "expr") {
258
- // Muted if from main and are displaying subtable
259
- const muted = !column.subtable && this.state.rows[cellProps.rowIndex].subtable >= 0;
260
- return R(ExprCellComponent_1.default, {
261
- schema: this.props.schema,
262
- dataSource: this.props.dataSource,
263
- locale: this.props.design.locale,
264
- width: cellProps.width,
265
- height: cellProps.height,
266
- value,
267
- expr: column.expr,
268
- format: column.format,
269
- exprType,
270
- muted,
271
- onClick: this.handleCellClick.bind(null, cellProps.rowIndex, columnIndex)
272
- });
262
+ const column = props.design.columns[options.col];
263
+ const exprUtils = new expressions_1.ExprUtils(props.schema);
264
+ return (react_1.default.createElement("div", { style: {
265
+ padding: 5,
266
+ whiteSpace: "nowrap",
267
+ fontWeight: "bold",
268
+ height: "100%",
269
+ display: "flex",
270
+ alignItems: "center"
271
+ } }, column.label || exprUtils.summarizeExpr(column.expr, props.design.locale)));
272
+ });
273
+ const renderCellEditor = (0, useStableCallback_1.useStableCallback)((options) => {
274
+ if (options.row >= rows.length) {
275
+ return react_1.default.createElement("div", null);
273
276
  }
274
- return null;
275
- };
276
- // Render a single column
277
- renderColumn(column, columnIndex) {
278
- const exprUtils = new expressions_1.ExprUtils(this.props.schema);
279
- // Get expression type
280
- const exprType = exprUtils.getExprType(column.expr);
281
- return R(fixed_data_table_2_1.Column, {
282
- key: column.id,
283
- header: R(fixed_data_table_2_1.Cell, { style: { whiteSpace: "nowrap" } }, column.label || exprUtils.summarizeExpr(column.expr, this.props.design.locale)),
284
- width: column.width,
285
- allowCellsRecycling: true,
286
- cell: this.renderCell.bind(null, column, columnIndex, exprType),
287
- columnKey: column.id,
288
- isResizable: this.props.onDesignChange != null
289
- });
290
- }
291
- // Render all columns
292
- renderColumns() {
293
- const columns = lodash_1.default.map(this.props.design.columns, (column, columnIndex) => this.renderColumn(column, columnIndex));
294
- if (this.props.design.showRowNumbers) {
295
- columns.unshift(this.renderColumn({
296
- label: "#",
297
- width: 50
298
- }, -1));
277
+ const column = props.design.columns[options.col];
278
+ const value = rows[options.row][`c${options.col}`];
279
+ const expr = column.expr;
280
+ const exprUtils = new expressions_1.ExprUtils(props.schema);
281
+ const exprType = exprUtils.getExprType(expr);
282
+ const enumValues = exprUtils.getExprEnumValues(expr) ?? undefined;
283
+ const idTable = exprUtils.getExprIdTable(expr) ?? undefined;
284
+ return (react_1.default.createElement(CellEditor_1.CellEditor, { type: exprType, enumValues: enumValues, idTable: idTable, schema: props.schema, dataSource: props.dataSource, initialValue: value, updateCellValue: value => updateCellValue(value, options.row, options.col), editorOptions: options }));
285
+ });
286
+ const canEdit = (0, useStableCallback_1.useStableCallback)(async (options) => {
287
+ if (options.col === -1) {
288
+ return false;
299
289
  }
300
- return columns;
301
- }
302
- render() {
303
- let rowsCount = this.state.rows.length;
304
- // Add loading row if not entirely loaded
305
- if (!this.state.entirelyLoaded) {
306
- rowsCount += 1;
290
+ const rowId = rows[options.row].id;
291
+ if (rowId == null) {
292
+ return false;
307
293
  }
308
- return R(fixed_data_table_2_1.Table, {
309
- rowsCount,
310
- rowHeight: 40,
311
- headerHeight: 40,
312
- width: this.props.width,
313
- height: this.props.height,
314
- onRowDoubleClick: this.handleRowDoubleClick,
315
- onRowClick: this.handleRowClick,
316
- isColumnResizing: false,
317
- onColumnResizeEndCallback: this.handleColumnResize,
318
- touchScrollEnabled: true
319
- }, this.renderColumns());
294
+ if (!props.canEditExpr) {
295
+ return false;
296
+ }
297
+ const column = props.design.columns[options.col];
298
+ const exprType = new expressions_1.ExprUtils(props.schema).getExprType(column.expr);
299
+ if (!(0, CellEditor_1.canEditType)(exprType)) {
300
+ return false;
301
+ }
302
+ return props.canEditExpr(props.design.table, rowId, column.expr);
303
+ });
304
+ let numRows = rows.length;
305
+ if (!entirelyLoaded) {
306
+ numRows += 1;
320
307
  }
321
- }
308
+ const colWidths = props.design.columns.map(col => col.width || 200);
309
+ return (react_1.default.createElement(GridComponent_1.GridComponent, { width: props.width, height: props.height, numRows: numRows, colWidths: colWidths, colHeaderHeight: 40, rowHeight: 40, renderCell: renderCell, renderColHeader: renderColHeader, renderCellEditor: renderCellEditor, canEdit: canEdit, onColWidthsChange: handleColWidthsChange, onRowDoubleClick: handleRowDoubleClick, onRowClick: handleRowClick, rowHeaderWidth: rowHeaderWidth, renderRowHeader: renderRowHeader, renderTopLeft: renderTopLeft, onCopy: handleCopy }));
310
+ });
322
311
  exports.default = DatagridViewComponent;
312
+ /** Get a unique key for a datagrid design, ignoring column widths which don't affect data */
313
+ function getDatagridReloadKey(design) {
314
+ // Create copy without column widths
315
+ const designWithoutWidths = (0, immer_1.default)(design, draft => {
316
+ for (const column of draft.columns) {
317
+ column.width = 0;
318
+ }
319
+ });
320
+ return JSON.stringify(designWithoutWidths);
321
+ }
@@ -48,7 +48,7 @@ class DirectDatagridDataSource {
48
48
  limit,
49
49
  extraFilters: filters
50
50
  });
51
- return this.options.dataSource.performQuery(query, callback);
51
+ this.options.dataSource.performQuery(query, callback);
52
52
  }
53
53
  countRows(design, filters, callback) {
54
54
  const queryBuilder = new DatagridQueryBuilder_1.default(this.options.schema);
@@ -70,8 +70,7 @@ class DirectDatagridDataSource {
70
70
  }
71
71
  ]
72
72
  };
73
- console.log(countQuery);
74
- return this.options.dataSource.performQuery(countQuery, (error, rows) => {
73
+ this.options.dataSource.performQuery(countQuery, (error, rows) => {
75
74
  callback(error, rows?.[0]?.cnt);
76
75
  });
77
76
  }
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
- import { DataSource, LiteralType, Schema } from "@mwater/expressions";
3
- import { Cell } from "fixed-data-table-2";
2
+ import { DataSource, Expr, LiteralType, Schema } from "@mwater/expressions";
4
3
  export interface ExprCellComponentProps {
5
4
  /** schema to use */
6
5
  schema: Schema;
@@ -14,21 +13,15 @@ export interface ExprCellComponentProps {
14
13
  width: number;
15
14
  height: number;
16
15
  value?: any;
17
- expr?: any;
16
+ expr?: Expr;
18
17
  /** True to show muted */
19
18
  muted?: boolean;
20
- onClick?: any;
19
+ /** Called when clicked */
20
+ onClick?: () => void;
21
+ /** Called when double clicked */
22
+ onDoubleClick?: () => void;
21
23
  }
22
24
  export default class ExprCellComponent extends React.Component<ExprCellComponentProps> {
23
- handleClick: () => void;
24
- renderImage(id: any): React.DetailedReactHTMLElement<{
25
- href: string;
26
- key: any;
27
- target: string;
28
- style: {
29
- paddingLeft: number;
30
- paddingRight: number;
31
- };
32
- }, HTMLElement>;
33
- render(): React.CElement<import("fixed-data-table-2").CellProps, Cell>;
25
+ renderImage(id: string): React.JSX.Element;
26
+ render(): React.JSX.Element;
34
27
  }