@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
|
@@ -92,7 +92,9 @@ class CalendarChartViewComponent extends react_1.default.Component {
|
|
|
92
92
|
}
|
|
93
93
|
const scopeData = {
|
|
94
94
|
name: this.axisBuilder.summarizeAxis(this.props.design.dateAxis, this.context) +
|
|
95
|
-
|
|
95
|
+
" " +
|
|
96
|
+
T `is` +
|
|
97
|
+
" " +
|
|
96
98
|
this.axisBuilder.formatValue(this.props.design.dateAxis, data, this.context),
|
|
97
99
|
filter: {
|
|
98
100
|
jsonql: this.axisBuilder.createValueFilter(this.props.design.dateAxis, data),
|
|
@@ -31,4 +31,5 @@ export default class ImageMosaicChart extends Chart {
|
|
|
31
31
|
createDataTable(design: any, schema: Schema, dataSource: DataSource, data: any): never[];
|
|
32
32
|
getFilterableTables(design: any, schema: Schema): any[];
|
|
33
33
|
getPlaceholderIcon(): string;
|
|
34
|
+
translateDesign(design: ImageMosaicChartDesign, translate: (input: string) => string): ImageMosaicChartDesign;
|
|
34
35
|
}
|
|
@@ -178,5 +178,13 @@ class ImageMosaicChart extends Chart_1.default {
|
|
|
178
178
|
getPlaceholderIcon() {
|
|
179
179
|
return "fa-th";
|
|
180
180
|
}
|
|
181
|
+
translateDesign(design, translate) {
|
|
182
|
+
return (0, immer_1.default)(design, draft => {
|
|
183
|
+
// Translate title text
|
|
184
|
+
if (draft.titleText) {
|
|
185
|
+
draft.titleText = translate(draft.titleText);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
181
189
|
}
|
|
182
190
|
exports.default = ImageMosaicChart;
|
|
@@ -20,4 +20,6 @@ export default class LayeredChart extends Chart {
|
|
|
20
20
|
createDataTable(design: LayeredChartDesign, schema: Schema, dataSource: DataSource, data: any, locale: string): any[][];
|
|
21
21
|
getFilterableTables(design: LayeredChartDesign, schema: Schema): string[];
|
|
22
22
|
getPlaceholderIcon(): string;
|
|
23
|
+
/** Translates the design */
|
|
24
|
+
translateDesign(design: LayeredChartDesign, translate: (input: string) => string): LayeredChartDesign;
|
|
23
25
|
}
|
|
@@ -40,7 +40,7 @@ const LayeredChartUtils = __importStar(require("./LayeredChartUtils"));
|
|
|
40
40
|
const TextWidget_1 = __importDefault(require("../../text/TextWidget"));
|
|
41
41
|
const LayeredChartViewComponent_1 = __importDefault(require("./LayeredChartViewComponent"));
|
|
42
42
|
const LayeredChartDesignerComponent_1 = __importDefault(require("./LayeredChartDesignerComponent"));
|
|
43
|
-
|
|
43
|
+
const ExprItemsTranslator_1 = require("../../../richtext/ExprItemsTranslator");
|
|
44
44
|
class LayeredChart extends Chart_1.default {
|
|
45
45
|
cleanDesign(design, schema) {
|
|
46
46
|
const exprCleaner = new expressions_1.ExprCleaner(schema);
|
|
@@ -126,7 +126,7 @@ class LayeredChart extends Chart_1.default {
|
|
|
126
126
|
if (!layer.axes.y) {
|
|
127
127
|
return T `Missing Y Axis`;
|
|
128
128
|
}
|
|
129
|
-
if (!layer.axes.x && compiler.isXAxisRequired(design
|
|
129
|
+
if (!layer.axes.x && compiler.isXAxisRequired(design)) {
|
|
130
130
|
return T `Missing X Axis`;
|
|
131
131
|
}
|
|
132
132
|
if (!layer.axes.color && compiler.isColorAxisRequired(design, layerId)) {
|
|
@@ -222,7 +222,8 @@ class LayeredChart extends Chart_1.default {
|
|
|
222
222
|
width: options.width,
|
|
223
223
|
height: options.height,
|
|
224
224
|
scope: options.scope,
|
|
225
|
-
onScopeChange: options.onScopeChange
|
|
225
|
+
onScopeChange: options.onScopeChange,
|
|
226
|
+
locale: options.locale,
|
|
226
227
|
};
|
|
227
228
|
return react_1.default.createElement(LayeredChartViewComponent_1.default, props);
|
|
228
229
|
}
|
|
@@ -319,5 +320,64 @@ class LayeredChart extends Chart_1.default {
|
|
|
319
320
|
getPlaceholderIcon() {
|
|
320
321
|
return "fa-bar-chart";
|
|
321
322
|
}
|
|
323
|
+
/** Translates the design */
|
|
324
|
+
translateDesign(design, translate) {
|
|
325
|
+
return (0, immer_1.default)(design, draft => {
|
|
326
|
+
// Translate axis labels
|
|
327
|
+
if (draft.xAxisLabelText) {
|
|
328
|
+
draft.xAxisLabelText = translate(draft.xAxisLabelText);
|
|
329
|
+
}
|
|
330
|
+
if (draft.yAxisLabelText) {
|
|
331
|
+
draft.yAxisLabelText = translate(draft.yAxisLabelText);
|
|
332
|
+
}
|
|
333
|
+
// Translate layer names
|
|
334
|
+
for (const layer of draft.layers) {
|
|
335
|
+
if (layer.name) {
|
|
336
|
+
layer.name = translate(layer.name);
|
|
337
|
+
}
|
|
338
|
+
// Translate axis category labels
|
|
339
|
+
if (layer.axes.x?.categoryLabels) {
|
|
340
|
+
for (const key in layer.axes.x.categoryLabels) {
|
|
341
|
+
layer.axes.x.categoryLabels[key] = translate(layer.axes.x.categoryLabels[key]);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (layer.axes.y?.categoryLabels) {
|
|
345
|
+
for (const key in layer.axes.y.categoryLabels) {
|
|
346
|
+
layer.axes.y.categoryLabels[key] = translate(layer.axes.y.categoryLabels[key]);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (layer.axes.color?.categoryLabels) {
|
|
350
|
+
for (const key in layer.axes.color.categoryLabels) {
|
|
351
|
+
layer.axes.color.categoryLabels[key] = translate(layer.axes.color.categoryLabels[key]);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Translate null labels
|
|
355
|
+
if (layer.axes.x?.nullLabel) {
|
|
356
|
+
layer.axes.x.nullLabel = translate(layer.axes.x.nullLabel);
|
|
357
|
+
}
|
|
358
|
+
if (layer.axes.y?.nullLabel) {
|
|
359
|
+
layer.axes.y.nullLabel = translate(layer.axes.y.nullLabel);
|
|
360
|
+
}
|
|
361
|
+
if (layer.axes.color?.nullLabel) {
|
|
362
|
+
layer.axes.color.nullLabel = translate(layer.axes.color.nullLabel);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Translate y thresholds
|
|
366
|
+
if (draft.yThresholds) {
|
|
367
|
+
for (const threshold of draft.yThresholds) {
|
|
368
|
+
if (threshold.label) {
|
|
369
|
+
threshold.label = translate(threshold.label);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Translate header and footer using ExprItemsTranslator
|
|
374
|
+
if (draft.header) {
|
|
375
|
+
draft.header.items = (0, ExprItemsTranslator_1.translateHtmlItems)(draft.header.items || [], translate);
|
|
376
|
+
}
|
|
377
|
+
if (draft.footer) {
|
|
378
|
+
draft.footer.items = (0, ExprItemsTranslator_1.translateHtmlItems)(draft.footer.items || [], translate);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
}
|
|
322
382
|
}
|
|
323
383
|
exports.default = LayeredChart;
|
|
@@ -91,7 +91,7 @@ export default class LayeredChartCompiler {
|
|
|
91
91
|
}): ChartOptions;
|
|
92
92
|
isCategoricalX(design: LayeredChartDesign): boolean;
|
|
93
93
|
compileData(design: LayeredChartDesign, data: C3ChartData, locale?: string): C3Data;
|
|
94
|
-
compileDataPolar(design: LayeredChartDesign, data: C3ChartData, locale
|
|
94
|
+
compileDataPolar(design: LayeredChartDesign, data: C3ChartData, locale?: string): C3Data;
|
|
95
95
|
compileDataNonCategorical(design: LayeredChartDesign, data: C3ChartData, locale?: string): C3Data;
|
|
96
96
|
fixStringYValues(rows?: any): any;
|
|
97
97
|
flattenRowData(rows: any): any[];
|
|
@@ -558,7 +558,7 @@ class LayeredChartCompiler {
|
|
|
558
558
|
const trendlineSeries = seriesY + ":trendline";
|
|
559
559
|
columns.push([trendlineSeries].concat(calculateLinearRegression(yValues, xValues)));
|
|
560
560
|
types[trendlineSeries] = billboard_js_1.line ? (0, billboard_js_1.line)() : "line";
|
|
561
|
-
names[trendlineSeries] = names[seriesY] + T `
|
|
561
|
+
names[trendlineSeries] = names[seriesY] + " " + T `Trendline`;
|
|
562
562
|
xs[trendlineSeries] = seriesX;
|
|
563
563
|
colors[trendlineSeries] = layer.color || defaultColors[layerIndex];
|
|
564
564
|
legendHide.push(trendlineSeries); // Hide in legend
|
|
@@ -195,7 +195,7 @@ class LayeredChartDesignerComponent extends react_1.default.Component {
|
|
|
195
195
|
return R("div", null, lodash_1.default.map(this.props.design.layers, (layer, i) => this.renderLayer(i)),
|
|
196
196
|
// Only add if last has table
|
|
197
197
|
this.props.design.layers.length > 0 && lodash_1.default.last(this.props.design.layers).table
|
|
198
|
-
? R("button", { className: "btn btn-link", type: "button", onClick: this.handleAddLayer }, R("span", { className: "fas fa-plus" }), T `
|
|
198
|
+
? R("button", { className: "btn btn-link", type: "button", onClick: this.handleAddLayer }, R("span", { className: "fas fa-plus" }), " ", T `Add Another Series`)
|
|
199
199
|
: undefined);
|
|
200
200
|
}
|
|
201
201
|
renderOptions() {
|
|
@@ -306,7 +306,7 @@ class ThresholdsComponent extends react_1.default.Component {
|
|
|
306
306
|
onRemove: this.handleRemove.bind(null, index),
|
|
307
307
|
showHighlightColor: this.props.showHighlightColor
|
|
308
308
|
});
|
|
309
|
-
}), R("button", { type: "button", className: "btn btn-sm btn-link", onClick: this.handleAdd }, R("i", { className: "fa fa-plus" }), T `
|
|
309
|
+
}), R("button", { type: "button", className: "btn btn-sm btn-link", onClick: this.handleAdd }, R("i", { className: "fa fa-plus" }), " ", T `Add Y Threshold`));
|
|
310
310
|
}
|
|
311
311
|
}
|
|
312
312
|
class ThresholdComponent extends react_1.default.Component {
|
|
@@ -93,7 +93,8 @@ class LayeredChartViewComponent extends react_1.default.Component {
|
|
|
93
93
|
schema: this.props.schema,
|
|
94
94
|
dataSource: this.props.dataSource,
|
|
95
95
|
exprValues: this.props.data.header || {},
|
|
96
|
-
width: this.props.width
|
|
96
|
+
width: this.props.width,
|
|
97
|
+
locale: this.context
|
|
97
98
|
}));
|
|
98
99
|
}
|
|
99
100
|
renderFooter() {
|
|
@@ -109,7 +110,8 @@ class LayeredChartViewComponent extends react_1.default.Component {
|
|
|
109
110
|
schema: this.props.schema,
|
|
110
111
|
dataSource: this.props.dataSource,
|
|
111
112
|
exprValues: this.props.data.footer || {},
|
|
112
|
-
width: this.props.width
|
|
113
|
+
width: this.props.width,
|
|
114
|
+
locale: this.context
|
|
113
115
|
}));
|
|
114
116
|
}
|
|
115
117
|
render() {
|
|
@@ -147,6 +149,9 @@ class C3ChartComponent extends react_1.default.Component {
|
|
|
147
149
|
if (this.chart) {
|
|
148
150
|
this.chart.destroy();
|
|
149
151
|
}
|
|
152
|
+
if (!this.chartDiv) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
150
155
|
const compiler = new LayeredChartCompiler_1.default({ schema: props.schema });
|
|
151
156
|
const chartOptions = compiler.createChartOptions({
|
|
152
157
|
design: this.props.design,
|
|
@@ -450,7 +455,7 @@ class C3ChartComponent extends react_1.default.Component {
|
|
|
450
455
|
// css += ".c3-title { font-size: #{scale * 14}px; }\n"
|
|
451
456
|
return R("div", {
|
|
452
457
|
ref: c => {
|
|
453
|
-
|
|
458
|
+
this.chartDiv = c;
|
|
454
459
|
}
|
|
455
460
|
});
|
|
456
461
|
}
|
|
@@ -39,4 +39,5 @@ export default class PivotChart extends Chart {
|
|
|
39
39
|
createDataTable(design: PivotChartDesign, schema: Schema, dataSource: DataSource, data: any, locale: string): (string | undefined)[][];
|
|
40
40
|
getFilterableTables(design: PivotChartDesign, schema: Schema): string[];
|
|
41
41
|
getPlaceholderIcon(): string;
|
|
42
|
+
translateDesign(design: PivotChartDesign, translate: (input: string) => string): PivotChartDesign;
|
|
42
43
|
}
|
|
@@ -39,6 +39,7 @@ const TextWidget_1 = __importDefault(require("../../text/TextWidget"));
|
|
|
39
39
|
const PivotChartUtils = __importStar(require("./PivotChartUtils"));
|
|
40
40
|
const PivotChartQueryBuilder_1 = __importDefault(require("./PivotChartQueryBuilder"));
|
|
41
41
|
const PivotChartLayoutBuilder_1 = __importDefault(require("./PivotChartLayoutBuilder"));
|
|
42
|
+
const ExprItemsTranslator_1 = require("../../../richtext/ExprItemsTranslator");
|
|
42
43
|
// Store true as a weakly cached value if a design is already clean
|
|
43
44
|
const cleanDesignCache = new expressions_1.WeakCache();
|
|
44
45
|
class PivotChart extends Chart_1.default {
|
|
@@ -377,5 +378,67 @@ class PivotChart extends Chart_1.default {
|
|
|
377
378
|
getPlaceholderIcon() {
|
|
378
379
|
return "fa-magic";
|
|
379
380
|
}
|
|
381
|
+
translateDesign(design, translate) {
|
|
382
|
+
return (0, immer_1.default)(design, draft => {
|
|
383
|
+
// Helper function to translate a segment and its children
|
|
384
|
+
const translateSegment = (segment) => {
|
|
385
|
+
// Translate segment label
|
|
386
|
+
if (segment.label) {
|
|
387
|
+
segment.label = translate(segment.label);
|
|
388
|
+
}
|
|
389
|
+
// Translate value axis labels
|
|
390
|
+
if (segment.valueAxis?.categoryLabels) {
|
|
391
|
+
for (const key in segment.valueAxis.categoryLabels) {
|
|
392
|
+
segment.valueAxis.categoryLabels[key] = translate(segment.valueAxis.categoryLabels[key]);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Translate null label
|
|
396
|
+
if (segment.valueAxis?.nullLabel) {
|
|
397
|
+
segment.valueAxis.nullLabel = translate(segment.valueAxis.nullLabel);
|
|
398
|
+
}
|
|
399
|
+
// Recursively translate children
|
|
400
|
+
if (segment.children) {
|
|
401
|
+
segment.children.forEach(translateSegment);
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
// Translate all row segments
|
|
405
|
+
draft.rows.forEach(translateSegment);
|
|
406
|
+
// Translate all column segments
|
|
407
|
+
draft.columns.forEach(translateSegment);
|
|
408
|
+
// Translate all intersections
|
|
409
|
+
for (const intersection of Object.values(draft.intersections)) {
|
|
410
|
+
// Translate value axis labels
|
|
411
|
+
if (intersection.valueAxis?.categoryLabels) {
|
|
412
|
+
for (const key in intersection.valueAxis.categoryLabels) {
|
|
413
|
+
intersection.valueAxis.categoryLabels[key] = translate(intersection.valueAxis.categoryLabels[key]);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// Translate null label
|
|
417
|
+
if (intersection.valueAxis?.nullLabel) {
|
|
418
|
+
intersection.valueAxis.nullLabel = translate(intersection.valueAxis.nullLabel);
|
|
419
|
+
}
|
|
420
|
+
// Translate segment value axis override labels
|
|
421
|
+
if (intersection.segmentValueAxisOverrides) {
|
|
422
|
+
for (const axis of Object.values(intersection.segmentValueAxisOverrides)) {
|
|
423
|
+
if (axis?.categoryLabels) {
|
|
424
|
+
for (const key in axis.categoryLabels) {
|
|
425
|
+
axis.categoryLabels[key] = translate(axis.categoryLabels[key]);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (axis?.nullLabel) {
|
|
429
|
+
axis.nullLabel = translate(axis.nullLabel);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// Translate header and footer using ExprItemsTranslator
|
|
435
|
+
if (draft.header?.items) {
|
|
436
|
+
draft.header.items = (0, ExprItemsTranslator_1.translateHtmlItems)(draft.header.items, translate);
|
|
437
|
+
}
|
|
438
|
+
if (draft.footer?.items) {
|
|
439
|
+
draft.footer.items = (0, ExprItemsTranslator_1.translateHtmlItems)(draft.footer.items, translate);
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
}
|
|
380
443
|
}
|
|
381
444
|
exports.default = PivotChart;
|
|
@@ -252,7 +252,7 @@ class LayoutCellComponent extends react_1.default.Component {
|
|
|
252
252
|
}
|
|
253
253
|
return R("span", { style: { fontSize: "90%" } }, R("a", { className: "link-plain", onClick: this.props.onEditSection }, T `Edit`), cell.summarize
|
|
254
254
|
? [
|
|
255
|
-
R("span", { className: "text-muted" },
|
|
255
|
+
R("span", { className: "text-muted" }, ` / `),
|
|
256
256
|
R("a", { className: "link-plain", onClick: this.props.onSummarizeSegment }, T `Summarize`)
|
|
257
257
|
]
|
|
258
258
|
: undefined);
|
|
@@ -83,9 +83,12 @@ class SegmentDesignerComponent extends react_1.default.Component {
|
|
|
83
83
|
label: T `Type`
|
|
84
84
|
}, react_1.default.createElement(ui.Radio, { key: "single", value: this.state.mode, radioValue: "single", onChange: this.handleMode },
|
|
85
85
|
T `Single ${this.props.segmentType}`,
|
|
86
|
-
react_1.default.createElement("span", { className: "text-muted" },
|
|
86
|
+
react_1.default.createElement("span", { className: "text-muted" },
|
|
87
|
+
` - `,
|
|
88
|
+
T `used for summary ${this.props.segmentType}s and empty ${this.props.segmentType}s`)), react_1.default.createElement(ui.Radio, { key: "multiple", value: this.state.mode, radioValue: "multiple", onChange: this.handleMode },
|
|
87
89
|
T `Multiple ${this.props.segmentType}s`,
|
|
88
|
-
|
|
90
|
+
" - ",
|
|
91
|
+
react_1.default.createElement("span", { className: "text-muted" }, T `disaggregate data by a field`)));
|
|
89
92
|
}
|
|
90
93
|
renderLabel() {
|
|
91
94
|
return R(ui.FormGroup, {
|
|
@@ -132,7 +135,7 @@ class SegmentDesignerComponent extends react_1.default.Component {
|
|
|
132
135
|
renderFilter() {
|
|
133
136
|
return R(ui.FormGroup, {
|
|
134
137
|
labelMuted: true,
|
|
135
|
-
label: [R(ui.Icon, { id: "glyphicon-filter" }), T `
|
|
138
|
+
label: [R(ui.Icon, { id: "glyphicon-filter" }), " ", T `Filters`],
|
|
136
139
|
hint: T `Filters all data associated with this ${this.props.segmentType}`
|
|
137
140
|
}, R(expressions_ui_2.FilterExprComponent, {
|
|
138
141
|
schema: this.props.schema,
|
|
@@ -180,7 +183,7 @@ class SegmentDesignerComponent extends react_1.default.Component {
|
|
|
180
183
|
renderOrderExpr() {
|
|
181
184
|
return R(ui.FormGroup, {
|
|
182
185
|
labelMuted: true,
|
|
183
|
-
label: [R(ui.Icon, { id: "fa-sort-amount-asc" }), T `
|
|
186
|
+
label: [R(ui.Icon, { id: "fa-sort-amount-asc" }), " ", T `Sort`],
|
|
184
187
|
hint: T `Sorts the display of this ${this.props.segmentType}`
|
|
185
188
|
}, R(expressions_ui_1.ExprComponent, {
|
|
186
189
|
schema: this.props.schema,
|
|
@@ -37,7 +37,7 @@ class OrderingsComponent extends react_1.default.Component {
|
|
|
37
37
|
onOrderingChange: this.handleOrderingChange.bind(null, i),
|
|
38
38
|
onOrderingRemove: this.handleOrderingRemove.bind(null, i)
|
|
39
39
|
});
|
|
40
|
-
}), R("button", { type: "button", className: "btn btn-sm btn-secondary", onClick: this.handleAdd, key: "add" }, R("span", { className: "fas fa-plus" }), T `
|
|
40
|
+
}), R("button", { type: "button", className: "btn btn-sm btn-secondary", onClick: this.handleAdd, key: "add" }, R("span", { className: "fas fa-plus" }), " ", T `Add Ordering`));
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
exports.default = OrderingsComponent;
|
|
@@ -54,4 +54,5 @@ export default class TableChart extends Chart {
|
|
|
54
54
|
createDataTable(design: any, schema: Schema, dataSource: DataSource, data: any, locale: any): any[][];
|
|
55
55
|
getFilterableTables(design: any, schema: Schema): any[];
|
|
56
56
|
getPlaceholderIcon(): string;
|
|
57
|
+
translateDesign(design: TableChartDesign, translate: (input: string) => string): TableChartDesign;
|
|
57
58
|
}
|
|
@@ -321,5 +321,20 @@ class TableChart extends Chart_1.default {
|
|
|
321
321
|
getPlaceholderIcon() {
|
|
322
322
|
return "fa-table";
|
|
323
323
|
}
|
|
324
|
+
translateDesign(design, translate) {
|
|
325
|
+
return (0, immer_1.default)(design, draft => {
|
|
326
|
+
// Translate title text
|
|
327
|
+
if (draft.titleText) {
|
|
328
|
+
draft.titleText = translate(draft.titleText);
|
|
329
|
+
}
|
|
330
|
+
// Translate column headers and axis labels
|
|
331
|
+
for (const column of draft.columns) {
|
|
332
|
+
// Translate header text
|
|
333
|
+
if (column.headerText) {
|
|
334
|
+
column.headerText = translate(column.headerText);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
}
|
|
324
339
|
}
|
|
325
340
|
exports.default = TableChart;
|
|
@@ -2,11 +2,12 @@ import React from "react";
|
|
|
2
2
|
import RichTextComponent from "../../richtext/RichTextComponent";
|
|
3
3
|
import ExprInsertModalComponent from "./ExprInsertModalComponent";
|
|
4
4
|
import ExprUpdateModalComponent from "./ExprUpdateModalComponent";
|
|
5
|
-
import ExprItemsHtmlConverter from "../../richtext/ExprItemsHtmlConverter";
|
|
5
|
+
import ExprItemsHtmlConverter, { HtmlItemExpr, HtmlItemOrExpr } from "../../richtext/ExprItemsHtmlConverter";
|
|
6
6
|
import { TextWidgetDesign } from "./TextWidgetDesign";
|
|
7
7
|
import { DataSource, Schema } from "@mwater/expressions";
|
|
8
8
|
export interface TextComponentProps {
|
|
9
9
|
design: TextWidgetDesign;
|
|
10
|
+
/** Called when design changes. If not set, will be in display mode, otherwise in edit mode */
|
|
10
11
|
onDesignChange?: (design: TextWidgetDesign) => void;
|
|
11
12
|
schema: Schema;
|
|
12
13
|
dataSource: DataSource;
|
|
@@ -22,17 +23,23 @@ export interface TextComponentProps {
|
|
|
22
23
|
namedStrings?: {
|
|
23
24
|
[key: string]: string;
|
|
24
25
|
};
|
|
26
|
+
/** Locale to use for display */
|
|
27
|
+
locale: string;
|
|
25
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Text component which is provided with the data it needs, rather than loading it.
|
|
31
|
+
* Used by TextWidgetComponent and also by other components that embed text fields
|
|
32
|
+
*/
|
|
26
33
|
export default class TextComponent extends React.Component<TextComponentProps> {
|
|
27
34
|
static contextType: React.Context<string>;
|
|
28
35
|
exprInsertModal: ExprInsertModalComponent | null;
|
|
29
36
|
exprUpdateModal: ExprUpdateModalComponent | null;
|
|
30
37
|
editor: RichTextComponent | null;
|
|
31
38
|
createItemsHtmlConverter(): ExprItemsHtmlConverter;
|
|
32
|
-
handleItemsChange: (items:
|
|
33
|
-
handleInsertExpr: (item:
|
|
39
|
+
handleItemsChange: (items: HtmlItemOrExpr[]) => void;
|
|
40
|
+
handleInsertExpr: (item: HtmlItemExpr) => void;
|
|
34
41
|
replaceItem(item: any): void;
|
|
35
|
-
handleItemClick: (item:
|
|
42
|
+
handleItemClick: (item: HtmlItemExpr) => void;
|
|
36
43
|
handleAddExpr: (ev: React.MouseEvent<HTMLDivElement>) => void;
|
|
37
44
|
renderExtraPaletteButtons(): React.JSX.Element;
|
|
38
45
|
renderModals(): React.JSX.Element[];
|
|
@@ -10,8 +10,10 @@ const ExprInsertModalComponent_1 = __importDefault(require("./ExprInsertModalCom
|
|
|
10
10
|
const ExprUpdateModalComponent_1 = __importDefault(require("./ExprUpdateModalComponent"));
|
|
11
11
|
const ExprItemsHtmlConverter_1 = __importDefault(require("../../richtext/ExprItemsHtmlConverter"));
|
|
12
12
|
const expressions_ui_1 = require("@mwater/expressions-ui");
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Text component which is provided with the data it needs, rather than loading it.
|
|
15
|
+
* Used by TextWidgetComponent and also by other components that embed text fields
|
|
16
|
+
*/
|
|
15
17
|
class TextComponent extends react_1.default.Component {
|
|
16
18
|
static contextType = expressions_ui_1.LocaleContext;
|
|
17
19
|
exprInsertModal = null;
|
|
@@ -19,7 +21,7 @@ class TextComponent extends react_1.default.Component {
|
|
|
19
21
|
editor = null;
|
|
20
22
|
createItemsHtmlConverter() {
|
|
21
23
|
return new ExprItemsHtmlConverter_1.default(this.props.schema, this.props.onDesignChange != null, this.props.exprValues,
|
|
22
|
-
// Display summaries if in design
|
|
24
|
+
// Display summaries if in design mode and singleRowTable is set
|
|
23
25
|
this.props.onDesignChange != null && this.props.singleRowTable != null,
|
|
24
26
|
// Only replace named strings if not editing
|
|
25
27
|
this.props.onDesignChange == null ? this.props.namedStrings : undefined, this.context);
|
|
@@ -45,22 +47,23 @@ class TextComponent extends react_1.default.Component {
|
|
|
45
47
|
}
|
|
46
48
|
});
|
|
47
49
|
const items = replaceItemInItems(this.props.design.items || [], item);
|
|
48
|
-
|
|
50
|
+
this.props.onDesignChange({ ...this.props.design, items });
|
|
49
51
|
}
|
|
50
52
|
handleItemClick = (item) => {
|
|
51
|
-
|
|
53
|
+
this.exprUpdateModal.open(item, (item) => {
|
|
52
54
|
// Replace in items
|
|
53
|
-
|
|
55
|
+
this.replaceItem(item);
|
|
54
56
|
});
|
|
55
57
|
};
|
|
56
58
|
handleAddExpr = (ev) => {
|
|
57
59
|
ev.preventDefault();
|
|
58
|
-
|
|
60
|
+
this.exprInsertModal.open();
|
|
59
61
|
};
|
|
60
62
|
renderExtraPaletteButtons() {
|
|
61
63
|
return (react_1.default.createElement("div", { key: "expr", className: "mwater-visualization-text-palette-item", onMouseDown: this.handleAddExpr },
|
|
62
64
|
react_1.default.createElement("i", { className: "fa fa-plus" }),
|
|
63
|
-
|
|
65
|
+
" ",
|
|
66
|
+
T `Expression`));
|
|
64
67
|
}
|
|
65
68
|
renderModals() {
|
|
66
69
|
return [
|
|
@@ -11,8 +11,8 @@ export default class TextWidget extends Widget {
|
|
|
11
11
|
dataSource: DataSource;
|
|
12
12
|
widgetDataSource: import("../WidgetDataSource").WidgetDataSource;
|
|
13
13
|
filters: JsonQLFilter[];
|
|
14
|
-
design:
|
|
15
|
-
onDesignChange: ((design:
|
|
14
|
+
design: any;
|
|
15
|
+
onDesignChange: ((design: any) => void) | null | undefined;
|
|
16
16
|
width: number | undefined;
|
|
17
17
|
height: number | undefined;
|
|
18
18
|
singleRowTable: string | undefined;
|
|
@@ -21,10 +21,13 @@ export default class TextWidget extends Widget {
|
|
|
21
21
|
} | undefined;
|
|
22
22
|
ref: ((widget: any) => void) | undefined;
|
|
23
23
|
refreshKey: any;
|
|
24
|
+
locale: string;
|
|
25
|
+
translate: (input: string) => string;
|
|
24
26
|
}, any>;
|
|
25
27
|
getData(design: any, schema: Schema, dataSource: DataSource, filters: JsonQLFilter[], callback: any): any;
|
|
26
28
|
isAutoHeight(): boolean;
|
|
27
|
-
getExprItems(items
|
|
29
|
+
getExprItems(items?: HtmlItem[]): HtmlItemExpr[];
|
|
28
30
|
getFilterableTables(design: TextWidgetDesign | undefined, schema: Schema): string[];
|
|
29
31
|
getTOCEntries(design: any, namedStrings: any): any;
|
|
32
|
+
getTranslatableStrings(design: TextWidgetDesign, schema: Schema): string[];
|
|
30
33
|
}
|
|
@@ -12,6 +12,7 @@ const expressions_2 = require("@mwater/expressions");
|
|
|
12
12
|
const expressions_3 = require("@mwater/expressions");
|
|
13
13
|
const expressions_4 = require("@mwater/expressions");
|
|
14
14
|
const Widget_1 = __importDefault(require("../Widget"));
|
|
15
|
+
const ExprItemsTranslator_1 = require("../../richtext/ExprItemsTranslator");
|
|
15
16
|
class TextWidget extends Widget_1.default {
|
|
16
17
|
// Creates a React element that is a view of the widget
|
|
17
18
|
// options:
|
|
@@ -42,7 +43,9 @@ class TextWidget extends Widget_1.default {
|
|
|
42
43
|
singleRowTable: options.singleRowTable,
|
|
43
44
|
namedStrings: options.namedStrings,
|
|
44
45
|
ref: options.widgetRef,
|
|
45
|
-
refreshKey: options.refreshKey
|
|
46
|
+
refreshKey: options.refreshKey,
|
|
47
|
+
locale: options.locale,
|
|
48
|
+
translate: options.translate
|
|
46
49
|
});
|
|
47
50
|
}
|
|
48
51
|
// Get the data that the widget needs. This will be called on the server, typically.
|
|
@@ -243,5 +246,8 @@ class TextWidget extends Widget_1.default {
|
|
|
243
246
|
findRecursive(design.items);
|
|
244
247
|
return entries;
|
|
245
248
|
}
|
|
249
|
+
getTranslatableStrings(design, schema) {
|
|
250
|
+
return (0, ExprItemsTranslator_1.getHtmlItemsStrings)(design.items || []);
|
|
251
|
+
}
|
|
246
252
|
}
|
|
247
253
|
exports.default = TextWidget;
|
|
@@ -19,6 +19,10 @@ export interface TextWidgetComponentProps {
|
|
|
19
19
|
namedStrings?: any;
|
|
20
20
|
/** A key that changes when the widget should be refreshed */
|
|
21
21
|
refreshKey?: any;
|
|
22
|
+
/** Locale to use for display */
|
|
23
|
+
locale: string;
|
|
24
|
+
/** Translate function to use for display. Returns same string when editing. */
|
|
25
|
+
translate: (input: string) => string;
|
|
22
26
|
}
|
|
23
27
|
export default class TextWidgetComponent extends AsyncLoadComponent<TextWidgetComponentProps, {
|
|
24
28
|
loading: boolean;
|
|
@@ -13,6 +13,7 @@ const ActionCancelModalComponent_1 = __importDefault(require("@mwater/react-libr
|
|
|
13
13
|
const bootstrap_1 = require("@mwater/react-library/lib/bootstrap");
|
|
14
14
|
const ColorComponent_1 = __importDefault(require("../../ColorComponent"));
|
|
15
15
|
const bootstrap_2 = require("@mwater/react-library/lib/bootstrap");
|
|
16
|
+
const ExprItemsTranslator_1 = require("../../richtext/ExprItemsTranslator");
|
|
16
17
|
// Widget which displays styled text with embedded expressions
|
|
17
18
|
class TextWidgetComponent extends AsyncLoadComponent_1.default {
|
|
18
19
|
divComp;
|
|
@@ -123,7 +124,12 @@ class TextWidgetComponent extends AsyncLoadComponent_1.default {
|
|
|
123
124
|
// If loading, don't display old values
|
|
124
125
|
const exprValues = !this.state.loading ? this.state.exprValues : {};
|
|
125
126
|
const padding = this.props.design.padding ?? 0;
|
|
126
|
-
|
|
127
|
+
// Translate items if needed
|
|
128
|
+
const translatedDesign = this.props.onDesignChange ? this.props.design : {
|
|
129
|
+
...this.props.design,
|
|
130
|
+
items: (0, ExprItemsTranslator_1.translateHtmlItems)(this.props.design.items || [], this.props.translate)
|
|
131
|
+
};
|
|
132
|
+
return (react_1.default.createElement(TextComponent_1.default, { design: translatedDesign, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, exprValues: exprValues, width: this.props.width ? this.props.width - padding * 2 : undefined, height: this.props.height ? this.props.height - padding * 2 : undefined, singleRowTable: this.props.singleRowTable, namedStrings: this.props.namedStrings, locale: this.props.locale }));
|
|
127
133
|
}
|
|
128
134
|
render() {
|
|
129
135
|
const borderStyle = this.props.design.borderThickness && this.props.design.borderColor
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { HtmlItem } from "../../richtext/ItemsHtmlConverter";
|
|
3
|
-
export type TextWidgetItem = HtmlItem | HtmlItemExpr;
|
|
1
|
+
import { HtmlItemOrExpr } from "../../richtext/ExprItemsHtmlConverter";
|
|
4
2
|
export interface TextWidgetDesign {
|
|
5
3
|
/** Text widget stores its content as array of items. See ItemsHtmlConverter TODO */
|
|
6
|
-
items
|
|
4
|
+
items?: HtmlItemOrExpr[];
|
|
7
5
|
/** "title" for title block. default is "default" */
|
|
8
6
|
style?: "title" | "default" | "header" | "footer";
|
|
9
7
|
/** Background color of the text widget (optional) */
|
|
@@ -3,5 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.isEmptyTextWidgetDesign = isEmptyTextWidgetDesign;
|
|
4
4
|
/** Returns true if the text widget design is empty. */
|
|
5
5
|
function isEmptyTextWidgetDesign(design) {
|
|
6
|
-
return design == null || design.items.length === 0;
|
|
6
|
+
return design == null || (design.items != null && design.items.length === 0);
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mwater/visualization",
|
|
3
|
-
"version": "5.4.
|
|
3
|
+
"version": "5.4.3",
|
|
4
4
|
"description": "Visualization library",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "
|
|
8
|
-
"test-browser": "
|
|
9
|
-
"watch": "
|
|
7
|
+
"test": "./node_modules/build-library/test-cli",
|
|
8
|
+
"test-browser": "./node_modules/build-library/test-browser",
|
|
9
|
+
"watch": "./node_modules/build-library/watch",
|
|
10
10
|
"build": "rsync -av --exclude '*.ts' --exclude '*.tsx' src/ lib/ ; tsc -p tsconfig.build.json",
|
|
11
11
|
"prepublish": "npm run build"
|
|
12
12
|
},
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"async": "^1.2.1",
|
|
30
30
|
"async-latest": "^1.0.0",
|
|
31
31
|
"backbone": "~1.1.2",
|
|
32
|
-
"billboard.js": "3.
|
|
32
|
+
"billboard.js": "3.14.0",
|
|
33
33
|
"canonical-json": "0.0.4",
|
|
34
34
|
"classnames": "^2.3.1",
|
|
35
35
|
"color": "^3.2.1",
|
|
@@ -41,9 +41,8 @@
|
|
|
41
41
|
"d3-tip": "^0.9.0",
|
|
42
42
|
"dayjs": "^1.11.10",
|
|
43
43
|
"dompurify": "^1.0.11",
|
|
44
|
-
"ez-localize": "^2.
|
|
44
|
+
"ez-localize": "^2.13.0",
|
|
45
45
|
"file-saver": "^2.0.5",
|
|
46
|
-
"fixed-data-table-2": "^1.2.15",
|
|
47
46
|
"immer": "^8.0.0",
|
|
48
47
|
"immutable-setter": "^1.1.1",
|
|
49
48
|
"jquery": "^3.6.3",
|
|
@@ -85,7 +84,7 @@
|
|
|
85
84
|
"@types/d3": "^5.16.4",
|
|
86
85
|
"@types/d3-format": "^1.4.1",
|
|
87
86
|
"@types/dompurify": "0.0.32",
|
|
88
|
-
"@types/
|
|
87
|
+
"@types/file-saver": "^2.0.7",
|
|
89
88
|
"@types/jquery": "^3.5.5",
|
|
90
89
|
"@types/leaflet": "^1.7.9",
|
|
91
90
|
"@types/lodash": "^3.10.3",
|
package/src/ColorComponent.tsx
CHANGED
|
@@ -64,8 +64,7 @@ export default class ColorComponent extends React.Component<ColorComponentProps,
|
|
|
64
64
|
<div style={popupPosition}>
|
|
65
65
|
{!this.props.disableReset && (
|
|
66
66
|
<button type="button" className="btn btn-link btn-sm" onClick={this.handleReset}>
|
|
67
|
-
<i className="fa fa-undo" />
|
|
68
|
-
{T` Reset Color`}
|
|
67
|
+
<i className="fa fa-undo" /> {T`Reset Color`}
|
|
69
68
|
</button>
|
|
70
69
|
)}
|
|
71
70
|
<button type="button" className="btn btn-link btn-sm" onClick={this.handleAdvanced}>
|