@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.
- package/lib/ColorComponent.js +2 -1
- package/lib/IdSelection.d.ts +16 -0
- package/lib/IdSelection.js +59 -0
- package/lib/MWaterAddRelatedIndicatorComponent.js +2 -2
- package/lib/MWaterCompleteTableSelectComponent.d.ts +3 -8
- package/lib/MWaterCompleteTableSelectComponent.js +36 -42
- package/lib/MWaterLoaderComponent.d.ts +11 -10
- package/lib/MWaterLoaderComponent.js +1 -1
- package/lib/MWaterResponsesFilterComponent.js +1 -1
- package/lib/MWaterTableSelectComponent.d.ts +0 -1
- package/lib/MWaterTableSelectComponent.js +4 -6
- package/lib/autotranslate.d.ts +20 -0
- package/lib/autotranslate.js +122 -0
- package/lib/axes/AxisBuilder.js +3 -3
- package/lib/axes/AxisColorEditorComponent.js +4 -0
- package/lib/axes/AxisComponent.d.ts +8 -12
- package/lib/axes/AxisComponent.js +32 -80
- package/lib/axes/CategoryMapComponent.js +4 -4
- package/lib/axes/RangesComponent.js +2 -2
- package/lib/dashboards/DashboardComponent.d.ts +12 -20
- package/lib/dashboards/DashboardComponent.js +109 -69
- package/lib/dashboards/DashboardDesign.d.ts +11 -2
- package/lib/dashboards/DashboardUtils.d.ts +5 -0
- package/lib/dashboards/DashboardUtils.js +30 -0
- package/lib/dashboards/DashboardViewComponent.d.ts +2 -0
- package/lib/dashboards/DashboardViewComponent.js +16 -3
- package/lib/dashboards/ServerDashboardDataSource.js +2 -1
- package/lib/dashboards/SettingsModalComponent.d.ts +1 -1
- package/lib/dashboards/SettingsModalComponent.js +256 -19
- package/lib/dashboards/WidgetComponent.d.ts +6 -3
- package/lib/dashboards/WidgetComponent.js +3 -1
- package/lib/datagrids/CellEditor.d.ts +19 -0
- package/lib/datagrids/CellEditor.js +223 -0
- package/lib/datagrids/DatagridComponent.d.ts +18 -87
- package/lib/datagrids/DatagridComponent.js +304 -222
- package/lib/datagrids/DatagridViewComponent.d.ts +15 -53
- package/lib/datagrids/DatagridViewComponent.js +256 -257
- package/lib/datagrids/DirectDatagridDataSource.js +2 -3
- package/lib/datagrids/ExprCellComponent.d.ts +8 -15
- package/lib/datagrids/ExprCellComponent.js +11 -15
- package/lib/datagrids/FindReplaceModalComponent.d.ts +4 -6
- package/lib/datagrids/FindReplaceModalComponent.js +38 -75
- package/lib/index.css +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -1
- package/lib/languages.js +6 -1
- package/lib/layouts/blocks/HorizontalBlockComponent.js +2 -2
- package/lib/mWaterLoader.d.ts +1 -1
- package/lib/maps/BufferLayer.d.ts +7 -5
- package/lib/maps/BufferLayer.js +69 -48
- package/lib/maps/BufferLayerDesign.d.ts +21 -14
- package/lib/maps/BufferLayerDesignerComponent.d.ts +16 -31
- package/lib/maps/BufferLayerDesignerComponent.js +68 -102
- package/lib/maps/ChoroplethLayer.d.ts +5 -4
- package/lib/maps/ChoroplethLayer.js +32 -9
- package/lib/maps/ChoroplethLayerDesign.d.ts +6 -2
- package/lib/maps/ChoroplethLayerDesigner.js +4 -2
- package/lib/maps/ClusterLayer.d.ts +3 -4
- package/lib/maps/ClusterLayer.js +2 -1
- package/lib/maps/DetailLevelSelectComponent.js +1 -1
- package/lib/maps/DirectMapDataSource.js +2 -1
- package/lib/maps/EditPopupComponent.js +5 -3
- package/lib/maps/GridLayer.d.ts +3 -4
- package/lib/maps/GridLayer.js +2 -1
- package/lib/maps/GridLayerDesigner.js +5 -3
- package/lib/maps/HoverContent.d.ts +11 -3
- package/lib/maps/HoverContent.js +25 -9
- package/lib/maps/Layer.d.ts +24 -3
- package/lib/maps/Layer.js +5 -1
- package/lib/maps/LayerFactory.js +0 -8
- package/lib/maps/LayerLegendComponent.js +0 -1
- package/lib/maps/LayerSwitcherComponent.d.ts +1 -0
- package/lib/maps/LayerSwitcherComponent.js +1 -1
- package/lib/maps/LeafletMapComponent.js +3 -1
- package/lib/maps/LegendComponent.d.ts +1 -0
- package/lib/maps/LegendComponent.js +9 -1
- package/lib/maps/MWaterServerLayer.d.ts +2 -2
- package/lib/maps/MWaterServerLayer.js +2 -2
- package/lib/maps/MapComponent.js +3 -3
- package/lib/maps/MapDesign.d.ts +2 -0
- package/lib/maps/MapDesignerComponent.d.ts +4 -3
- package/lib/maps/MapDesignerComponent.js +68 -74
- package/lib/maps/MapLayerViewDesignerComponent.js +2 -2
- package/lib/maps/MapUtils.d.ts +4 -0
- package/lib/maps/MapUtils.js +19 -0
- package/lib/maps/MapViewComponent.d.ts +8 -3
- package/lib/maps/MarkersLayer.d.ts +5 -4
- package/lib/maps/MarkersLayer.js +33 -7
- package/lib/maps/MarkersLayerDesign.d.ts +19 -16
- package/lib/maps/PopupFilterJoinsUtils.d.ts +6 -3
- package/lib/maps/PopupFilterJoinsUtils.js +0 -6
- package/lib/maps/RasterMapViewComponent.d.ts +3 -31
- package/lib/maps/RasterMapViewComponent.js +7 -2
- package/lib/maps/ServerMapDataSource.js +2 -1
- package/lib/maps/SwitchableTileUrlLayer.d.ts +3 -3
- package/lib/maps/SwitchableTileUrlLayer.js +2 -1
- package/lib/maps/TileUrlLayer.d.ts +4 -5
- package/lib/maps/TileUrlLayer.js +2 -1
- package/lib/maps/VectorMapViewComponent.d.ts +5 -37
- package/lib/maps/VectorMapViewComponent.js +19 -8
- package/lib/maps/maps.d.ts +3 -0
- package/lib/quickfilter/Quickfilter.d.ts +2 -0
- package/lib/quickfilter/QuickfiltersComponent.d.ts +2 -0
- package/lib/quickfilter/QuickfiltersComponent.js +9 -7
- package/lib/quickfilter/QuickfiltersDesignComponent.d.ts +5 -30
- package/lib/quickfilter/QuickfiltersDesignComponent.js +56 -63
- package/lib/richtext/ExprItemsHtmlConverter.d.ts +5 -2
- package/lib/richtext/ExprItemsHtmlConverter.js +4 -4
- package/lib/richtext/ExprItemsTranslator.d.ts +5 -0
- package/lib/richtext/ExprItemsTranslator.js +149 -0
- package/lib/richtext/ItemsHtmlConverter.d.ts +1 -1
- package/lib/richtext/ItemsHtmlConverter.js +31 -15
- package/lib/wellknown.js +12 -9
- package/lib/widgets/IFrameWidget.d.ts +4 -4
- package/lib/widgets/ImageWidget.d.ts +7 -4
- package/lib/widgets/ImageWidget.js +9 -1
- package/lib/widgets/ImageWidgetComponent.d.ts +1 -0
- package/lib/widgets/ImageWidgetComponent.js +1 -1
- package/lib/widgets/MapWidget.d.ts +5 -48
- package/lib/widgets/MapWidget.js +26 -63
- package/lib/widgets/MarkdownWidget.d.ts +3 -0
- package/lib/widgets/MarkdownWidget.js +3 -0
- package/lib/widgets/TOCWidget.d.ts +15 -27
- package/lib/widgets/TOCWidget.js +107 -183
- package/lib/widgets/Widget.d.ts +18 -7
- package/lib/widgets/Widget.js +4 -0
- package/lib/widgets/WidgetScopesViewComponent.js +1 -1
- package/lib/widgets/charts/Chart.d.ts +10 -1
- package/lib/widgets/charts/Chart.js +22 -11
- package/lib/widgets/charts/ChartViewComponent.d.ts +4 -0
- package/lib/widgets/charts/ChartViewComponent.js +6 -3
- package/lib/widgets/charts/ChartWidget.d.ts +2 -0
- package/lib/widgets/charts/ChartWidget.js +9 -1
- package/lib/widgets/charts/ChartWidgetComponent.d.ts +4 -0
- package/lib/widgets/charts/ChartWidgetComponent.js +2 -2
- package/lib/widgets/charts/calendar/CalendarChart.d.ts +1 -0
- package/lib/widgets/charts/calendar/CalendarChart.js +26 -0
- package/lib/widgets/charts/calendar/CalendarChartViewComponent.js +3 -1
- package/lib/widgets/charts/imagemosaic/ImageMosaicChart.d.ts +1 -0
- package/lib/widgets/charts/imagemosaic/ImageMosaicChart.js +8 -0
- package/lib/widgets/charts/layered/LayeredChart.d.ts +2 -0
- package/lib/widgets/charts/layered/LayeredChart.js +63 -3
- package/lib/widgets/charts/layered/LayeredChartCompiler.d.ts +1 -1
- package/lib/widgets/charts/layered/LayeredChartCompiler.js +1 -1
- package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +2 -2
- package/lib/widgets/charts/layered/LayeredChartViewComponent.js +8 -3
- package/lib/widgets/charts/pivot/PivotChart.d.ts +1 -0
- package/lib/widgets/charts/pivot/PivotChart.js +63 -0
- package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +1 -1
- package/lib/widgets/charts/pivot/SegmentDesignerComponent.js +7 -4
- package/lib/widgets/charts/table/OrderingsComponent.js +1 -1
- package/lib/widgets/charts/table/TableChart.d.ts +1 -0
- package/lib/widgets/charts/table/TableChart.js +15 -0
- package/lib/widgets/text/TextComponent.d.ts +11 -4
- package/lib/widgets/text/TextComponent.js +11 -8
- package/lib/widgets/text/TextWidget.d.ts +6 -3
- package/lib/widgets/text/TextWidget.js +7 -1
- package/lib/widgets/text/TextWidgetComponent.d.ts +4 -0
- package/lib/widgets/text/TextWidgetComponent.js +7 -1
- package/lib/widgets/text/TextWidgetDesign.d.ts +2 -4
- package/lib/widgets/text/TextWidgetDesign.js +1 -1
- package/package.json +7 -8
- package/src/ColorComponent.tsx +1 -2
- package/src/IdSelection.ts +62 -0
- package/src/MWaterAddRelatedIndicatorComponent.ts +3 -2
- package/src/MWaterCompleteTableSelectComponent.tsx +36 -46
- package/src/MWaterLoaderComponent.ts +28 -26
- package/src/MWaterResponsesFilterComponent.ts +5 -2
- package/src/MWaterTableSelectComponent.tsx +5 -9
- package/src/autotranslate.ts +141 -0
- package/src/axes/AxisBuilder.ts +3 -3
- package/src/axes/AxisColorEditorComponent.tsx +5 -0
- package/src/axes/{AxisComponent.ts → AxisComponent.tsx} +106 -106
- package/src/axes/CategoryMapComponent.ts +4 -4
- package/src/axes/RangesComponent.ts +3 -2
- package/src/dashboards/DashboardComponent.tsx +189 -125
- package/src/dashboards/DashboardDesign.ts +9 -2
- package/src/dashboards/DashboardUtils.ts +39 -0
- package/src/dashboards/DashboardViewComponent.tsx +22 -3
- package/src/dashboards/ServerDashboardDataSource.ts +2 -1
- package/src/dashboards/SettingsModalComponent.tsx +450 -35
- package/src/dashboards/WidgetComponent.tsx +12 -6
- package/src/datagrids/CellEditor.tsx +354 -0
- package/src/datagrids/DatagridComponent.tsx +646 -0
- package/src/datagrids/DatagridViewComponent.tsx +539 -0
- package/src/datagrids/DirectDatagridDataSource.ts +2 -3
- package/src/datagrids/{ExprCellComponent.ts → ExprCellComponent.tsx} +28 -23
- package/src/datagrids/{FindReplaceModalComponent.ts → FindReplaceModalComponent.tsx} +109 -122
- package/src/index.css +1 -1
- package/src/index.ts +0 -1
- package/src/languages.ts +6 -1
- package/src/layouts/blocks/HorizontalBlockComponent.ts +2 -2
- package/src/mWaterLoader.ts +1 -1
- package/src/maps/BufferLayer.ts +83 -60
- package/src/maps/BufferLayerDesign.ts +20 -14
- package/src/maps/BufferLayerDesignerComponent.tsx +309 -0
- package/src/maps/ChoroplethLayer.ts +40 -19
- package/src/maps/ChoroplethLayerDesign.ts +4 -2
- package/src/maps/ChoroplethLayerDesigner.tsx +4 -2
- package/src/maps/ClusterLayer.ts +4 -10
- package/src/maps/DetailLevelSelectComponent.ts +1 -1
- package/src/maps/DirectMapDataSource.ts +2 -1
- package/src/maps/EditPopupComponent.ts +7 -3
- package/src/maps/GridLayer.ts +4 -10
- package/src/maps/GridLayerDesigner.tsx +5 -3
- package/src/maps/HoverContent.tsx +40 -16
- package/src/maps/Layer.ts +28 -10
- package/src/maps/LayerFactory.ts +0 -8
- package/src/maps/LayerLegendComponent.ts +2 -4
- package/src/maps/LayerSwitcherComponent.tsx +6 -2
- package/src/maps/LeafletMapComponent.tsx +3 -1
- package/src/maps/LegendComponent.tsx +10 -1
- package/src/maps/MWaterServerLayer.ts +3 -3
- package/src/maps/MapComponent.ts +3 -3
- package/src/maps/MapDesign.ts +3 -0
- package/src/maps/MapDesignerComponent.tsx +165 -162
- package/src/maps/MapLayerViewDesignerComponent.ts +2 -2
- package/src/maps/MapUtils.ts +24 -0
- package/src/maps/MapViewComponent.tsx +11 -3
- package/src/maps/MarkersLayer.ts +44 -18
- package/src/maps/MarkersLayerDesign.ts +19 -16
- package/src/maps/PopupFilterJoinsUtils.ts +6 -2
- package/src/maps/RasterMapViewComponent.ts +9 -45
- package/src/maps/ServerMapDataSource.ts +2 -2
- package/src/maps/SwitchableTileUrlLayer.tsx +4 -10
- package/src/maps/TileUrlLayer.tsx +4 -10
- package/src/maps/VectorMapViewComponent.tsx +28 -55
- package/src/maps/maps.ts +3 -0
- package/src/quickfilter/Quickfilter.ts +3 -0
- package/src/quickfilter/QuickfiltersComponent.ts +13 -7
- package/src/quickfilter/QuickfiltersDesignComponent.tsx +127 -128
- package/src/richtext/ExprItemsHtmlConverter.ts +9 -5
- package/src/richtext/ExprItemsTranslator.ts +176 -0
- package/src/richtext/ItemsHtmlConverter.ts +33 -18
- package/src/wellknown.ts +33 -30
- package/src/widgets/ImageWidget.ts +10 -1
- package/src/widgets/ImageWidgetComponent.ts +3 -2
- package/src/widgets/{MapWidget.ts → MapWidget.tsx} +90 -101
- package/src/widgets/MarkdownWidget.ts +3 -0
- package/src/widgets/TOCWidget.tsx +281 -0
- package/src/widgets/Widget.ts +25 -5
- package/src/widgets/WidgetScopesViewComponent.ts +2 -1
- package/src/widgets/charts/Chart.ts +31 -12
- package/src/widgets/charts/ChartViewComponent.ts +13 -3
- package/src/widgets/charts/ChartWidget.ts +11 -1
- package/src/widgets/charts/ChartWidgetComponent.tsx +9 -1
- package/src/widgets/charts/calendar/CalendarChart.ts +29 -0
- package/src/widgets/charts/calendar/CalendarChartViewComponent.tsx +3 -1
- package/src/widgets/charts/imagemosaic/ImageMosaicChart.ts +9 -0
- package/src/widgets/charts/layered/LayeredChart.ts +71 -3
- package/src/widgets/charts/layered/LayeredChartCompiler.ts +2 -2
- package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +4 -2
- package/src/widgets/charts/layered/LayeredChartViewComponent.ts +10 -4
- package/src/widgets/charts/pivot/PivotChart.ts +73 -0
- package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +1 -1
- package/src/widgets/charts/pivot/SegmentDesignerComponent.tsx +6 -4
- package/src/widgets/charts/table/OrderingsComponent.tsx +2 -1
- package/src/widgets/charts/table/TableChart.ts +17 -0
- package/src/widgets/text/TextComponent.tsx +22 -12
- package/src/widgets/text/TextWidget.ts +9 -2
- package/src/widgets/text/TextWidgetComponent.tsx +16 -1
- package/src/widgets/text/TextWidgetDesign.ts +4 -7
- package/test/IdSelectionTests.ts +54 -0
- package/test/LayeredChartCompilerTests.ts +0 -2
- package/test/richtext/ExprItemsTranslatorTests.ts +144 -0
- package/test/wellknownTests.ts +144 -0
- package/src/datagrids/DatagridComponent.ts +0 -478
- package/src/datagrids/DatagridViewComponent.ts +0 -464
- package/src/datagrids/EditExprCellComponent.tsx +0 -305
- package/src/datagrids/README.md +0 -3
- package/src/maps/BufferLayerDesignerComponent.ts +0 -311
- package/src/widgets/TOCWidget.ts +0 -326
- 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:
|
|
16
|
-
isMergeable(design:
|
|
17
|
-
renderQuickfilter: (item:
|
|
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:
|
|
20
|
-
render(): React.
|
|
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
|
|
32
|
-
const
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
100
|
+
this.props.onDesignChange(design);
|
|
102
101
|
};
|
|
103
102
|
render() {
|
|
104
|
-
return
|
|
105
|
-
|
|
106
|
-
:
|
|
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
|
-
|
|
128
|
+
this.props.onChange((0, immer_1.produce)(this.props.design, draft => {
|
|
129
|
+
draft.expr = expr;
|
|
130
|
+
}));
|
|
128
131
|
};
|
|
129
132
|
handleLabelChange = (ev) => {
|
|
130
|
-
|
|
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
|
-
|
|
138
|
+
this.props.onChange((0, immer_1.produce)(this.props.design, draft => {
|
|
139
|
+
draft.merged = merged;
|
|
140
|
+
}));
|
|
134
141
|
};
|
|
135
142
|
handleMultiChange = (multi) => {
|
|
136
|
-
|
|
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
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
value: table,
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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):
|
|
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) +
|
|
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">${
|
|
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) +
|
|
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 ||
|
|
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:
|
|
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
|
-
|
|
53
|
+
const element = item;
|
|
54
|
+
if (!allowedTags[element.tag]) {
|
|
54
55
|
// Ignore and do contents
|
|
55
|
-
html += this.convertItemsToHtml(
|
|
56
|
+
html += this.convertItemsToHtml(element.items || []);
|
|
56
57
|
continue;
|
|
57
58
|
}
|
|
58
59
|
let attrs = "";
|
|
59
60
|
// Add style
|
|
60
|
-
if (
|
|
61
|
+
if (element.style) {
|
|
61
62
|
attrs += ' style="';
|
|
62
63
|
let first = true;
|
|
63
|
-
for (let key in
|
|
64
|
-
const value =
|
|
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 (
|
|
81
|
-
attrs += ' href="' +
|
|
81
|
+
if (element.href) {
|
|
82
|
+
attrs += ' href="' + element.href + '"';
|
|
82
83
|
}
|
|
83
84
|
// Add target
|
|
84
|
-
if (
|
|
85
|
-
attrs += ' target="' + lodash_1.default.escape(
|
|
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(
|
|
89
|
-
html += `<${
|
|
89
|
+
if (["br"].includes(element.tag)) {
|
|
90
|
+
html += `<${element.tag}${attrs}>`;
|
|
90
91
|
}
|
|
91
92
|
else {
|
|
92
|
-
html += `<${
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(\
|
|
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(\
|
|
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(\
|
|
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(\
|
|
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(\
|
|
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(\
|
|
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:
|
|
6
|
-
onDesignChange: ((design:
|
|
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:
|
|
11
|
-
onDesignChange: ((design:
|
|
10
|
+
design: any;
|
|
11
|
+
onDesignChange: ((design: any) => void) | null | undefined;
|
|
12
12
|
width: number | undefined;
|
|
13
13
|
height: number | undefined;
|
|
14
14
|
}, any, any>>;
|