@mwater/visualization 5.4.0 → 5.4.2
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 +6 -0
- package/lib/dashboards/DashboardComponent.js +44 -12
- 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/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/QuickfiltersComponent.d.ts +2 -0
- package/lib/quickfilter/QuickfiltersComponent.js +9 -7
- package/lib/quickfilter/QuickfiltersDesignComponent.d.ts +1 -1
- package/lib/quickfilter/QuickfiltersDesignComponent.js +19 -35
- 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 +3 -3
- 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/PivotChartDesignerComponent.d.ts +1 -0
- package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +1 -1
- package/lib/widgets/charts/pivot/SegmentDesignerComponent.d.ts +6 -0
- 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 +79 -14
- 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/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/QuickfiltersComponent.ts +13 -7
- package/src/quickfilter/QuickfiltersDesignComponent.tsx +56 -74
- 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 +4 -4
- 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
|
@@ -102,7 +102,7 @@ class QuickfiltersDesignComponent extends react_1.default.Component {
|
|
|
102
102
|
};
|
|
103
103
|
render() {
|
|
104
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`)
|
|
105
|
+
? R("button", { type: "button", className: "btn btn-sm btn-link", onClick: this.handleAdd }, R("span", { className: "fas fa-plus me-1" }), T `Add Quick Filter`)
|
|
106
106
|
: undefined);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
@@ -138,39 +138,23 @@ class QuickfilterDesignComponent extends react_1.default.Component {
|
|
|
138
138
|
render() {
|
|
139
139
|
// Determine type of expression
|
|
140
140
|
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);
|
|
141
|
+
return (react_1.default.createElement("div", null,
|
|
142
|
+
react_1.default.createElement("div", { className: "mb-3 mt-1", key: "table" },
|
|
143
|
+
react_1.default.createElement("label", { className: "text-muted" }, T `Data Source`),
|
|
144
|
+
react_1.default.createElement(ui.Select, { value: this.state.table, options: lodash_1.default.map(this.props.tables, (table) => ({
|
|
145
|
+
value: table,
|
|
146
|
+
label: expressions_1.ExprUtils.localizeString(this.props.schema.getTable(table).name)
|
|
147
|
+
})), onChange: this.handleTableChange, nullLabel: T `Select...` })),
|
|
148
|
+
react_1.default.createElement("div", { className: "mb-3", key: "expr" },
|
|
149
|
+
react_1.default.createElement("label", { className: "text-muted" }, T `Filter By`),
|
|
150
|
+
react_1.default.createElement("div", null,
|
|
151
|
+
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[]"] }))),
|
|
152
|
+
this.props.design.expr ? (react_1.default.createElement("div", { className: "mb-3", key: "label" },
|
|
153
|
+
react_1.default.createElement("label", { className: "text-muted" }, T `Label`),
|
|
154
|
+
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,
|
|
155
|
+
this.props.mergeable ? (react_1.default.createElement(ui.Checkbox, { value: this.props.design.merged, onChange: this.handleMergedChange },
|
|
156
|
+
T `Merge with previous quickfilter `,
|
|
157
|
+
react_1.default.createElement("span", { className: "text-muted" }, `- ${T `displays as one single control that filters both`}`))) : undefined,
|
|
158
|
+
["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
159
|
}
|
|
176
160
|
}
|
|
@@ -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>>;
|
|
@@ -27,23 +27,26 @@ export default class ImageWidget extends Widget {
|
|
|
27
27
|
dataSource: DataSource;
|
|
28
28
|
widgetDataSource: import("./WidgetDataSource").WidgetDataSource;
|
|
29
29
|
filters: JsonQLFilter[];
|
|
30
|
-
design:
|
|
31
|
-
onDesignChange: ((design:
|
|
30
|
+
design: any;
|
|
31
|
+
onDesignChange: ((design: any) => void) | null | undefined;
|
|
32
32
|
width: number | undefined;
|
|
33
33
|
height: number | undefined;
|
|
34
34
|
singleRowTable: string | undefined;
|
|
35
|
+
translate: (input: string) => string;
|
|
35
36
|
}, React.Component<{
|
|
36
37
|
schema: Schema;
|
|
37
38
|
dataSource: DataSource;
|
|
38
39
|
widgetDataSource: import("./WidgetDataSource").WidgetDataSource;
|
|
39
40
|
filters: JsonQLFilter[];
|
|
40
|
-
design:
|
|
41
|
-
onDesignChange: ((design:
|
|
41
|
+
design: any;
|
|
42
|
+
onDesignChange: ((design: any) => void) | null | undefined;
|
|
42
43
|
width: number | undefined;
|
|
43
44
|
height: number | undefined;
|
|
44
45
|
singleRowTable: string | undefined;
|
|
46
|
+
translate: (input: string) => string;
|
|
45
47
|
}, any, any>>;
|
|
46
48
|
getData(design: ImageWidgetDesign, schema: Schema, dataSource: DataSource, filters: JsonQLFilter[], callback: any): any;
|
|
47
49
|
isAutoHeight(): boolean;
|
|
48
50
|
getFilterableTables(design: any, schema: Schema): any[];
|
|
51
|
+
getTranslatableStrings(design: ImageWidgetDesign, schema: Schema): string[];
|
|
49
52
|
}
|
|
@@ -35,7 +35,8 @@ class ImageWidget extends Widget_1.default {
|
|
|
35
35
|
onDesignChange: options.onDesignChange,
|
|
36
36
|
width: options.width,
|
|
37
37
|
height: options.height,
|
|
38
|
-
singleRowTable: options.singleRowTable
|
|
38
|
+
singleRowTable: options.singleRowTable,
|
|
39
|
+
translate: options.translate
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
42
|
// Get the data that the widget needs. This will be called on the server, typically.
|
|
@@ -108,5 +109,12 @@ class ImageWidget extends Widget_1.default {
|
|
|
108
109
|
}
|
|
109
110
|
return [];
|
|
110
111
|
}
|
|
112
|
+
getTranslatableStrings(design, schema) {
|
|
113
|
+
const strings = [];
|
|
114
|
+
if (design.caption) {
|
|
115
|
+
strings.push(design.caption);
|
|
116
|
+
}
|
|
117
|
+
return strings;
|
|
118
|
+
}
|
|
111
119
|
}
|
|
112
120
|
exports.default = ImageWidget;
|
|
@@ -17,6 +17,7 @@ export interface ImageWidgetComponentProps {
|
|
|
17
17
|
width: number;
|
|
18
18
|
height: number;
|
|
19
19
|
singleRowTable?: string;
|
|
20
|
+
translate: (input: string) => string;
|
|
20
21
|
}
|
|
21
22
|
export default class ImageWidgetComponent extends AsyncLoadComponent<ImageWidgetComponentProps, {
|
|
22
23
|
data: any;
|
|
@@ -143,7 +143,7 @@ class ImageWidgetComponent extends AsyncLoadComponent_1.default {
|
|
|
143
143
|
: R("div", {
|
|
144
144
|
className: "mwater-visualization-image-widget",
|
|
145
145
|
style: { position: "relative", width: this.props.width, height: this.props.height }
|
|
146
|
-
}, captionPosition === "top" ? R("div", { className: "caption" }, this.props.design.caption) : undefined, R("div", { className: "image" }, this.renderContent()), captionPosition === "bottom" ? R("div", { className: "caption" }, this.props.design.caption) : undefined));
|
|
146
|
+
}, captionPosition === "top" && this.props.design.caption ? R("div", { className: "caption" }, this.props.translate(this.props.design.caption)) : undefined, R("div", { className: "image" }, this.renderContent()), captionPosition === "bottom" && this.props.design.caption ? R("div", { className: "caption" }, this.props.translate(this.props.design.caption)) : undefined));
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
exports.default = ImageWidgetComponent;
|
|
@@ -1,52 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import Widget, { CreateViewElementOptions } from "./Widget";
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import { WidgetDataSource } from "./WidgetDataSource";
|
|
3
|
+
import { Schema } from "@mwater/expressions";
|
|
4
|
+
import { MapDesign } from "../maps/MapDesign";
|
|
6
5
|
export default class MapWidget extends Widget {
|
|
7
|
-
createViewElement(options: CreateViewElementOptions): React.
|
|
8
|
-
getFilterableTables(design:
|
|
6
|
+
createViewElement(options: CreateViewElementOptions): React.JSX.Element;
|
|
7
|
+
getFilterableTables(design: MapDesign, schema: Schema): string[];
|
|
8
|
+
getTranslatableStrings(design: MapDesign, schema: Schema): string[];
|
|
9
9
|
}
|
|
10
|
-
interface MapWidgetComponentProps {
|
|
11
|
-
/** Schema to use */
|
|
12
|
-
schema: Schema;
|
|
13
|
-
/** Data source to use */
|
|
14
|
-
dataSource: DataSource;
|
|
15
|
-
widgetDataSource: WidgetDataSource;
|
|
16
|
-
/** See Map Design.md */
|
|
17
|
-
design: any;
|
|
18
|
-
/** Called with new design. null/undefined for readonly */
|
|
19
|
-
onDesignChange?: any;
|
|
20
|
-
width?: number;
|
|
21
|
-
height?: number;
|
|
22
|
-
/** scope of the widget (when the widget self-selects a particular scope) */
|
|
23
|
-
scope?: any;
|
|
24
|
-
/** array of filters to apply. Each is { table: table id, jsonql: jsonql condition with {alias} for tableAlias. Use injectAlias to correct */
|
|
25
|
-
filters?: any;
|
|
26
|
-
/** called with (scope) as a scope to apply to self and filter to apply to other widgets. See WidgetScoper for details */
|
|
27
|
-
onScopeChange?: any;
|
|
28
|
-
onRowClick?: any;
|
|
29
|
-
/** TODO: implement refreshing */
|
|
30
|
-
refreshKey?: any;
|
|
31
|
-
}
|
|
32
|
-
interface MapWidgetComponentState {
|
|
33
|
-
editDesign: any;
|
|
34
|
-
transientDesign: any;
|
|
35
|
-
}
|
|
36
|
-
declare class MapWidgetComponent extends React.Component<MapWidgetComponentProps, MapWidgetComponentState> {
|
|
37
|
-
constructor(props: any);
|
|
38
|
-
componentDidUpdate(prevProps: any): void;
|
|
39
|
-
handleStartEditing: () => void;
|
|
40
|
-
handleEndEditing: () => void;
|
|
41
|
-
handleEditDesignChange: (design: any) => void;
|
|
42
|
-
renderEditor(): React.CElement<import("@mwater/react-library/lib/ModalWindowComponent").ModalWindowComponentProps, ModalWindowComponent> | null;
|
|
43
|
-
renderContent(design: any, onDesignChange: any, width: any, height: any): React.DetailedReactHTMLElement<{
|
|
44
|
-
style: {
|
|
45
|
-
width: any;
|
|
46
|
-
height: any;
|
|
47
|
-
padding: number;
|
|
48
|
-
};
|
|
49
|
-
}, HTMLElement>;
|
|
50
|
-
render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
51
|
-
}
|
|
52
|
-
export {};
|