@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
@@ -12,35 +12,10 @@ export interface QuickfiltersDesignComponentProps {
12
12
  tables: string[];
13
13
  }
14
14
  export default class QuickfiltersDesignComponent extends React.Component<QuickfiltersDesignComponentProps> {
15
- handleDesignChange: (design: any) => void;
16
- isMergeable(design: any, index: any): boolean;
17
- renderQuickfilter: (item: any, index: any) => React.CElement<any, QuickfilterDesignComponent>;
15
+ handleDesignChange: (design: Quickfilter[]) => void;
16
+ isMergeable(design: Quickfilter[], index: number): boolean;
17
+ renderQuickfilter: (item: Quickfilter, index: number) => React.JSX.Element;
18
18
  handleAdd: () => void;
19
- handleRemove: (index: any) => void;
20
- render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
19
+ handleRemove: (index: number) => void;
20
+ render(): React.JSX.Element;
21
21
  }
22
- interface QuickfilterDesignComponentProps {
23
- /** Design of a single quickfilters. See README.md */
24
- design: Quickfilter;
25
- onChange: (design: Quickfilter) => void;
26
- onRemove: () => void;
27
- /** True if can be merged */
28
- mergeable?: boolean;
29
- schema: Schema;
30
- dataSource: DataSource;
31
- tables: string[];
32
- }
33
- interface QuickfilterDesignComponentState {
34
- table: any;
35
- }
36
- /** Single quickfilter design component */
37
- declare class QuickfilterDesignComponent extends React.Component<QuickfilterDesignComponentProps, QuickfilterDesignComponentState> {
38
- constructor(props: any);
39
- handleTableChange: (table: any) => void;
40
- handleExprChange: (expr: any) => void;
41
- handleLabelChange: (ev: any) => void;
42
- handleMergedChange: (merged: any) => void;
43
- handleMultiChange: (multi: any) => void;
44
- render(): React.DetailedReactHTMLElement<{}, HTMLElement>;
45
- }
46
- export {};
@@ -28,8 +28,8 @@ 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 = __importDefault(require("react"));
31
- const R = react_1.default.createElement;
32
- const update_object_1 = __importDefault(require("update-object"));
31
+ const uuid_1 = __importDefault(require("uuid"));
32
+ const immer_1 = require("immer");
33
33
  const expressions_ui_1 = require("@mwater/expressions-ui");
34
34
  const expressions_1 = require("@mwater/expressions");
35
35
  const ui = __importStar(require("@mwater/react-library/lib/bootstrap"));
