@mwater/visualization 5.2.0 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/lib/ColorComponent.d.ts +10 -11
  2. package/lib/ColorComponent.js +78 -29
  3. package/lib/ColorSchemeFactory.d.ts +13 -2
  4. package/lib/ColorSchemeFactory.js +7 -5
  5. package/lib/CustomColorsContext.d.ts +6 -0
  6. package/lib/CustomColorsContext.js +6 -0
  7. package/lib/FiltersDesignerComponent.d.ts +1 -4
  8. package/lib/FiltersDesignerComponent.js +2 -3
  9. package/lib/LocaleContextInjector.d.ts +5 -11
  10. package/lib/LocaleContextInjector.js +4 -12
  11. package/lib/MWaterAddRelatedFormComponent.js +3 -3
  12. package/lib/MWaterAddRelatedIndicatorComponent.d.ts +1 -4
  13. package/lib/MWaterAddRelatedIndicatorComponent.js +6 -6
  14. package/lib/MWaterCompleteTableSelectComponent.d.ts +5 -16
  15. package/lib/MWaterCompleteTableSelectComponent.js +36 -36
  16. package/lib/MWaterContextComponent.d.ts +4 -6
  17. package/lib/MWaterContextComponent.js +4 -13
  18. package/lib/MWaterLoaderComponent.d.ts +5 -3
  19. package/lib/MWaterLoaderComponent.js +2 -1
  20. package/lib/MWaterTableSelectComponent.d.ts +1 -4
  21. package/lib/MWaterTableSelectComponent.js +10 -12
  22. package/lib/UIComponents.d.ts +2 -2
  23. package/lib/UIComponents.js +4 -12
  24. package/lib/axes/AxisBuilder.d.ts +7 -4
  25. package/lib/axes/AxisBuilder.js +3 -1
  26. package/lib/axes/AxisComponent.d.ts +2 -5
  27. package/lib/axes/AxisComponent.js +1 -2
  28. package/lib/axes/ColorPaletteCollectionComponent.d.ts +5 -12
  29. package/lib/axes/ColorPaletteCollectionComponent.js +67 -36
  30. package/lib/dashboards/DashboardComponent.d.ts +4 -12
  31. package/lib/dashboards/DashboardComponent.js +18 -38
  32. package/lib/dashboards/DashboardDesign.d.ts +3 -3
  33. package/lib/dashboards/DashboardUpgrader.js +36 -1
  34. package/lib/dashboards/DashboardViewComponent.d.ts +5 -34
  35. package/lib/dashboards/DashboardViewComponent.js +109 -132
  36. package/lib/dashboards/FontStyleEditor.d.ts +8 -0
  37. package/lib/dashboards/FontStyleEditor.js +130 -0
  38. package/lib/dashboards/LayoutOptionsComponent.d.ts +0 -1
  39. package/lib/dashboards/LayoutOptionsComponent.js +211 -42
  40. package/lib/dashboards/ServerDashboardDataSource.d.ts +1 -2
  41. package/lib/dashboards/ServerDashboardDataSource.js +52 -33
  42. package/lib/dashboards/WidgetComponent.d.ts +3 -3
  43. package/lib/dashboards/WidgetComponent.js +3 -6
  44. package/lib/dashboards/WidgetDataSourcePrioritizer.d.ts +20 -0
  45. package/lib/dashboards/WidgetDataSourcePrioritizer.js +72 -0
  46. package/lib/dashboards/layoutOptions.d.ts +83 -0
  47. package/lib/dashboards/layoutOptions.js +436 -10
  48. package/lib/datagrids/DatagridDesign.d.ts +7 -6
  49. package/lib/datagrids/ServerDatagridDataSource.d.ts +7 -6
  50. package/lib/datagrids/ServerDatagridDataSource.js +87 -33
  51. package/lib/demo.js +3 -3
  52. package/lib/index.css +5 -0
  53. package/lib/index.d.ts +1 -1
  54. package/lib/index.js +0 -1
  55. package/lib/layouts/LayoutManager.d.ts +33 -29
  56. package/lib/layouts/LayoutManager.js +2 -8
  57. package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +26 -57
  58. package/lib/layouts/blocks/BlocksDisplayComponent.js +122 -205
  59. package/lib/layouts/blocks/BlocksLayoutManager.d.ts +6 -22
  60. package/lib/layouts/blocks/BlocksLayoutManager.js +5 -14
  61. package/lib/layouts/blocks/HorizontalBlockComponent.d.ts +5 -4
  62. package/lib/layouts/blocks/HorizontalBlockComponent.js +5 -5
  63. package/lib/mWaterLoader.d.ts +2 -0
  64. package/lib/mWaterLoader.js +2 -1
  65. package/lib/maps/AddLayerComponent.d.ts +6 -8
  66. package/lib/maps/AddLayerComponent.js +6 -6
  67. package/lib/maps/BingLayer.js +10 -20
  68. package/lib/maps/BufferLayer.js +2 -1
  69. package/lib/maps/ChoroplethLayer.js +2 -1
  70. package/lib/maps/DirectMapDataSource.d.ts +5 -2
  71. package/lib/maps/DirectMapDataSource.js +2 -1
  72. package/lib/maps/EditPopupComponent.js +2 -1
  73. package/lib/maps/MapComponent.d.ts +1 -4
  74. package/lib/maps/MapComponent.js +3 -3
  75. package/lib/maps/MarkersLayer.js +30 -25
  76. package/lib/maps/RasterMapViewComponent.d.ts +1 -4
  77. package/lib/maps/RasterMapViewComponent.js +3 -3
  78. package/lib/maps/ServerMapDataSource.d.ts +2 -3
  79. package/lib/maps/ServerMapDataSource.js +5 -5
  80. package/lib/maps/VectorMapViewComponent.js +2 -1
  81. package/lib/maps/mapSymbols.js +2 -0
  82. package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
  83. package/lib/maps/vectorMaps.js +61 -55
  84. package/lib/quickfilter/QuickfiltersComponent.d.ts +1 -4
  85. package/lib/quickfilter/QuickfiltersComponent.js +3 -3
  86. package/lib/richtext/DropdownPaletteItem.d.ts +32 -0
  87. package/lib/richtext/DropdownPaletteItem.js +82 -0
  88. package/lib/richtext/FontColorPaletteItem.d.ts +1 -5
  89. package/lib/richtext/FontColorPaletteItem.js +32 -27
  90. package/lib/richtext/ItemsHtmlConverter.js +12 -3
  91. package/lib/richtext/RichTextComponent.d.ts +26 -52
  92. package/lib/richtext/RichTextComponent.js +166 -128
  93. package/lib/valueFormatter.js +6 -1
  94. package/lib/wellknown.d.ts +5 -0
  95. package/lib/wellknown.js +288 -0
  96. package/lib/widgets/DropdownWidgetComponent.d.ts +8 -25
  97. package/lib/widgets/DropdownWidgetComponent.js +48 -25
  98. package/lib/widgets/IFrameWidgetComponent.d.ts +1 -2
  99. package/lib/widgets/ImageWidgetComponent.d.ts +2 -3
  100. package/lib/widgets/MapWidget.d.ts +2 -0
  101. package/lib/widgets/MapWidget.js +2 -1
  102. package/lib/widgets/TOCWidget.js +2 -1
  103. package/lib/widgets/Widget.d.ts +2 -0
  104. package/lib/widgets/WidgetDataSource.d.ts +3 -1
  105. package/lib/widgets/charts/Chart.d.ts +0 -1
  106. package/lib/widgets/charts/ChartViewComponent.d.ts +4 -0
  107. package/lib/widgets/charts/ChartViewComponent.js +11 -3
  108. package/lib/widgets/charts/ChartWidget.d.ts +1 -62
  109. package/lib/widgets/charts/ChartWidget.js +4 -183
  110. package/lib/widgets/charts/ChartWidgetComponent.d.ts +51 -0
  111. package/lib/widgets/charts/ChartWidgetComponent.js +167 -0
  112. package/lib/widgets/charts/calendar/CalendarChartViewComponent.d.ts +1 -4
  113. package/lib/widgets/charts/calendar/CalendarChartViewComponent.js +4 -4
  114. package/lib/widgets/charts/layered/LayeredChart.d.ts +5 -10
  115. package/lib/widgets/charts/layered/LayeredChart.js +6 -7
  116. package/lib/widgets/charts/layered/LayeredChartCompiler.d.ts +4 -2
  117. package/lib/widgets/charts/layered/LayeredChartCompiler.js +46 -32
  118. package/lib/widgets/charts/layered/LayeredChartDesign.d.ts +4 -0
  119. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.d.ts +3 -0
  120. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +21 -3
  121. package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.d.ts +1 -2
  122. package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.js +2 -1
  123. package/lib/widgets/charts/layered/LayeredChartViewComponent.d.ts +1 -4
  124. package/lib/widgets/charts/layered/LayeredChartViewComponent.js +89 -38
  125. package/lib/widgets/charts/pivot/IntersectionDesignerComponent.d.ts +5 -112
  126. package/lib/widgets/charts/pivot/IntersectionDesignerComponent.js +122 -166
  127. package/lib/widgets/charts/pivot/PivotChart.d.ts +6 -0
  128. package/lib/widgets/charts/pivot/PivotChart.js +47 -17
  129. package/lib/widgets/charts/pivot/PivotChartDesign.d.ts +11 -0
  130. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.d.ts +1 -1
  131. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.js +1 -1
  132. package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.d.ts +2 -2
  133. package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.js +20 -36
  134. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +0 -1
  135. package/lib/widgets/charts/pivot/PivotChartQueryBuilder.d.ts +23 -2
  136. package/lib/widgets/charts/pivot/PivotChartQueryBuilder.js +215 -181
  137. package/lib/widgets/charts/pivot/PivotChartUtils.d.ts +2 -2
  138. package/lib/widgets/charts/pivot/PivotChartViewComponent.d.ts +9 -28
  139. package/lib/widgets/charts/pivot/PivotChartViewComponent.js +20 -60
  140. package/lib/widgets/charts/table/TableChart.js +8 -4
  141. package/lib/widgets/charts/table/TableChartDesignerComponent.js +3 -3
  142. package/lib/widgets/charts/table/TableChartViewComponent.js +11 -11
  143. package/lib/widgets/text/TextComponent.d.ts +5 -12
  144. package/lib/widgets/text/TextComponent.js +19 -39
  145. package/lib/widgets/text/TextWidget.d.ts +2 -1
  146. package/lib/widgets/text/TextWidget.js +5 -1
  147. package/lib/widgets/text/TextWidgetComponent.d.ts +15 -3
  148. package/lib/widgets/text/TextWidgetComponent.js +76 -19
  149. package/lib/widgets/text/TextWidgetDesign.d.ts +13 -1
  150. package/lib/widgets/text/TextWidgetDesign.js +6 -0
  151. package/package.json +4 -4
  152. package/src/ColorComponent.tsx +177 -0
  153. package/src/ColorSchemeFactory.ts +12 -6
  154. package/src/CustomColorsContext.tsx +9 -0
  155. package/src/FiltersDesignerComponent.ts +3 -4
  156. package/src/LocaleContextInjector.tsx +14 -13
  157. package/src/MWaterAddRelatedFormComponent.ts +3 -3
  158. package/src/MWaterAddRelatedIndicatorComponent.ts +6 -6
  159. package/src/MWaterCompleteTableSelectComponent.tsx +36 -36
  160. package/src/MWaterContextComponent.tsx +8 -17
  161. package/src/MWaterLoaderComponent.ts +6 -3
  162. package/src/MWaterTableSelectComponent.tsx +11 -12
  163. package/src/{UIComponents.ts → UIComponents.tsx} +7 -15
  164. package/src/axes/AxisBuilder.ts +7 -5
  165. package/src/axes/AxisComponent.ts +3 -4
  166. package/src/axes/{ColorPaletteCollectionComponent.ts → ColorPaletteCollectionComponent.tsx} +87 -61
  167. package/src/dashboards/DashboardComponent.tsx +71 -107
  168. package/src/dashboards/DashboardDesign.ts +3 -3
  169. package/src/dashboards/DashboardUpgrader.ts +41 -1
  170. package/src/dashboards/DashboardViewComponent.tsx +313 -0
  171. package/src/dashboards/FontStyleEditor.tsx +166 -0
  172. package/src/dashboards/LayoutOptionsComponent.tsx +380 -75
  173. package/src/dashboards/ServerDashboardDataSource.ts +52 -33
  174. package/src/dashboards/WidgetComponent.tsx +6 -12
  175. package/src/dashboards/WidgetDataSourcePrioritizer.ts +82 -0
  176. package/src/dashboards/layoutOptions.tsx +581 -0
  177. package/src/datagrids/DatagridDesign.ts +8 -3
  178. package/src/datagrids/ServerDatagridDataSource.ts +106 -43
  179. package/src/demo.ts +3 -3
  180. package/src/index.css +5 -0
  181. package/src/index.ts +1 -1
  182. package/src/layouts/LayoutManager.ts +44 -42
  183. package/src/layouts/blocks/BlocksDisplayComponent.tsx +498 -0
  184. package/src/layouts/blocks/BlocksLayoutManager.ts +6 -15
  185. package/src/layouts/blocks/HorizontalBlockComponent.ts +9 -8
  186. package/src/mWaterLoader.ts +4 -1
  187. package/src/maps/AddLayerComponent.ts +9 -9
  188. package/src/maps/BingLayer.ts +16 -26
  189. package/src/maps/BufferLayer.ts +2 -1
  190. package/src/maps/ChoroplethLayer.ts +2 -1
  191. package/src/maps/DirectMapDataSource.ts +12 -3
  192. package/src/maps/EditPopupComponent.ts +2 -1
  193. package/src/maps/MapComponent.ts +3 -3
  194. package/src/maps/MarkersLayer.ts +38 -41
  195. package/src/maps/RasterMapViewComponent.ts +3 -3
  196. package/src/maps/ServerMapDataSource.ts +7 -7
  197. package/src/maps/VectorMapViewComponent.tsx +2 -1
  198. package/src/maps/mapSymbols.ts +2 -0
  199. package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
  200. package/src/maps/vectorMaps.tsx +79 -74
  201. package/src/quickfilter/QuickfiltersComponent.ts +3 -3
  202. package/src/richtext/DropdownPaletteItem.tsx +144 -0
  203. package/src/richtext/FontColorPaletteItem.tsx +160 -0
  204. package/src/richtext/ItemsHtmlConverter.ts +15 -5
  205. package/src/richtext/RichTextComponent.tsx +274 -232
  206. package/src/valueFormatter.ts +5 -1
  207. package/src/wellknown.ts +286 -0
  208. package/src/widgets/DropdownWidgetComponent.tsx +75 -0
  209. package/src/widgets/MapWidget.ts +5 -2
  210. package/src/widgets/TOCWidget.ts +2 -1
  211. package/src/widgets/Widget.ts +3 -0
  212. package/src/widgets/WidgetDataSource.ts +3 -1
  213. package/src/widgets/charts/Chart.ts +1 -1
  214. package/src/widgets/charts/ChartViewComponent.ts +16 -3
  215. package/src/widgets/charts/ChartWidget.ts +3 -275
  216. package/src/widgets/charts/ChartWidgetComponent.tsx +281 -0
  217. package/src/widgets/charts/calendar/CalendarChartViewComponent.tsx +4 -4
  218. package/src/widgets/charts/layered/LayeredChart.ts +4 -6
  219. package/src/widgets/charts/layered/LayeredChartCompiler.ts +80 -63
  220. package/src/widgets/charts/layered/LayeredChartDesign.ts +7 -1
  221. package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +43 -10
  222. package/src/widgets/charts/layered/LayeredChartLayerDesignerComponent.tsx +6 -6
  223. package/src/widgets/charts/layered/LayeredChartViewComponent.ts +140 -88
  224. package/src/widgets/charts/pivot/IntersectionDesignerComponent.tsx +305 -221
  225. package/src/widgets/charts/pivot/PivotChart.ts +56 -18
  226. package/src/widgets/charts/pivot/PivotChartDesign.ts +12 -0
  227. package/src/widgets/charts/pivot/PivotChartDesignerComponent.tsx +4 -3
  228. package/src/widgets/charts/pivot/PivotChartLayoutBuilder.ts +39 -76
  229. package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +0 -1
  230. package/src/widgets/charts/pivot/PivotChartQueryBuilder.ts +230 -189
  231. package/src/widgets/charts/pivot/PivotChartUtils.ts +4 -4
  232. package/src/widgets/charts/pivot/{PivotChartViewComponent.ts → PivotChartViewComponent.tsx} +86 -89
  233. package/src/widgets/charts/table/TableChart.ts +8 -4
  234. package/src/widgets/charts/table/TableChartDesignerComponent.ts +4 -4
  235. package/src/widgets/charts/table/TableChartViewComponent.ts +13 -14
  236. package/src/widgets/text/TextComponent.tsx +47 -49
  237. package/src/widgets/text/TextWidget.ts +8 -3
  238. package/src/widgets/text/TextWidgetComponent.tsx +249 -0
  239. package/src/widgets/text/TextWidgetDesign.ts +22 -1
  240. package/src/ColorComponent.ts +0 -117
  241. package/src/dashboards/DashboardViewComponent.ts +0 -303
  242. package/src/dashboards/layoutOptions.ts +0 -40
  243. package/src/layout-styles.css +0 -263
  244. package/src/layouts/blocks/BlocksDisplayComponent.ts +0 -461
  245. package/src/layouts/grid/GridLayoutComponent.ts +0 -67
  246. package/src/layouts/grid/GridLayoutManager.ts +0 -185
  247. package/src/layouts/grid/LegoLayoutEngine.ts +0 -142
  248. package/src/layouts/grid/PaletteItemComponent.ts +0 -28
  249. package/src/layouts/grid/README.md +0 -14
  250. package/src/layouts/grid/WidgetContainerComponent.ts +0 -420
  251. package/src/richtext/FontColorPaletteItem.ts +0 -172
  252. package/src/richtext/FontSizePaletteItem.ts +0 -110
  253. package/src/widgets/DropdownWidgetComponent.ts +0 -78
  254. package/src/widgets/text/TextWidgetComponent.ts +0 -120