@@ -37,14 +37,22 @@ const ListEditorComponent_1 = require("@mwater/react-library/lib/ListEditorCompo
37
37
  // Displays quick filters and allows their value to be modified
38
38
  class QuickfiltersDesignComponent extends react_1.default.Component {
39
39
  handleDesignChange = (design) => {
40
- design = design.slice();
41
- // Update merged, clearing if not mergeable
42
- for (let index = 0, end = design.length, asc = 0 <= end; asc ? index < end : index > end; asc ? index++ : index--) {
43
- if (design[index].merged && !this.isMergeable(design, index)) {
44
- design[index] = lodash_1.default.extend({}, design[index], { merged: false });
40
+ // Use immer produce to create immutable update
41
+ const newDesign = (0, immer_1.produce)(design, draft => {
42
+ // Add UUID if missing
43
+ for (let i = 0; i < draft.length; i++) {
44
+ if (!draft[i].id) {
45
+ draft[i].id = uuid_1.default.v4();
46
+ }
45
47
  }
46
- }
47
- return this.props.onDesignChange(design);
48
+ // Update merged flag, clearing if not mergeable
49
+ for (let i = 0; i < draft.length; i++) {
50
+ if (draft[i].merged && !this.isMergeable(draft, i)) {
51
+ draft[i].merged = false;
52
+ }
53
+ }
54
+ });
55
+ this.props.onDesignChange(newDesign);
48
56
  };
49
57
  // Determine if quickfilter at index is mergeable with previous (same type, id table and enum values)
50
58
  isMergeable(design, index) {
@@ -75,35 +83,28 @@ class QuickfiltersDesignComponent extends react_1.default.Component {
75
83
  return true;
76
84
  }
77
85
  renderQuickfilter = (item, index) => {
78
- return R(QuickfilterDesignComponent, {
79
- key: index,
80
- design: item,
81
- schema: this.props.schema,
82
- dataSource: this.props.dataSource,
83
- tables: this.props.tables,
84
- mergeable: this.isMergeable(this.props.design, index),
85
- onChange: (newItem) => {
86
+ return react_1.default.createElement(QuickfilterDesignComponent, { key: index, design: item, schema: this.props.schema, dataSource: this.props.dataSource, tables: this.props.tables, mergeable: this.isMergeable(this.props.design, index), onChange: (newItem) => {
86
87
  const design = this.props.design.slice();
87
88
  design[index] = newItem;
88
89
  return this.handleDesignChange(design);
89
- },
90
- onRemove: this.handleRemove.bind(null, index)
91
- });
90
+ }, onRemove: this.handleRemove.bind(null, index) });
92
91
  };
93
92
  handleAdd = () => {
94
93
  // Add blank to end
95
94
  const design = this.props.design.concat([{ expr: null }]);
96
- return this.props.onDesignChange(design);
95
+ this.props.onDesignChange(design);
97
96
  };
98
97
  handleRemove = (index) => {
99
98
  const design = this.props.design.slice();
100
99
  design.splice(index, 1);
101
- return this.props.onDesignChange(design);
100
+ this.props.onDesignChange(design);
102
101
  };
103
102
  render() {
104
- return R("div", null, react_1.default.createElement(ListEditorComponent_1.ListEditorComponent, { items: this.props.design, onItemsChange: this.handleDesignChange, renderItem: this.renderQuickfilter, getReorderableKey: (item, index) => index }), this.props.tables.length > 0
105
- ? R("button", { type: "button", className: "btn btn-sm btn-link", onClick: this.handleAdd }, R("span", { className: "fas fa-plus" }), T `Add Quick Filter`)
106
- : undefined);
103
+ return (react_1.default.createElement("div", null,
104
+ react_1.default.createElement(ListEditorComponent_1.ListEditorComponent, { items: this.props.design, onItemsChange: this.handleDesignChange, renderItem: this.renderQuickfilter, getReorderableKey: (item, index) => item.id || index }),
105
+ this.props.tables.length > 0 ? (react_1.default.createElement("button", { type: "button", className: "btn btn-sm btn-link", onClick: this.handleAdd },
106
+ react_1.default.createElement("span", { className: "fas fa-plus me-1" }),
107
+ T `Add Quick Filter`)) : undefined));
107
108
  }
108
109
  }
109
110
  exports.default = QuickfiltersDesignComponent;
@@ -124,53 +125,45 @@ class QuickfilterDesignComponent extends react_1.default.Component {
124
125
  return this.props.onChange(design);
125
126
  };
126
127
  handleExprChange = (expr) => {
127
- return this.props.onChange((0, update_object_1.default)(this.props.design, { expr: { $set: expr } }));
128
+ this.props.onChange((0, immer_1.produce)(this.props.design, draft => {
129
+ draft.expr = expr;
130
+ }));
128
131
  };
129
132
  handleLabelChange = (ev) => {
130
- return this.props.onChange((0, update_object_1.default)(this.props.design, { label: { $set: ev.target.value } }));
133
+ this.props.onChange((0, immer_1.produce)(this.props.design, draft => {
134
+ draft.label = ev.target.value;
135
+ }));
131
136
  };
132
137
  handleMergedChange = (merged) => {
133
- return this.props.onChange((0, update_object_1.default)(this.props.design, { merged: { $set: merged } }));
138
+ this.props.onChange((0, immer_1.produce)(this.props.design, draft => {
139
+ draft.merged = merged;
140
+ }));
134
141
  };
135
142
  handleMultiChange = (multi) => {
136
- return this.props.onChange((0, update_object_1.default)(this.props.design, { multi: { $set: multi } }));
143
+ this.props.onChange((0, immer_1.produce)(this.props.design, draft => {
144
+ draft.multi = multi;
145
+ }));
137
146
  };
138
147
  render() {
139
148
  // Determine type of expression
140
149
  const exprType = new expressions_1.ExprUtils(this.props.schema).getExprType(this.props.design.expr);
141
- return R("div", {}, R("div", { className: "mb-3 mt-1", key: "table" }, R("label", { className: "text-muted" }, T `Data Source`), R(ui.Select, {
142
- value: this.state.table,
143
- options: lodash_1.default.map(this.props.tables, (table) => ({
144
- value: table,
145
- label: expressions_1.ExprUtils.localizeString(this.props.schema.getTable(table).name)
146
- })),
147
- onChange: this.handleTableChange,
148
- nullLabel: T `Select...`
149
- })), R("div", { className: "mb-3", key: "expr" }, R("label", { className: "text-muted" }, T `Filter By`), R("div", null, R(expressions_ui_1.ExprComponent, {
150
- schema: this.props.schema,
151
- dataSource: this.props.dataSource,
152
- table: this.state.table,
153
- value: this.props.design.expr,
154
- onChange: this.handleExprChange,
155
- types: ["enum", "text", "enumset", "date", "datetime", "id[]", "text[]"],
156
- }))), this.props.design.expr
157
- ? R("div", { className: "mb-3", key: "label" }, R("label", { className: "text-muted" }, T `Label`), R("input", {
158
- type: "text",
159
- className: "form-control form-control-sm",
160
- value: this.props.design.label || "",
161
- onChange: this.handleLabelChange,
162
- placeholder: T `Optional Label`
163
- }))
164
- : undefined, this.props.mergeable
165
- ? R(ui.Checkbox, {
166
- value: this.props.design.merged,
167
- onChange: this.handleMergedChange
168
- }, T `Merge with previous quickfilter `, R("span", { className: "text-muted" }, T `- displays as one single control that filters both`))
169
- : undefined, ["enum", "text", "enumset", "id[]", "text[]"].includes(exprType)
170
- ? R(ui.Checkbox, {
171
- value: this.props.design.multi,
172
- onChange: this.handleMultiChange
173
- }, T `Allow multiple selections`)
174
- : undefined);
150
+ return (react_1.default.createElement("div", null,
151
+ react_1.default.createElement("div", { className: "mb-3 mt-1", key: "table" },
152
+ react_1.default.createElement("label", { className: "text-muted" }, T `Data Source`),
153
+ react_1.default.createElement(ui.Select, { value: this.state.table, options: lodash_1.default.map(this.props.tables, (table) => ({
154
+ value: table,
155
+ label: expressions_1.ExprUtils.localizeString(this.props.schema.getTable(table).name)
156
+ })), onChange: this.handleTableChange, nullLabel: T `Select...` })),
157
+ react_1.default.createElement("div", { className: "mb-3", key: "expr" },
158
+ react_1.default.createElement("label", { className: "text-muted" }, T `Filter By`),
159
+ react_1.default.createElement("div", null,
160
+ react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.state.table, value: this.props.design.expr, onChange: this.handleExprChange, types: ["enum", "text", "enumset", "date", "datetime", "id[]", "text[]"] }))),
161
+ this.props.design.expr ? (react_1.default.createElement("div", { className: "mb-3", key: "label" },
162
+ react_1.default.createElement("label", { className: "text-muted" }, T `Label`),
163
+ react_1.default.createElement("input", { type: "text", className: "form-control form-control-sm", value: this.props.design.label || "", onChange: this.handleLabelChange, placeholder: T `Optional Label` }))) : undefined,
164
+ this.props.mergeable ? (react_1.default.createElement(ui.Checkbox, { value: this.props.design.merged, onChange: this.handleMergedChange },
165
+ T `Merge with previous quickfilter `,
166
+ react_1.default.createElement("span", { className: "text-muted" }, `- ${T `displays as one single control that filters both`}`))) : undefined,
167
+ ["enum", "text", "enumset", "id[]", "text[]"].includes(exprType) ? (react_1.default.createElement(ui.Checkbox, { value: this.props.design.multi, onChange: this.handleMultiChange }, T `Allow multiple selections`)) : undefined));
175
168
  }
176
169
  }
@@ -1,5 +1,6 @@
1
- import ItemsHtmlConverter, { HtmlItemBase } from "./ItemsHtmlConverter";
1
+ import ItemsHtmlConverter, { HtmlItem, HtmlItemBase } from "./ItemsHtmlConverter";
2
2
  import { Expr, Schema } from "@mwater/expressions";
3
+ /** Html item that is an expression */
3
4
  export interface HtmlItemExpr extends HtmlItemBase {
4
5
  type: "expr";
5
6
  /** unique id */
@@ -13,6 +14,8 @@ export interface HtmlItemExpr extends HtmlItemBase {
13
14
  /** d3 format if number */
14
15
  format?: string;
15
16
  }
17
+ /** Html item that is an expression or a normal item */
18
+ export type HtmlItemOrExpr = HtmlItem | HtmlItemExpr;
16
19
  /**
17
20
  * ItemsHtmlConverter that supports embedded mwater expressions
18
21
  * Converts items (JSON contents of rich text) to HTML and back to allow editing
@@ -35,5 +38,5 @@ export default class ExprItemsHtmlConverter extends ItemsHtmlConverter {
35
38
  [key: string]: string;
36
39
  }, locale?: string);
37
40
  convertSpecialItemToHtml(item: HtmlItemBase): string;
38
- convertElemToItems(elem: HTMLElement): import("./ItemsHtmlConverter").HtmlItem[];
41
+ convertElemToItems(elem: HTMLElement): HtmlItem[];
39
42
  }
@@ -46,7 +46,7 @@ class ExprItemsHtmlConverter extends ItemsHtmlConverter_1.default {
46
46
  if (this.summarizeExprs) {
47
47
  text = new expressions_1.ExprUtils(this.schema).summarizeExpr(exprItem.expr, this.locale);
48
48
  if (text.length > 30) {
49
- text = text.substr(0, 30) + T `...`;
49
+ text = text.substr(0, 30) + `...`;
50
50
  }
51
51
  exprHtml = lodash_1.default.escape(text);
52
52
  }
@@ -67,7 +67,7 @@ class ExprItemsHtmlConverter extends ItemsHtmlConverter_1.default {
67
67
  exprHtml = lodash_1.default.escape(text);
68
68
  }
69
69
  else {
70
- exprHtml = `<span style="color: #DDD">${T `---`}</span>`;
70
+ exprHtml = `<span style="color: #DDD">${`---`}</span>`;
71
71
  }
72
72
  }
73
73
  else {
@@ -76,13 +76,13 @@ class ExprItemsHtmlConverter extends ItemsHtmlConverter_1.default {
76
76
  }
77
77
  // Add label
78
78
  if (exprItem.includeLabel) {
79
- const label = exprItem.labelText || new expressions_1.ExprUtils(this.schema).summarizeExpr(exprItem.expr, this.locale) + T `:\u00A0`;
79
+ const label = exprItem.labelText || new expressions_1.ExprUtils(this.schema).summarizeExpr(exprItem.expr, this.locale) + `:\u00A0`;
80
80
  exprHtml = `<span class="text-muted">${lodash_1.default.escape(label)}</span>` + exprHtml;
81
81
  }
82
82
  if (this.designMode) {
83
83
  html +=
84
84
  `\u2060<span data-embed="${lodash_1.default.escape(JSON.stringify(item))}" class="mwater-visualization-text-widget-expr">` +
85
- (exprHtml || T `\u00A0`) +
85
+ (exprHtml || `\u00A0`) +
86
86
  `</span>\u2060`;
87
87
  }
88
88
  else {
@@ -0,0 +1,5 @@
1
+ import { HtmlItemOrExpr } from "./ExprItemsHtmlConverter";
2
+ /** Gets all unique strings from html items */
3
+ export declare function getHtmlItemsStrings(items: HtmlItemOrExpr[]): string[];
4
+ /** Translates items in an html items list with expressions */
5
+ export declare function translateHtmlItems(items: HtmlItemOrExpr[], translate: (input: string) => string): HtmlItemOrExpr[];
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getHtmlItemsStrings = getHtmlItemsStrings;
7
+ exports.translateHtmlItems = translateHtmlItems;
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const immer_1 = require("immer");
10
+ const ItemsHtmlConverter_1 = __importDefault(require("./ItemsHtmlConverter"));
11
+ /** Gets all unique strings from html items */
12
+ function getHtmlItemsStrings(items) {
13
+ const strings = new Set();
14
+ // Create collector function that just saves strings and returns them unchanged
15
+ const collectStrings = (str) => {
16
+ // Only collect non-empty strings
17
+ if (str) {
18
+ strings.add(str);
19
+ }
20
+ return str;
21
+ };
22
+ // Use existing translation function but with collector
23
+ translateHtmlItems(items, collectStrings);
24
+ return Array.from(strings);
25
+ }
26
+ /** Translates items in an html items list with expressions */
27
+ function translateHtmlItems(items, translate) {
28
+ return (0, immer_1.produce)(items, draft => {
29
+ function translateItems(itemList) {
30
+ // Accumulate simple items
31
+ let simpleItems = [];
32
+ let simpleItemStartIndex = null;
33
+ /** Process accumulated simple nodes which are simple inline elements */
34
+ function processSimpleNodes() {
35
+ if (simpleItems.length === 0) {
36
+ return;
37
+ }
38
+ // Create html string with {0}, {1}, etc. for expressions and html for other items
39
+ const expressions = [];
40
+ const converter = new TranslationItemsHtmlConverter(item => {
41
+ if (item.type === "expr") {
42
+ const expr = item;
43
+ if (expr.labelText) {
44
+ expr.labelText = translate(expr.labelText);
45
+ }
46
+ expressions.push(expr);
47
+ return `{${expressions.length - 1}}`;
48
+ }
49
+ return "";
50
+ });
51
+ // Convert items to html which has the side effect of translating expressions
52
+ let html = converter.convertItemsToHtml(simpleItems);
53
+ // If there was no text, do nothing except translate expressions
54
+ if (!simpleItems.some(doesItemContainText)) {
55
+ return;
56
+ }
57
+ // Remove leading and trailing whitespace from the HTML
58
+ const leftWhitespace = html.slice(0, html.length - html.trimStart().length);
59
+ const rightWhitespace = html.slice(html.trimEnd().length);
60
+ html = html.trim();
61
+ if (!html) {
62
+ return;
63
+ }
64
+ let translatedHtml = leftWhitespace + translate(html) + rightWhitespace;
65
+ // Parse translatedHtml into items by first replacing {0}, {1}, etc. with html that can be converted to items
66
+ for (let i = 0; i < expressions.length; i++) {
67
+ const expr = expressions[i];
68
+ translatedHtml = translatedHtml.replace(new RegExp(`\\{${i}\\}`, "g"), `<span data-embed="${lodash_1.default.escape(JSON.stringify(expr))}"></span>`);
69
+ }
70
+ // Wrap in a div to prevent whitespace from being trimmed.
71
+ const translatedItems = (converter.convertElemToItems(new DOMParser().parseFromString("<div>" + translatedHtml + "</div>", "text/html").body.firstChild));
72
+ // Replace the simple items with the translated items
73
+ itemList.splice(simpleItemStartIndex, simpleItems.length, ...translatedItems);
74
+ simpleItems = [];
75
+ simpleItemStartIndex = null;
76
+ }
77
+ for (let i = 0; i < itemList.length; i++) {
78
+ const item = itemList[i];
79
+ // If the child is a simple node, add it to the list
80
+ if (isItemSimple(item)) {
81
+ simpleItems.push(item);
82
+ if (simpleItemStartIndex == null) {
83
+ simpleItemStartIndex = i;
84
+ }
85
+ }
86
+ else {
87
+ // If we have gathered simple nodes, we need to return/replace them
88
+ processSimpleNodes();
89
+ simpleItemStartIndex = null;
90
+ simpleItems = [];
91
+ // Handle the current node
92
+ if (typeof item !== "string" && item.type === "element" && item.items) {
93
+ translateItems(item.items);
94
+ }
95
+ }
96
+ }
97
+ if (simpleItems.length > 0) {
98
+ processSimpleNodes();
99
+ simpleItemStartIndex = null;
100
+ simpleItems = [];
101
+ }
102
+ }
103
+ translateItems(draft);
104
+ });
105
+ }
106
+ /** ItemsHtmlConverter that has a callback for handling special items */
107
+ class TranslationItemsHtmlConverter extends ItemsHtmlConverter_1.default {
108
+ handleSpecialItem;
109
+ constructor(handleSpecialItem) {
110
+ super();
111
+ this.handleSpecialItem = handleSpecialItem;
112
+ }
113
+ convertSpecialItemToHtml(item) {
114
+ return this.handleSpecialItem(item);
115
+ }
116
+ }
117
+ /**
118
+ * Check if an html item is simple.
119
+ * A node is simple if it is:
120
+ * - a string
121
+ * - a tag that is a "b", "i", "u", "a", "strong", "em" tag with no children or only simple children
122
+ * Only sequences of simple nodes are exported to translation entries as HTML.
123
+ */
124
+ function isItemSimple(node) {
125
+ if (typeof node === "string") {
126
+ return true;
127
+ }
128
+ if (node.type === "expr") {
129
+ return true;
130
+ }
131
+ if (node.type === "element") {
132
+ const element = node;
133
+ if (["b", "i", "u", "a", "strong", "em"].indexOf(element.tag) === -1) {
134
+ return false;
135
+ }
136
+ return (element.items || []).every(child => isItemSimple(child));
137
+ }
138
+ return false;
139
+ }
140
+ /** Determines if an item contains any non-empty text strings */
141
+ function doesItemContainText(item) {
142
+ if (typeof item === "string") {
143
+ return item.trim().length > 0;
144
+ }
145
+ if (item.type === "element") {
146
+ return (item.items || []).some(child => doesItemContainText(child));
147
+ }
148
+ return false;
149
+ }
@@ -25,7 +25,7 @@ export default class ItemsHtmlConverter {
25
25
  constructor(namedStrings?: {
26
26
  [key: string]: string;
27
27
  });
28
- convertItemsToHtml(items: any): string;
28
+ convertItemsToHtml(items: HtmlItem[]): string;
29
29
  convertSpecialItemToHtml(item: HtmlItemBase): string;
30
30
  convertElemToItems(elem: HTMLElement): HtmlItem[];
31
31
  }
@@ -50,18 +50,19 @@ class ItemsHtmlConverter {
50
50
  html += lodash_1.default.escape(itemStr);
51
51
  }
52
52
  else if (item.type === "element") {
53
- if (!allowedTags[item.tag]) {
53
+ const element = item;
54
+ if (!allowedTags[element.tag]) {
54
55
  // Ignore and do contents
55
- html += this.convertItemsToHtml(item.items);
56
+ html += this.convertItemsToHtml(element.items || []);
56
57
  continue;
57
58
  }
58
59
  let attrs = "";
59
60
  // Add style
60
- if (item.style) {
61
+ if (element.style) {
61
62
  attrs += ' style="';
62
63
  let first = true;
63
- for (let key in item.style) {
64
- const value = item.style[key];
64
+ for (let key in element.style) {
65
+ const value = element.style[key];
65
66
  if (!allowedStyles[key]) {
66
67
  continue;
67
68
  }
@@ -77,19 +78,19 @@ class ItemsHtmlConverter {
77
78
  attrs += '"';
78
79
  }
79
80
  // Add href
80
- if (item.href) {
81
- attrs += ' href="' + item.href + '"';
81
+ if (element.href) {
82
+ attrs += ' href="' + element.href + '"';
82
83
  }
83
84
  // Add target
84
- if (item.target) {
85
- attrs += ' target="' + lodash_1.default.escape(item.target) + '"';
85
+ if (element.target) {
86
+ attrs += ' target="' + lodash_1.default.escape(element.target) + '"';
86
87
  }
87
88
  // Special case for self-closing tags
88
- if (["br"].includes(item.tag)) {
89
- html += `<${item.tag}${attrs}>`;
89
+ if (["br"].includes(element.tag)) {
90
+ html += `<${element.tag}${attrs}>`;
90
91
  }
91
92
  else {
92
- html += `<${item.tag}${attrs}>` + this.convertItemsToHtml(item.items) + `</${item.tag}>`;
93
+ html += `<${element.tag}${attrs}>` + this.convertItemsToHtml(element.items || []) + `</${element.tag}>`;
93
94
  }
94
95
  }
95
96
  else {
@@ -101,6 +102,8 @@ class ItemsHtmlConverter {
101
102
  html = "\u2060";
102
103
  }
103
104
  // console.log "createHtml: #{html}"
105
+ // console.log("convertItemsToHtml: " + JSON.stringify(items, null, 2))
106
+ // console.log("convertItemsToHtml: " + html)
104
107
  return html;
105
108
  }
106
109
  // Converts an item that is not an element to html. Override in subclass.
@@ -138,14 +141,19 @@ class ItemsHtmlConverter {
138
141
  const nodeElement = node;
139
142
  if (nodeElement.style != null) {
140
143
  const styleDeclaration = nodeElement.style;
141
- for (const style of styleDeclaration) {
144
+ for (let i = 0; i < styleDeclaration.length; i++) {
145
+ const style = styleDeclaration[i];
142
146
  if (!allowedStyles[style]) {
143
147
  continue;
144
148
  }
145
- const value = styleDeclaration[style];
149
+ const value = styleDeclaration.getPropertyValue(style);
146
150
  if (value == null || value === "") {
147
151
  continue;
148
152
  }
153
+ // Ignore bootstrap variables in style values
154
+ if (value.startsWith("var(--bs-")) {
155
+ continue;
156
+ }
149
157
  item.style = item.style || {};
150
158
  item.style[style] = value;
151
159
  }
@@ -168,7 +176,13 @@ class ItemsHtmlConverter {
168
176
  if (node.target) {
169
177
  item.target = node.target;
170
178
  }
171
- items.push(item);
179
+ // Unwrap pointless span elements that have no style and one child
180
+ if (tag === "span" && item.style == null && item.items?.length === 1) {
181
+ items.push(item.items[0]);
182
+ }
183
+ else {
184
+ items.push(item);
185
+ }
172
186
  // Handle text
173
187
  }
174
188
  else if (node.nodeType === 3) {
@@ -181,6 +195,8 @@ class ItemsHtmlConverter {
181
195
  }
182
196
  }
183
197
  // console.log JSON.stringify(items, null, 2)
198
+ // console.log("convertElemToItems: " + elem.outerHTML)
199
+ // console.log("convertElemToItems: " + JSON.stringify(items, null, 2))
184
200
  return items;
185
201
  }
186
202
  }
package/lib/wellknown.js CHANGED
@@ -23,7 +23,7 @@ exports.parse = parse;
23
23
  exports.stringify = stringify;
24
24
  const numberRegexp = /[-+]?([0-9]*\.[0-9]+|[0-9]+)([eE][-+]?[0-9]+)?/;
25
25
  // Matches sequences like '100 100' or '100 100 100'.
26
- const tuples = new RegExp('^' + numberRegexp.source + '(\\s' + numberRegexp.source + '){1,}');
26
+ const tuples = new RegExp('^' + numberRegexp.source + '(\\s' + numberRegexp.source + '){1,3}');
27
27
  /*
28
28
  * Parse WKT and return GeoJSON.
29
29
  *
@@ -91,7 +91,9 @@ function parse(input) {
91
91
  stack[stack.length - 1].push(pointer);
92
92
  }
93
93
  else if (!elem.split(/\s/g).some(s => isNaN(s))) {
94
- Array.prototype.push.apply(pointer, elem.split(/\s/g).map(parseFloat));
94
+ // Split into values and only take first 3 if there are 4 (ZM coordinates)
95
+ const values = elem.split(/\s/g).map(parseFloat);
96
+ Array.prototype.push.apply(pointer, values.length === 4 ? values.slice(0, 3) : values);
95
97
  }
96
98
  else {
97
99
  return null;
@@ -116,7 +118,8 @@ function parse(input) {
116
118
  else if (!pt.split(/\s/g).some(s => isNaN(s))) {
117
119
  if (!item)
118
120
  item = [];
119
- Array.prototype.push.apply(item, pt.split(/\s/g).map(parseFloat));
121
+ const values = pt.split(/\s/g).map(parseFloat);
122
+ Array.prototype.push.apply(item, values.length === 4 ? values.slice(0, 3) : values);
120
123
  }
121
124
  white();
122
125
  }
@@ -127,7 +130,7 @@ function parse(input) {
127
130
  return list.length ? list : null;
128
131
  }
129
132
  function point() {
130
- if (!$(/^(point(\sz)?)/i))
133
+ if (!$(/^(point(\s+zm|\s+z)?)/i))
131
134
  return null;
132
135
  white();
133
136
  if (!$(/^(\()/))
@@ -144,7 +147,7 @@ function parse(input) {
144
147
  };
145
148
  }
146
149
  function multipoint() {
147
- if (!$(/^(multipoint(\sz)?)/i))
150
+ if (!$(/^(multipoint(\s+zm|\s+z)?)/i))
148
151
  return null;
149
152
  white();
150
153
  let newCoordsFormat = _
@@ -162,7 +165,7 @@ function parse(input) {
162
165
  };
163
166
  }
164
167
  function multilinestring() {
165
- if (!$(/^(multilinestring(\sz)?)/i))
168
+ if (!$(/^(multilinestring(\s+zm|\s+z)?)/i))
166
169
  return null;
167
170
  white();
168
171
  let c = multicoords();
@@ -175,7 +178,7 @@ function parse(input) {
175
178
  };
176
179
  }
177
180
  function linestring() {
178
- if (!$(/^(linestring(\sz)?)/i))
181
+ if (!$(/^(linestring(\s+zm|\s+z)?)/i))
179
182
  return null;
180
183
  white();
181
184
  if (!$(/^(\()/))
@@ -191,7 +194,7 @@ function parse(input) {
191
194
  };
192
195
  }
193
196
  function polygon() {
194
- if (!$(/^(polygon(\sz)?)/i))
197
+ if (!$(/^(polygon(\s+zm|\s+z)?)/i))
195
198
  return null;
196
199
  white();
197
200
  let c = multicoords();
@@ -203,7 +206,7 @@ function parse(input) {
203
206
  };
204
207
  }
205
208
  function multipolygon() {
206
- if (!$(/^(multipolygon(\sz)?)/i))
209
+ if (!$(/^(multipolygon(\s+zm|\s+z)?)/i))
207
210
  return null;
208
211
  white();
209
212
  let c = multicoords();
@@ -2,13 +2,13 @@ import React from "react";
2
2
  import Widget, { CreateViewElementOptions } from "./Widget";
3
3
  export default class IFrameWidget extends Widget {
4
4
  createViewElement(options: CreateViewElementOptions): React.CElement<{
5
- design: object;
6
- onDesignChange: ((design: object) => void) | null | undefined;
5
+ design: any;
6
+ onDesignChange: ((design: any) => void) | null | undefined;
7
7
  width: number | undefined;
8
8
  height: number | undefined;
9
9
  }, React.Component<{
10
- design: object;
11
- onDesignChange: ((design: object) => void) | null | undefined;
10
+ design: any;
11
+ onDesignChange: ((design: any) => void) | null | undefined;
12
12
  width: number | undefined;
13
13
  height: number | undefined;
14
14
  }, any, any>>;