@@ -26,10 +26,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const prop_types_1 = __importDefault(require("prop-types"));
30
29
  const lodash_1 = __importDefault(require("lodash"));
31
30
  const react_1 = __importDefault(require("react"));
32
- const R = react_1.default.createElement;
33
31
  const ActionCancelModalComponent_1 = __importDefault(require("@mwater/react-library/lib/ActionCancelModalComponent"));
34
32
  const TextComponent_1 = __importDefault(require("../../text/TextComponent"));
35
33
  const PivotChartUtils = __importStar(require("./PivotChartUtils"));
@@ -37,9 +35,10 @@ const PivotChartLayoutComponent_1 = __importDefault(require("./PivotChartLayoutC
37
35
  const PivotChartLayoutBuilder_1 = __importDefault(require("./PivotChartLayoutBuilder"));
38
36
  const SegmentDesignerComponent_1 = __importDefault(require("./SegmentDesignerComponent"));
39
37
  const IntersectionDesignerComponent_1 = __importDefault(require("./IntersectionDesignerComponent"));
38
+ const contexts_1 = require("@mwater/expressions-ui/lib/contexts");
40
39
  // Displays a pivot chart
41
40
  class PivotChartViewComponent extends react_1.default.Component {
42
- static contextTypes = { locale: prop_types_1.default.string };
41
+ static contextType = contexts_1.LocaleContext;
43
42
  constructor(props) {
44
43
  super(props);
45
44
  this.state = {
@@ -128,78 +127,39 @@ class PivotChartViewComponent extends react_1.default.Component {
128
127
  return this.props.onDesignChange(design);
129
128
  };
130
129
  renderHeader() {
131
- return R("div", { style: { paddingLeft: 10, paddingRight: 10 } }, R(TextComponent_1.default, {
132
- design: this.props.design.header,
133
- onDesignChange: this.props.onDesignChange ? this.handleHeaderChange : undefined,
134
- schema: this.props.schema,
135
- dataSource: this.props.dataSource,
136
- exprValues: this.props.data.header || {},
137
- width: this.props.width
138
- }));
130
+ return (react_1.default.createElement("div", { style: { paddingLeft: 10, paddingRight: 10 } },
131
+ react_1.default.createElement(TextComponent_1.default, { design: this.props.design.header, onDesignChange: this.props.onDesignChange ? this.handleHeaderChange : undefined, schema: this.props.schema, dataSource: this.props.dataSource, exprValues: this.props.data.header || {}, width: this.props.width })));
139
132
  }
140
133
  renderFooter() {
141
- return R("div", { style: { paddingLeft: 10, paddingRight: 10 } }, R(TextComponent_1.default, {
142
- design: this.props.design.footer,
143
- onDesignChange: this.props.onDesignChange ? this.handleFooterChange : undefined,
144
- schema: this.props.schema,
145
- dataSource: this.props.dataSource,
146
- exprValues: this.props.data.footer || {},
147
- width: this.props.width
148
- }));
134
+ return (react_1.default.createElement("div", { style: { paddingLeft: 10, paddingRight: 10 } },
135
+ react_1.default.createElement(TextComponent_1.default, { design: this.props.design.footer, onDesignChange: this.props.onDesignChange ? this.handleFooterChange : undefined, schema: this.props.schema, dataSource: this.props.dataSource, exprValues: this.props.data.footer || {}, width: this.props.width })));
149
136
  }
150
137
  renderEditSegmentModal() {
151
138
  if (!this.state.editSegment) {
152
- return;
139
+ return null;
153
140
  }
154
141
  const segmentType = PivotChartUtils.findSegment(this.props.design.rows, this.state.editSegment.id)
155
142
  ? "row"
156
143
  : "column";
157
- return R(ActionCancelModalComponent_1.default, {
158
- title: `Edit ${segmentType}`,
159
- onAction: this.handleSaveEditSegment,
160
- onCancel: this.handleCancelEditSegment,
161
- size: "large"
162
- }, R(SegmentDesignerComponent_1.default, {
163
- segment: this.state.editSegment,
164
- table: this.props.design.table,
165
- schema: this.props.schema,
166
- dataSource: this.props.dataSource,
167
- segmentType,
168
- onChange: (segment) => this.setState({ editSegment: segment }),
169
- filters: this.props.filters
170
- }));
144
+ return (react_1.default.createElement(ActionCancelModalComponent_1.default, { title: `Edit ${segmentType}`, onAction: this.handleSaveEditSegment, onCancel: this.handleCancelEditSegment, size: "large" },
145
+ react_1.default.createElement(SegmentDesignerComponent_1.default, { segment: this.state.editSegment, table: this.props.design.table, schema: this.props.schema, dataSource: this.props.dataSource, segmentType: segmentType, onChange: (segment) => this.setState({ editSegment: segment }), filters: this.props.filters })));
171
146
  }
172
147
  renderEditIntersectionModal() {
173
148
  if (!this.state.editIntersectionId) {
174
- return;
149
+ return null;
175
150
  }
176
- return R(ActionCancelModalComponent_1.default, {
177
- title: "Edit Value",
178
- onAction: this.handleSaveEditIntersection,
179
- onCancel: this.handleCancelEditIntersection,
180
- size: "large"
181
- }, R(IntersectionDesignerComponent_1.default, {
182
- intersection: this.state.editIntersection,
183
- table: this.props.design.table,
184
- schema: this.props.schema,
185
- dataSource: this.props.dataSource,
186
- onChange: (intersection) => this.setState({ editIntersection: intersection }),
187
- filters: this.props.filters
188
- }));
151
+ return (react_1.default.createElement(ActionCancelModalComponent_1.default, { title: "Edit Value", onAction: this.handleSaveEditIntersection, onCancel: this.handleCancelEditIntersection, size: "large" },
152
+ react_1.default.createElement(IntersectionDesignerComponent_1.default, { design: this.props.design, intersectionId: this.state.editIntersectionId, intersection: this.state.editIntersection, table: this.props.design.table, schema: this.props.schema, dataSource: this.props.dataSource, onChange: (intersection) => this.setState({ editIntersection: intersection }), filters: this.props.filters })));
189
153
  }
190
154
  render() {
191
- const layout = new PivotChartLayoutBuilder_1.default({ schema: this.props.schema }).buildLayout(this.props.design, this.props.data, this.context.locale);
192
- return R("div", { style: { width: this.props.width, height: this.props.height } }, this.renderHeader(), this.renderEditSegmentModal(), this.renderEditIntersectionModal(), R("div", { key: "layout", style: { margin: 5, marginTop: 12, overflowX: "auto", padding: 7 } }, // Allow table to scroll since tables have hard minimum widths, Leave room for gear menu
193
- R(PivotChartLayoutComponent_1.default, {
194
- layout,
195
- editable: this.props.onDesignChange != null,
196
- onEditSection: this.props.onDesignChange != null ? this.handleEditSection : undefined,
197
- onRemoveSegment: this.props.onDesignChange != null ? this.handleRemoveSegment : undefined,
198
- onInsertBeforeSegment: this.props.onDesignChange != null ? this.handleInsertBeforeSegment : undefined,
199
- onInsertAfterSegment: this.props.onDesignChange != null ? this.handleInsertAfterSegment : undefined,
200
- onAddChildSegment: this.props.onDesignChange != null ? this.handleAddChildSegment : undefined,
201
- onSummarizeSegment: this.props.onDesignChange != null ? this.handleSummarizeSegment : undefined
202
- })), this.renderFooter());
155
+ const layout = new PivotChartLayoutBuilder_1.default({ schema: this.props.schema }).buildLayout(this.props.design, this.props.data, this.context);
156
+ return (react_1.default.createElement("div", { style: { width: this.props.width, height: this.props.height } },
157
+ this.renderHeader(),
158
+ this.renderEditSegmentModal(),
159
+ this.renderEditIntersectionModal(),
160
+ react_1.default.createElement("div", { key: "layout", style: { margin: 5, marginTop: 12, overflowX: "auto", padding: 7 } },
161
+ react_1.default.createElement(PivotChartLayoutComponent_1.default, { layout: layout, editable: this.props.onDesignChange != null, onEditSection: this.props.onDesignChange != null ? this.handleEditSection : undefined, onRemoveSegment: this.props.onDesignChange != null ? this.handleRemoveSegment : undefined, onInsertBeforeSegment: this.props.onDesignChange != null ? this.handleInsertBeforeSegment : undefined, onInsertAfterSegment: this.props.onDesignChange != null ? this.handleInsertAfterSegment : undefined, onAddChildSegment: this.props.onDesignChange != null ? this.handleAddChildSegment : undefined, onSummarizeSegment: this.props.onDesignChange != null ? this.handleSummarizeSegment : undefined })),
162
+ this.renderFooter()));
203
163
  }
204
164
  }
205
165
  exports.default = PivotChartViewComponent;
@@ -149,10 +149,14 @@ class TableChart extends Chart_1.default {
149
149
  // Convert to 4326 (lat/long). Force ::geometry for null
150
150
  compiledExpr = {
151
151
  type: "op",
152
- op: "ST_AsGeoJSON",
153
- exprs: [
154
- { type: "op", op: "ST_Transform", exprs: [{ type: "op", op: "::geometry", exprs: [compiledExpr] }, 4326] }
155
- ]
152
+ op: "::jsonb",
153
+ exprs: [{
154
+ type: "op",
155
+ op: "ST_AsGeoJSON",
156
+ exprs: [
157
+ { type: "op", op: "ST_Transform", exprs: [{ type: "op", op: "::geometry", exprs: [compiledExpr] }, 4326] }
158
+ ]
159
+ }]
156
160
  };
157
161
  }
158
162
  query.selects.push({
@@ -26,7 +26,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const prop_types_1 = __importDefault(require("prop-types"));
30
29
  const lodash_1 = __importDefault(require("lodash"));
31
30
  const react_1 = __importDefault(require("react"));
32
31
  const R = react_1.default.createElement;
@@ -42,6 +41,7 @@ const ui = __importStar(require("@mwater/react-library/lib/bootstrap"));
42
41
  const valueFormatter_1 = require("../../../valueFormatter");
43
42
  const valueFormatter_2 = require("../../../valueFormatter");
44
43
  const AxisComponent_1 = __importDefault(require("../../../axes/AxisComponent"));
44
+ const contexts_1 = require("@mwater/expressions-ui/lib/contexts");
45
45
  class TableChartDesignerComponent extends react_1.default.Component {
46
46
  // Updates design with the specified changes
47
47
  updateDesign(changes) {
@@ -173,7 +173,7 @@ class TableChartDesignerComponent extends react_1.default.Component {
173
173
  }
174
174
  exports.default = TableChartDesignerComponent;
175
175
  class TableChartColumnDesignerComponent extends react_1.default.Component {
176
- static contextTypes = { locale: prop_types_1.default.string };
176
+ static contextType = contexts_1.LocaleContext;
177
177
  // Updates column with the specified changes
178
178
  updateColumn(changes) {
179
179
  const column = lodash_1.default.extend({}, this.props.design.columns[this.props.index], changes);
@@ -235,7 +235,7 @@ class TableChartColumnDesignerComponent extends react_1.default.Component {
235
235
  renderHeader() {
236
236
  const column = this.props.design.columns[this.props.index];
237
237
  const axisBuilder = new AxisBuilder_1.default({ schema: this.props.schema });
238
- const placeholder = column.textAxis ? axisBuilder.summarizeAxis(column.textAxis ?? null, this.context.locale) : "";
238
+ const placeholder = column.textAxis ? axisBuilder.summarizeAxis(column.textAxis ?? null, this.context) : "";
239
239
  return R("div", null, R("label", { className: "text-muted" }, "Header"), ": ", R("input", {
240
240
  type: "text",
241
241
  className: "form-control form-control-sm",
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const prop_types_1 = __importDefault(require("prop-types"));
7
6
  const lodash_1 = __importDefault(require("lodash"));
8
7
  const react_1 = __importDefault(require("react"));
9
8
  const R = react_1.default.createElement;
@@ -12,6 +11,7 @@ const AxisBuilder_1 = __importDefault(require("../../../axes/AxisBuilder"));
12
11
  const expressions_1 = require("@mwater/expressions");
13
12
  const valueFormatter_1 = require("../../../valueFormatter");
14
13
  const color_1 = __importDefault(require("color"));
14
+ const contexts_1 = require("@mwater/expressions-ui/lib/contexts");
15
15
  class TableChartViewComponent extends react_1.default.Component {
16
16
  shouldComponentUpdate(prevProps) {
17
17
  return !lodash_1.default.isEqual(prevProps, this.props);
@@ -33,7 +33,7 @@ class TableChartViewComponent extends react_1.default.Component {
33
33
  }
34
34
  exports.default = TableChartViewComponent;
35
35
  class TableContentsComponent extends react_1.default.Component {
36
- static contextTypes = { locale: prop_types_1.default.string };
36
+ static contextType = contexts_1.LocaleContext;
37
37
  constructor(props) {
38
38
  super(props);
39
39
  this.state = {
@@ -89,7 +89,7 @@ class TableContentsComponent extends react_1.default.Component {
89
89
  const axisBuilder = new AxisBuilder_1.default({ schema: this.props.schema });
90
90
  const column = this.props.columns[index];
91
91
  //(this.state.sort?.direction === 'asc' ? "":"")
92
- const text = column.headerText ?? (column.textAxis ? axisBuilder.summarizeAxis(column.textAxis, this.context.locale) : "");
92
+ const text = column.headerText ?? (column.textAxis ? axisBuilder.summarizeAxis(column.textAxis, this.context) : "");
93
93
  return R("th", {
94
94
  key: index,
95
95
  style: { cursor: "pointer" },
@@ -133,7 +133,7 @@ class TableContentsComponent extends react_1.default.Component {
133
133
  const column = this.props.columns[columnIndex];
134
134
  // Set background color
135
135
  let backgroundColor = "transparent";
136
- let textColor = "#212529";
136
+ let textColor = "inherit";
137
137
  const exprUtils = new expressions_1.ExprUtils(this.props.schema);
138
138
  if (!column.textAxis) {
139
139
  node = null;
@@ -142,6 +142,9 @@ class TableContentsComponent extends react_1.default.Component {
142
142
  const exprType = exprUtils.getExprType(column.textAxis.expr);
143
143
  // Get value
144
144
  let value = row[`c${columnIndex}`];
145
+ if (column.backgroundColorAxis) {
146
+ backgroundColor = axisBuilder.getValueColor(column.backgroundColorAxis, row[`bc${columnIndex}`]) ?? "#fff";
147
+ }
145
148
  if (value == null) {
146
149
  node = null;
147
150
  }
@@ -156,9 +159,6 @@ class TableContentsComponent extends react_1.default.Component {
156
159
  value = null;
157
160
  }
158
161
  }
159
- if (column.backgroundColorAxis && row[`bc${columnIndex}`] != null) {
160
- backgroundColor = axisBuilder.getValueColor(column.backgroundColorAxis, row[`bc${columnIndex}`]) ?? "#fff";
161
- }
162
162
  // Convert to node based on type
163
163
  switch (exprType) {
164
164
  case "text":
@@ -172,12 +172,12 @@ class TableContentsComponent extends react_1.default.Component {
172
172
  break;
173
173
  case "boolean":
174
174
  case "enum":
175
- node = exprUtils.stringifyExprLiteral(column.textAxis?.expr, value, this.context.locale);
175
+ node = exprUtils.stringifyExprLiteral(column.textAxis?.expr, value, this.context);
176
176
  break;
177
177
  case "enumset":
178
178
  case "text[]":
179
179
  if (lodash_1.default.isArray(value)) {
180
- node = exprUtils.stringifyExprLiteral(column.textAxis?.expr, value, this.context.locale);
180
+ node = exprUtils.stringifyExprLiteral(column.textAxis?.expr, value, this.context);
181
181
  }
182
182
  break;
183
183
  case "date":
@@ -209,7 +209,7 @@ class TableContentsComponent extends react_1.default.Component {
209
209
  const c = (0, color_1.default)(backgroundColor);
210
210
  // Get lightness (taking into account alpha)
211
211
  const lightness = 1 - (1 - c.luminosity()) * c.alpha();
212
- textColor = lightness < 0.3 ? "rgb(204,204,204)" : "#212529";
212
+ textColor = lightness < 0.3 ? "rgb(204,204,204)" : "inherit";
213
213
  }
214
214
  return R("td", { key: columnIndex, style: { backgroundColor, color: textColor } }, node);
215
215
  }
@@ -220,6 +220,6 @@ class TableContentsComponent extends react_1.default.Component {
220
220
  return R("tbody", { key: "body" }, lodash_1.default.map(this.state.data, (row, i) => this.renderRow(i)));
221
221
  }
222
222
  render() {
223
- return R("table", { className: "mwater-visualization-table", style: { fontSize: "10pt", marginBottom: 0 } }, this.renderHeader(), this.renderBody(), this.renderFooter());
223
+ return R("table", { className: "mwater-visualization-table", style: { marginBottom: 0 } }, this.renderHeader(), this.renderBody(), this.renderFooter());
224
224
  }
225
225
  }
@@ -1,4 +1,3 @@
1
- import PropTypes from "prop-types";
2
1
  import React from "react";
3
2
  import RichTextComponent from "../../richtext/RichTextComponent";
4
3
  import ExprInsertModalComponent from "./ExprInsertModalComponent";
@@ -25,9 +24,7 @@ export interface TextComponentProps {
25
24
  };
26
25
  }
27
26
  export default class TextComponent extends React.Component<TextComponentProps> {
28
- static contextTypes: {
29
- locale: PropTypes.Requireable<string>;
30
- };
27
+ static contextType: React.Context<string>;
31
28
  exprInsertModal: ExprInsertModalComponent | null;
32
29
  exprUpdateModal: ExprUpdateModalComponent | null;
33
30
  editor: RichTextComponent | null;
@@ -36,13 +33,9 @@ export default class TextComponent extends React.Component<TextComponentProps> {
36
33
  handleInsertExpr: (item: any) => void;
37
34
  replaceItem(item: any): void;
38
35
  handleItemClick: (item: any) => void;
39
- handleAddExpr: (ev: any) => void;
40
- renderExtraPaletteButtons(): React.DetailedReactHTMLElement<{
41
- key: string;
42
- className: string;
43
- onMouseDown: (ev: any) => void;
44
- }, HTMLElement>;
45
- renderModals(): (React.CElement<import("./ExprInsertModalComponent").ExprInsertModalComponentProps, ExprInsertModalComponent> | React.CElement<any, ExprUpdateModalComponent>)[];
36
+ handleAddExpr: (ev: React.MouseEvent<HTMLDivElement>) => void;
37
+ renderExtraPaletteButtons(): React.JSX.Element;
38
+ renderModals(): React.JSX.Element[];
46
39
  refRichTextComponent: (c: RichTextComponent | null) => void;
47
- render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
40
+ render(): React.JSX.Element;
48
41
  }
@@ -3,27 +3,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const prop_types_1 = __importDefault(require("prop-types"));
7
6
  const react_1 = __importDefault(require("react"));
8
- const R = react_1.default.createElement;
9
7
  const lodash_1 = __importDefault(require("lodash"));
10
8
  const RichTextComponent_1 = __importDefault(require("../../richtext/RichTextComponent"));
11
9
  const ExprInsertModalComponent_1 = __importDefault(require("./ExprInsertModalComponent"));
12
10
  const ExprUpdateModalComponent_1 = __importDefault(require("./ExprUpdateModalComponent"));
13
11
  const ExprItemsHtmlConverter_1 = __importDefault(require("../../richtext/ExprItemsHtmlConverter"));
12
+ const contexts_1 = require("@mwater/expressions-ui/lib/contexts");
14
13
  // Text component which is provided with the data it needs, rather than loading it.
15
14
  // Used by TextWidgetComponent and also by other components that embed text fields
16
15
  class TextComponent extends react_1.default.Component {
17
- static contextTypes = { locale: prop_types_1.default.string };
18
- exprInsertModal;
19
- exprUpdateModal;
20
- editor;
16
+ static contextType = contexts_1.LocaleContext;
17
+ exprInsertModal = null;
18
+ exprUpdateModal = null;
19
+ editor = null;
21
20
  createItemsHtmlConverter() {
22
21
  return new ExprItemsHtmlConverter_1.default(this.props.schema, this.props.onDesignChange != null, this.props.exprValues,
23
22
  // Display summaries if in design more and singleRowTable is set
24
23
  this.props.onDesignChange != null && this.props.singleRowTable != null,
25
24
  // Only replace named strings if not editing
26
- this.props.onDesignChange == null ? this.props.namedStrings : undefined, this.context.locale);
25
+ this.props.onDesignChange == null ? this.props.namedStrings : undefined, this.context);
27
26
  }
28
27
  handleItemsChange = (items) => {
29
28
  const design = { ...this.props.design, items };
@@ -59,29 +58,18 @@ class TextComponent extends react_1.default.Component {
59
58
  return this.exprInsertModal.open();
60
59
  };
61
60
  renderExtraPaletteButtons() {
62
- return R("div", { key: "expr", className: "mwater-visualization-text-palette-item", onMouseDown: this.handleAddExpr }, R("i", { className: "fa fa-plus" }), " Field");
61
+ return (react_1.default.createElement("div", { key: "expr", className: "mwater-visualization-text-palette-item", onMouseDown: this.handleAddExpr },
62
+ react_1.default.createElement("i", { className: "fa fa-plus" }),
63
+ " Expression"));
63
64
  }
64
65
  renderModals() {
65
66
  return [
66
- R(ExprInsertModalComponent_1.default, {
67
- key: "exprInsertModal",
68
- ref: (c) => {
67
+ react_1.default.createElement(ExprInsertModalComponent_1.default, { key: "exprInsertModal", ref: (c) => {
69
68
  this.exprInsertModal = c;
70
- },
71
- schema: this.props.schema,
72
- dataSource: this.props.dataSource,
73
- onInsert: this.handleInsertExpr,
74
- singleRowTable: this.props.singleRowTable
75
- }),
76
- R(ExprUpdateModalComponent_1.default, {
77
- key: "exprUpdateModal",
78
- ref: (c) => {
69
+ }, schema: this.props.schema, dataSource: this.props.dataSource, onInsert: this.handleInsertExpr, singleRowTable: this.props.singleRowTable }),
70
+ react_1.default.createElement(ExprUpdateModalComponent_1.default, { key: "exprUpdateModal", ref: (c) => {
79
71
  this.exprUpdateModal = c;
80
- },
81
- schema: this.props.schema,
82
- dataSource: this.props.dataSource,
83
- singleRowTable: this.props.singleRowTable
84
- })
72
+ }, schema: this.props.schema, dataSource: this.props.dataSource, singleRowTable: this.props.singleRowTable })
85
73
  ];
86
74
  }
87
75
  refRichTextComponent = (c) => {
@@ -89,21 +77,13 @@ class TextComponent extends react_1.default.Component {
89
77
  };
90
78
  render() {
91
79
  const style = {
92
- position: "relative"
80
+ position: "relative",
81
+ width: this.props.width,
82
+ height: this.props.height
93
83
  };
94
- style.width = this.props.width;
95
- style.height = this.props.height;
96
- return R("div", null, this.renderModals(), R(RichTextComponent_1.default, {
97
- ref: this.refRichTextComponent,
98
- className: `mwater-visualization-text-widget-style-${this.props.design.style || "default"}`,
99
- style,
100
- items: this.props.design.items,
101
- onItemsChange: this.props.onDesignChange ? this.handleItemsChange : undefined,
102
- onItemClick: this.handleItemClick,
103
- itemsHtmlConverter: this.createItemsHtmlConverter(),
104
- includeHeadings: this.props.design.style === "default" || !this.props.design.style,
105
- extraPaletteButtons: this.renderExtraPaletteButtons()
106
- }));
84
+ return (react_1.default.createElement("div", null,
85
+ this.renderModals(),
86
+ react_1.default.createElement(RichTextComponent_1.default, { ref: this.refRichTextComponent, className: `mwater-visualization-text-widget-style-${this.props.design.style || "default"}`, style: style, items: this.props.design.items, onItemsChange: this.props.onDesignChange ? this.handleItemsChange : undefined, onItemClick: this.handleItemClick, itemsHtmlConverter: this.createItemsHtmlConverter(), includeHeadings: this.props.design.style === "default" || !this.props.design.style, extraPaletteButtons: this.renderExtraPaletteButtons() })));
107
87
  }
108
88
  }
109
89
  exports.default = TextComponent;
@@ -20,10 +20,11 @@ export default class TextWidget extends Widget {
20
20
  [key: string]: string;
21
21
  } | undefined;
22
22
  ref: ((widget: any) => void) | undefined;
23
+ refreshKey: any;
23
24
  }, any>;
24
25
  getData(design: any, schema: Schema, dataSource: DataSource, filters: JsonQLFilter[], callback: any): void;
25
26
  isAutoHeight(): boolean;
26
27
  getExprItems(items: HtmlItem[]): HtmlItemExpr[];
27
- getFilterableTables(design: TextWidgetDesign, schema: Schema): string[];
28
+ getFilterableTables(design: TextWidgetDesign | undefined, schema: Schema): string[];
28
29
  getTOCEntries(design: any, namedStrings: any): any;
29
30
  }
@@ -41,7 +41,8 @@ class TextWidget extends Widget_1.default {
41
41
  height: options.height,
42
42
  singleRowTable: options.singleRowTable,
43
43
  namedStrings: options.namedStrings,
44
- ref: options.widgetRef
44
+ ref: options.widgetRef,
45
+ refreshKey: options.refreshKey
45
46
  });
46
47
  }
47
48
  // Get the data that the widget needs. This will be called on the server, typically.
@@ -189,6 +190,9 @@ class TextWidget extends Widget_1.default {
189
190
  }
190
191
  // Get a list of table ids that can be filtered on
191
192
  getFilterableTables(design, schema) {
193
+ if (!design) {
194
+ return [];
195
+ }
192
196
  const exprItems = this.getExprItems(design.items);
193
197
  let filterableTables = lodash_1.default.map(exprItems, (exprItem) => exprItem.expr?.table);
194
198
  filterableTables = lodash_1.default.uniq(lodash_1.default.compact(filterableTables));
@@ -17,17 +17,29 @@ export interface TextWidgetComponentProps {
17
17
  /** Table that is filtered to have one row */
18
18
  singleRowTable?: string;
19
19
  namedStrings?: any;
20
+ /** A key that changes when the widget should be refreshed */
21
+ refreshKey?: any;
20
22
  }
21
23
  export default class TextWidgetComponent extends AsyncLoadComponent<TextWidgetComponentProps, {
22
24
  loading: boolean;
23
25
  exprValues: any;
24
26
  error: any;
25
27
  cacheExpiry: any;
28
+ editModalOpen: boolean;
26
29
  }> {
27
30
  divComp: HTMLElement | null;
28
- constructor(props: any);
31
+ constructor(props: TextWidgetComponentProps);
29
32
  isLoadNeeded(newProps: any, oldProps: any): boolean;
30
- load(props: any, prevProps: any, callback: any): void;
33
+ load(props: TextWidgetComponentProps, prevProps: TextWidgetComponentProps, callback: any): void;
31
34
  scrollToTOCEntry(entryId: any): void;
32
- render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
35
+ handleEditClick: () => void;
36
+ handleEditModalClose: () => void;
37
+ handleBackgroundColorChange: (color: string | null) => void;
38
+ handleSpacingChange: (spacing: number | null) => void;
39
+ handleBorderColorChange: (color: string | null) => void;
40
+ handleBorderThicknessChange: (thickness: number | null) => void;
41
+ handleBorderRadiusChange: (radius: number | null) => void;
42
+ renderEditModal(): React.JSX.Element | null;
43
+ renderTextComponent(): React.JSX.Element;
44
+ render(): React.JSX.Element;
33
45
  }
@@ -4,11 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
- const R = react_1.default.createElement;
8
7
  const lodash_1 = __importDefault(require("lodash"));
9
8
  const TextComponent_1 = __importDefault(require("./TextComponent"));
10
9
  const TextWidget_1 = __importDefault(require("./TextWidget"));
11
10
  const AsyncLoadComponent_1 = __importDefault(require("@mwater/react-library/lib/AsyncLoadComponent"));
11
+ const DropdownWidgetComponent_1 = __importDefault(require("../DropdownWidgetComponent"));
12
+ const ActionCancelModalComponent_1 = __importDefault(require("@mwater/react-library/lib/ActionCancelModalComponent"));
13
+ const bootstrap_1 = require("@mwater/react-library/lib/bootstrap");
14
+ const ColorComponent_1 = __importDefault(require("../../ColorComponent"));
15
+ const bootstrap_2 = require("@mwater/react-library/lib/bootstrap");
12
16
  // Widget which displays styled text with embedded expressions
13
17
  class TextWidgetComponent extends AsyncLoadComponent_1.default {
14
18
  divComp;
@@ -19,7 +23,8 @@ class TextWidgetComponent extends AsyncLoadComponent_1.default {
19
23
  // Map of expression id to expression value
20
24
  exprValues: {},
21
25
  error: null,
22
- cacheExpiry: props.dataSource.getCacheExpiry() // Save cache expiry to see if changes
26
+ cacheExpiry: props.dataSource.getCacheExpiry(),
27
+ editModalOpen: false
23
28
  };
24
29
  }
25
30
  // Override to determine if a load is needed. Not called on mounting
@@ -42,7 +47,8 @@ class TextWidgetComponent extends AsyncLoadComponent_1.default {
42
47
  // Reload if filters or expressions have changed or cache expiry
43
48
  return (!lodash_1.default.isEqual(newProps.filters, oldProps.filters) ||
44
49
  !lodash_1.default.isEqual(getExprItems(newProps.design.items), getExprItems(oldProps.design.items)) ||
45
- newProps.dataSource.getCacheExpiry() !== this.state.cacheExpiry);
50
+ newProps.dataSource.getCacheExpiry() !== this.state.cacheExpiry ||
51
+ newProps.refreshKey !== oldProps.refreshKey);
46
52
  }
47
53
  // Call callback with state changes
48
54
  load(props, prevProps, callback) {
@@ -65,24 +71,75 @@ class TextWidgetComponent extends AsyncLoadComponent_1.default {
65
71
  return entry.scrollIntoView(true);
66
72
  }
67
73
  }
68
- render() {
74
+ handleEditClick = () => {
75
+ this.setState({ editModalOpen: true });
76
+ };
77
+ handleEditModalClose = () => {
78
+ this.setState({ editModalOpen: false });
79
+ };
80
+ handleBackgroundColorChange = (color) => {
81
+ const newDesign = { ...this.props.design, backgroundColor: color };
82
+ this.props.onDesignChange(newDesign);
83
+ };
84
+ handleSpacingChange = (spacing) => {
85
+ const newDesign = { ...this.props.design, padding: spacing ?? undefined };
86
+ this.props.onDesignChange(newDesign);
87
+ };
88
+ handleBorderColorChange = (color) => {
89
+ const newDesign = { ...this.props.design, borderColor: color };
90
+ this.props.onDesignChange(newDesign);
91
+ };
92
+ handleBorderThicknessChange = (thickness) => {
93
+ const newDesign = { ...this.props.design, borderThickness: thickness };
94
+ this.props.onDesignChange(newDesign);
95
+ };
96
+ handleBorderRadiusChange = (radius) => {
97
+ const newDesign = { ...this.props.design, borderRadius: radius };
98
+ this.props.onDesignChange(newDesign);
99
+ };
100
+ renderEditModal() {
101
+ if (!this.state.editModalOpen) {
102
+ return null;
103
+ }
104
+ const spacingOptions = [0, 5, 10, 15, 20, 25, 30, 35, 40].map(value => ({ value, label: `${value}px` }));
105
+ const borderThicknessOptions = [0, 1, 2, 3, 4, 5].map(value => ({ value, label: value === 0 ? "None" : `${value}px` }));
106
+ return (react_1.default.createElement(ActionCancelModalComponent_1.default, { title: "Edit Text Widget", onCancel: this.handleEditModalClose, onAction: this.handleEditModalClose },
107
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Background Color" },
108
+ react_1.default.createElement(ColorComponent_1.default, { color: this.props.design.backgroundColor || null, onChange: this.handleBackgroundColorChange }),
109
+ react_1.default.createElement("div", { className: "text-muted" }, "Choose a background color for the text widget")),
110
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Padding" },
111
+ react_1.default.createElement(bootstrap_2.Select, { value: this.props.design.padding ?? 0, onChange: this.handleSpacingChange, options: spacingOptions }),
112
+ react_1.default.createElement("div", { className: "text-muted" }, "Choose extra padding for the text widget")),
113
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Border Thickness", help: "Choose the border thickness for the text widget" },
114
+ react_1.default.createElement(bootstrap_2.Select, { value: this.props.design.borderThickness ?? 0, onChange: this.handleBorderThicknessChange, options: borderThicknessOptions })),
115
+ this.props.design.borderThickness &&
116
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Border Color", help: "Choose the border color for the text widget" },
117
+ react_1.default.createElement(ColorComponent_1.default, { color: this.props.design.borderColor || null, onChange: this.handleBorderColorChange })),
118
+ this.props.design.borderThickness &&
119
+ react_1.default.createElement(bootstrap_1.FormGroup, { label: "Border Radius", help: "Choose the border radius for the text widget" },
120
+ react_1.default.createElement(bootstrap_2.Select, { value: this.props.design.borderRadius ?? 0, onChange: this.handleBorderRadiusChange, options: spacingOptions }))));
121
+ }
122
+ renderTextComponent() {
69
123
  // If loading, don't display old values
70
124
  const exprValues = !this.state.loading ? this.state.exprValues : {};
71
- return R("div", {
72
- ref: (c) => {
73
- this.divComp = c;
74
- }
75
- }, R(TextComponent_1.default, {
76
- design: this.props.design,
77
- onDesignChange: this.props.onDesignChange,
78
- schema: this.props.schema,
79
- dataSource: this.props.dataSource,
80
- exprValues,
81
- width: this.props.width,
82
- height: this.props.height,
83
- singleRowTable: this.props.singleRowTable,
84
- namedStrings: this.props.namedStrings
85
- }));
125
+ const padding = this.props.design.padding ?? 0;
126
+ return (react_1.default.createElement(TextComponent_1.default, { design: this.props.design, 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 }));
127
+ }
128
+ render() {
129
+ const borderStyle = this.props.design.borderThickness && this.props.design.borderColor
130
+ ? `${this.props.design.borderThickness}px solid ${this.props.design.borderColor}`
131
+ : undefined;
132
+ return (react_1.default.createElement("div", { style: {
133
+ backgroundColor: this.props.design.backgroundColor ?? undefined,
134
+ padding: this.props.design.padding != null ? `${this.props.design.padding}px` : undefined,
135
+ border: borderStyle,
136
+ borderRadius: this.props.design.borderRadius != null ? `${this.props.design.borderRadius}px` : undefined
137
+ }, ref: comp => this.divComp = comp },
138
+ this.props.onDesignChange ? (react_1.default.createElement(DropdownWidgetComponent_1.default, { dropdownItems: [{
139
+ label: "Edit",
140
+ onClick: this.handleEditClick
141
+ }] }, this.renderTextComponent())) : (this.renderTextComponent()),
142
+ this.renderEditModal()));
86
143
  }
87
144
  }
88
145
  exports.default = TextWidgetComponent;
@@ -4,5 +4,17 @@ export interface TextWidgetDesign {
4
4
  /** Text widget stores its content as array of items. See ItemsHtmlConverter TODO */
5
5
  items: (HtmlItem | HtmlItemExpr)[];
6
6
  /** "title" for title block. default is "default" */
7
- style?: "title" | "default";
7
+ style?: "title" | "default" | "header" | "footer";
8
+ /** Background color of the text widget (optional) */
9
+ backgroundColor?: string | null;
10
+ /** Extra padding for the text widget */
11
+ padding?: number;
12
+ /** Border color of the text widget (optional) */
13
+ borderColor?: string | null;
14
+ /** Border thickness of the text widget (optional) */
15
+ borderThickness?: number | null;
16
+ /** Border radius of the text widget (optional) */
17
+ borderRadius?: number | null;
8
18
  }
19
+ /** Returns true if the text widget design is empty. */
20
+ export declare function isEmptyTextWidgetDesign(design: TextWidgetDesign | undefined): boolean;
@@ -1,2 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isEmptyTextWidgetDesign = void 0;
4
+ /** Returns true if the text widget design is empty. */
5
+ function isEmptyTextWidgetDesign(design) {
6
+ return design == null || design.items.length === 0;
7
+ }
8
+ exports.isEmptyTextWidgetDesign = isEmptyTextWidgetDesign;