@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
@@ -1,22 +1,24 @@
1
- import PropTypes from "prop-types"
2
1
  import _ from "lodash"
3
2
  import React from "react"
4
- const R = React.createElement
5
-
6
3
  import * as ui from "@mwater/react-library/lib/bootstrap"
7
4
  import update from "@mwater/react-library/lib/update"
8
5
  import { default as Rcslider } from "rc-slider"
9
6
  import AxisComponent from "../../../axes/AxisComponent"
10
7
  import ColorComponent from "../../../ColorComponent"
11
- import { FilterExprComponent } from "@mwater/expressions-ui"
8
+ import { FilterExprComponent, TableSelectComponent } from "@mwater/expressions-ui"
12
9
  import { ExprComponent } from "@mwater/expressions-ui"
13
10
  import { DataSource, Expr, Schema } from "@mwater/expressions"
14
- import { PivotChartIntersection } from "./PivotChartDesign"
11
+ import { PivotChartDesign, PivotChartIntersection, PivotChartSegment } from "./PivotChartDesign"
15
12
  import { JsonQLFilter } from "../../../JsonQLFilter"
16
13
  import { ListEditorComponent } from "@mwater/react-library/lib/ListEditorComponent"
14
+ import { getAllSegments } from "./PivotChartUtils"
15
+ import AxisBuilder from "../../../axes/AxisBuilder"
16
+ import produce from "immer"
17
17
 
18
18
  export interface IntersectionDesignerComponentProps {
19
+ design: PivotChartDesign
19
20
  intersection: PivotChartIntersection
21
+ intersectionId: string
20
22
  table: string
21
23
  schema: Schema
22
24
  dataSource: DataSource
@@ -25,211 +27,289 @@ export interface IntersectionDesignerComponentProps {
25
27
  }
26
28
 
27
29
  // Design an intersection of a pivot table
28
- export default class IntersectionDesignerComponent extends React.Component<IntersectionDesignerComponentProps> {
29
- constructor(props: IntersectionDesignerComponentProps) {
30
- super(props)
31
-
32
- this.update = this.update.bind(this)
33
- }
30
+ export default function IntersectionDesignerComponent(props: IntersectionDesignerComponentProps) {
31
+ // Determine table to use (use overrideTable if set, otherwise use table from props)
32
+ const table = props.intersection.tableOverride || props.table
34
33
 
35
- // Updates intersection with the specified changes
36
- update(...args: any[]) {
37
- return update(this.props.intersection, this.props.onChange, arguments)
34
+ const handleBackgroundColorAxisChange = (backgroundColorAxis: any) => {
35
+ const opacity = props.intersection.backgroundColorOpacity || 1
36
+ props.onChange({ ...props.intersection, backgroundColorAxis, backgroundColorOpacity: opacity })
38
37
  }
39
38
 
40
- handleBackgroundColorAxisChange = (backgroundColorAxis: any) => {
41
- const opacity = this.props.intersection.backgroundColorOpacity || 1
42
- return this.update({ backgroundColorAxis, backgroundColorOpacity: opacity })
39
+ const handleBackgroundColorChange = (backgroundColor: any) => {
40
+ const opacity = props.intersection.backgroundColorOpacity || 1
41
+ props.onChange({ ...props.intersection, backgroundColor, backgroundColorOpacity: opacity })
43
42
  }
44
43
 
45
- handleBackgroundColorChange = (backgroundColor: any) => {
46
- const opacity = this.props.intersection.backgroundColorOpacity || 1
47
- return this.update({ backgroundColor, backgroundColorOpacity: opacity })
44
+ const handleBackgroundColorConditionsChange = (backgroundColorConditions: any) => {
45
+ const opacity = props.intersection.backgroundColorOpacity || 1
46
+ props.onChange({ ...props.intersection, backgroundColorConditions, backgroundColorOpacity: opacity })
48
47
  }
49
48
 
50
- handleBackgroundColorConditionsChange = (backgroundColorConditions: any) => {
51
- const opacity = this.props.intersection.backgroundColorOpacity || 1
52
- return this.update({ backgroundColorConditions, backgroundColorOpacity: opacity })
49
+ const handleBackgroundColorOpacityChange = (newValue: any) => {
50
+ props.onChange({ ...props.intersection, backgroundColorOpacity: newValue / 100 })
53
51
  }
54
52
 
55
- handleBackgroundColorOpacityChange = (newValue: any) => {
56
- return this.update({ backgroundColorOpacity: newValue / 100 })
53
+ const handleFilterChange = (filter: any) => {
54
+ props.onChange({ ...props.intersection, filter })
57
55
  }
58
56
 
59
- handleFilterChange = (filter: any) => {
60
- return this.update({ filter })
57
+ const handleTableOverrideChange = (tableOverride: string) => {
58
+ props.onChange({ ...props.intersection, tableOverride })
61
59
  }
62
60
 
63
- renderValueAxis() {
64
- return R(
65
- ui.FormGroup,
66
- {
67
- labelMuted: true,
68
- label: "Calculation",
69
- help: "This is the calculated value that is displayed. Leave as blank to make an empty section"
70
- },
71
- R(AxisComponent, {
72
- schema: this.props.schema,
73
- dataSource: this.props.dataSource,
74
- table: this.props.table,
75
- types: ["enum", "text", "boolean", "date", "number"],
76
- aggrNeed: "required",
77
- value: this.props.intersection.valueAxis,
78
- onChange: this.update("valueAxis"),
79
- showFormat: true,
80
- filters: this.props.filters
81
- })
61
+ const renderValueAxis = () => {
62
+ return (
63
+ <ui.FormGroup
64
+ labelMuted={true}
65
+ label="Calculation"
66
+ help="This is the calculated value that is displayed. Leave as blank to make an empty section"
67
+ >
68
+ <AxisComponent
69
+ schema={props.schema}
70
+ dataSource={props.dataSource}
71
+ table={table}
72
+ types={["enum", "text", "boolean", "date", "number"]}
73
+ aggrNeed="required"
74
+ value={props.intersection.valueAxis}
75
+ onChange={valueAxis => props.onChange({ ...props.intersection, valueAxis })}
76
+ showFormat={true}
77
+ filters={props.filters}
78
+ />
79
+ </ui.FormGroup>
82
80
  )
83
81
  }
84
82
 
85
- renderNullValue() {
86
- if (this.props.intersection.valueAxis) {
87
- return R(
88
- ui.FormGroup,
89
- {
90
- labelMuted: true,
91
- label: "Show Empty Cells as"
92
- },
93
- R(ui.TextInput, {
94
- value: this.props.intersection.valueAxis.nullLabel ?? null,
95
- emptyNull: true,
96
- onChange: this.update("valueAxis.nullLabel"),
97
- placeholder: "Blank"
98
- })
83
+ const renderNullValue = () => {
84
+ if (props.intersection.valueAxis) {
85
+ return (
86
+ <ui.FormGroup
87
+ labelMuted={true}
88
+ label="Show Empty Cells as"
89
+ >
90
+ <ui.TextInput
91
+ value={props.intersection.valueAxis.nullLabel ?? null}
92
+ emptyNull={true}
93
+ onChange={nullLabel => props.onChange({ ...props.intersection, valueAxis: { ...props.intersection.valueAxis!, nullLabel: nullLabel ?? undefined } })}
94
+ placeholder="Blank"
95
+ />
96
+ </ui.FormGroup>
99
97
  )
100
98
  }
101
99
  return null
102
100
  }
103
101
 
104
- renderFilter() {
105
- return R(
106
- ui.FormGroup,
107
- {
108
- labelMuted: true,
109
- label: [R(ui.Icon, { id: "glyphicon-filter" }), " Filters"]
110
- },
111
- R(FilterExprComponent, {
112
- schema: this.props.schema,
113
- dataSource: this.props.dataSource,
114
- onChange: this.handleFilterChange,
115
- table: this.props.table,
116
- value: this.props.intersection.filter
117
- })
102
+ const renderFilter = () => {
103
+ return (
104
+ <ui.FormGroup
105
+ labelMuted={true}
106
+ label={<><ui.Icon id="glyphicon-filter" /> Filters</>}
107
+ >
108
+ <FilterExprComponent
109
+ schema={props.schema}
110
+ dataSource={props.dataSource}
111
+ onChange={handleFilterChange}
112
+ table={table}
113
+ value={props.intersection.filter}
114
+ />
115
+ </ui.FormGroup>
118
116
  )
119
117
  }
120
118
 
121
- renderStyling() {
122
- return R(
123
- ui.FormGroup,
124
- {
125
- labelMuted: true,
126
- key: "styling",
127
- label: "Styling"
128
- },
129
- R(
130
- ui.Checkbox,
131
- { key: "bold", inline: true, value: this.props.intersection.bold, onChange: this.update("bold") },
132
- "Bold"
133
- ),
134
- R(
135
- ui.Checkbox,
136
- { key: "italic", inline: true, value: this.props.intersection.italic, onChange: this.update("italic") },
137
- "Italic"
138
- )
119
+ const renderStyling = () => {
120
+ return (
121
+ <ui.FormGroup
122
+ labelMuted={true}
123
+ key="styling"
124
+ label="Styling"
125
+ >
126
+ <ui.Checkbox
127
+ key="bold"
128
+ inline={true}
129
+ value={props.intersection.bold}
130
+ onChange={bold => props.onChange({ ...props.intersection, bold })}
131
+ >
132
+ Bold
133
+ </ui.Checkbox>
134
+ <ui.Checkbox
135
+ key="italic"
136
+ inline={true}
137
+ value={props.intersection.italic}
138
+ onChange={italic => props.onChange({ ...props.intersection, italic })}
139
+ >
140
+ Italic
141
+ </ui.Checkbox>
142
+ </ui.FormGroup>
139
143
  )
140
144
  }
141
145
 
142
- renderBackgroundColorConditions() {
143
- return R(BackgroundColorConditionsComponent, {
144
- schema: this.props.schema,
145
- dataSource: this.props.dataSource,
146
- table: this.props.table,
147
- colorConditions: this.props.intersection.backgroundColorConditions,
148
- onChange: this.handleBackgroundColorConditionsChange
149
- })
146
+ const renderBackgroundColorConditions = () => {
147
+ return (
148
+ <BackgroundColorConditionsComponent
149
+ schema={props.schema}
150
+ dataSource={props.dataSource}
151
+ table={table}
152
+ colorConditions={props.intersection.backgroundColorConditions}
153
+ onChange={handleBackgroundColorConditionsChange}
154
+ />
155
+ )
150
156
  }
151
157
 
152
- renderBackgroundColorAxis() {
153
- return R(
154
- ui.FormGroup,
155
- {
156
- labelMuted: true,
157
- label: "Background Color From Values",
158
- help: "This is an optional background color to set on cells that is controlled by the data"
159
- },
160
- R(AxisComponent, {
161
- schema: this.props.schema,
162
- dataSource: this.props.dataSource,
163
- table: this.props.table,
164
- types: ["enum", "text", "boolean", "date"],
165
- aggrNeed: "required",
166
- value: this.props.intersection.backgroundColorAxis,
167
- onChange: this.handleBackgroundColorAxisChange,
168
- showColorMap: true,
169
- filters: this.props.filters
170
- })
158
+ const renderBackgroundColorAxis = () => {
159
+ return (
160
+ <ui.FormGroup
161
+ labelMuted={true}
162
+ label="Background Color From Values"
163
+ help="This is an optional background color to set on cells that is controlled by the data"
164
+ >
165
+ <AxisComponent
166
+ schema={props.schema}
167
+ dataSource={props.dataSource}
168
+ table={table}
169
+ types={["enum", "text", "boolean", "date"]}
170
+ aggrNeed="required"
171
+ value={props.intersection.backgroundColorAxis}
172
+ onChange={handleBackgroundColorAxisChange}
173
+ showColorMap={true}
174
+ filters={props.filters}
175
+ />
176
+ </ui.FormGroup>
171
177
  )
172
178
  }
173
179
 
174
- renderBackgroundColor() {
175
- if (this.props.intersection.backgroundColorAxis) {
180
+ const renderBackgroundColor = () => {
181
+ if (props.intersection.backgroundColorAxis) {
176
182
  return
177
183
  }
178
184
 
179
- return R(
180
- ui.FormGroup,
181
- {
182
- labelMuted: true,
183
- label: "Background Color",
184
- help: "This is an optional background color to set on all cells"
185
- },
186
- R(ColorComponent, {
187
- color: this.props.intersection.backgroundColor,
188
- onChange: this.handleBackgroundColorChange
189
- })
185
+ return (
186
+ <ui.FormGroup
187
+ labelMuted={true}
188
+ label="Background Color"
189
+ help="This is an optional background color to set on all cells"
190
+ >
191
+ <ColorComponent
192
+ color={props.intersection.backgroundColor}
193
+ onChange={handleBackgroundColorChange}
194
+ />
195
+ </ui.FormGroup>
190
196
  )
191
197
  }
192
198
 
193
- renderBackgroundColorOpacityControl() {
199
+ const renderBackgroundColorOpacityControl = () => {
194
200
  if (
195
- !this.props.intersection.backgroundColorAxis &&
196
- !this.props.intersection.backgroundColor &&
197
- !this.props.intersection.backgroundColorConditions?.[0]
201
+ !props.intersection.backgroundColorAxis &&
202
+ !props.intersection.backgroundColor &&
203
+ !props.intersection.backgroundColorConditions?.[0]
198
204
  ) {
199
205
  return
200
206
  }
201
207
 
202
- return R(
203
- ui.FormGroup,
204
- {
205
- labelMuted: true,
206
- label: `Background Opacity: ${Math.round((this.props.intersection.backgroundColorOpacity ?? 1) * 100)}%`
207
- },
208
- R(Rcslider, {
209
- min: 0,
210
- max: 100,
211
- step: 1,
212
- tipTransitionName: "rc-slider-tooltip-zoom-down",
213
- value: (this.props.intersection.backgroundColorOpacity ?? 1) * 100,
214
- onChange: this.handleBackgroundColorOpacityChange
215
- })
208
+ return (
209
+ <ui.FormGroup
210
+ labelMuted={true}
211
+ label={`Background Opacity: ${Math.round((props.intersection.backgroundColorOpacity ?? 1) * 100)}%`}
212
+ >
213
+ <Rcslider
214
+ min={0}
215
+ max={100}
216
+ step={1}
217
+ tipTransitionName="rc-slider-tooltip-zoom-down"
218
+ value={(props.intersection.backgroundColorOpacity ?? 1) * 100}
219
+ onChange={handleBackgroundColorOpacityChange}
220
+ />
221
+ </ui.FormGroup>
216
222
  )
217
223
  }
218
224
 
219
- render() {
220
- return R(
221
- "div",
222
- null,
223
- this.renderValueAxis(),
224
- this.renderNullValue(),
225
- this.renderFilter(),
226
- this.renderStyling(),
227
- this.renderBackgroundColorAxis(),
228
- this.renderBackgroundColorConditions(),
229
- this.renderBackgroundColor(),
230
- this.renderBackgroundColorOpacityControl()
225
+ const renderSegmentValueAxisOverride = (segment: PivotChartSegment) => {
226
+ // Get type of segment axis
227
+ const axisBuilder = new AxisBuilder({ schema: props.schema })
228
+
229
+ const segmentValueAxisType = axisBuilder.getAxisType(segment.valueAxis!)
230
+ if (!segmentValueAxisType) {
231
+ return null
232
+ }
233
+
234
+ const overrideValueAxis = (props.intersection.segmentValueAxisOverrides || {})[segment.id]
235
+
236
+ return (
237
+ <ui.FormGroup
238
+ labelMuted={true}
239
+ label={(segment.label || axisBuilder.summarizeAxis(segment.valueAxis!)) + ":"}
240
+ >
241
+ <AxisComponent
242
+ schema={props.schema}
243
+ dataSource={props.dataSource}
244
+ table={table}
245
+ types={[segmentValueAxisType]}
246
+ aggrNeed="none"
247
+ value={overrideValueAxis}
248
+ onChange={valueAxis => props.onChange(produce(props.intersection, (draft: PivotChartIntersection) => {
249
+ draft.segmentValueAxisOverrides = draft.segmentValueAxisOverrides || {}
250
+ draft.segmentValueAxisOverrides[segment.id] = valueAxis
251
+ }))}
252
+ allowExcludedValues={false}
253
+ collapseCategories={true}
254
+ />
255
+ </ui.FormGroup>
231
256
  )
232
257
  }
258
+
259
+ const renderSegmentValueAxisOverrides = () => {
260
+ if (!props.intersection.tableOverride) {
261
+ return null
262
+ }
263
+
264
+ // Get all segments
265
+ const segments = getAllSegments(props.design.rows).concat(getAllSegments(props.design.columns))
266
+
267
+ // Filter out segments that are not intersecting
268
+ const intersectingSegmentIds = props.intersectionId.split(/[,:]/).filter(id => id !== "")
269
+ const intersectingSegments = segments.filter(segment => intersectingSegmentIds.includes(segment.id) && segment.valueAxis)
270
+
271
+ return (
272
+ <ui.FormGroup
273
+ labelMuted={true}
274
+ label="Fields to disaggregate data by (required)"
275
+ >
276
+ {intersectingSegments.map(segment => renderSegmentValueAxisOverride(segment))}
277
+ </ui.FormGroup>
278
+ )
279
+ }
280
+
281
+ const renderOverrideTable = () => {
282
+ return (
283
+ <ui.CollapsibleSection
284
+ label="Advanced: Override Data Source"
285
+ hint="Use a different data source for this cell"
286
+ labelMuted={true}
287
+ initiallyOpen={props.intersection.tableOverride != null}
288
+ >
289
+ <TableSelectComponent
290
+ schema={props.schema}
291
+ value={props.intersection.tableOverride}
292
+ onChange={handleTableOverrideChange}
293
+ />
294
+ <br />
295
+ {renderSegmentValueAxisOverrides()}
296
+ </ui.CollapsibleSection>
297
+ )
298
+ }
299
+
300
+ return (
301
+ <div>
302
+ {renderValueAxis()}
303
+ {renderNullValue()}
304
+ {renderFilter()}
305
+ {renderStyling()}
306
+ {renderBackgroundColorAxis()}
307
+ {renderBackgroundColorConditions()}
308
+ {renderBackgroundColor()}
309
+ {renderBackgroundColorOpacityControl()}
310
+ {renderOverrideTable()}
311
+ </div>
312
+ )
233
313
  }
234
314
 
235
315
  interface BackgroundColorConditionsComponentProps {
@@ -250,33 +330,37 @@ class BackgroundColorConditionsComponent extends React.Component<BackgroundColor
250
330
 
251
331
  render() {
252
332
  // List conditions
253
- return R(
254
- ui.FormGroup,
255
- {
256
- label: "Color Conditions",
257
- labelMuted: true,
258
- help: "Add conditions that, if met, set the color of the cell. Useful for flagging certain values"
259
- },
260
- <ListEditorComponent<{ condition?: Expr, color?: string }>
261
- items={this.props.colorConditions || []}
262
- renderItem={(item, index, onItemChange) => {
263
- return R(BackgroundColorConditionComponent, {
264
- key: index,
265
- colorCondition: item,
266
- table: this.props.table,
267
- schema: this.props.schema,
268
- dataSource: this.props.dataSource,
269
- onChange: onItemChange
270
- })
271
- }}
272
- onItemsChange={this.props.onChange}
273
- />,
274
- R(
275
- ui.Button,
276
- { type: "link", size: "sm", onClick: this.handleAdd },
277
- R(ui.Icon, { id: "fa-plus" }),
278
- " Add Condition"
279
- )
333
+ return (
334
+ <ui.FormGroup
335
+ label="Color Conditions"
336
+ labelMuted={true}
337
+ help="Add conditions that, if met, set the color of the cell. Useful for flagging certain values"
338
+ >
339
+ <ListEditorComponent<{ condition?: Expr, color?: string }>
340
+ items={this.props.colorConditions || []}
341
+ renderItem={(item, index, onItemChange) => {
342
+ return (
343
+ <BackgroundColorConditionComponent
344
+ key={index}
345
+ colorCondition={item}
346
+ table={this.props.table}
347
+ schema={this.props.schema}
348
+ dataSource={this.props.dataSource}
349
+ onChange={onItemChange}
350
+ />
351
+ )
352
+ }}
353
+ onItemsChange={this.props.onChange}
354
+ />
355
+ <ui.Button
356
+ type="link"
357
+ size="sm"
358
+ onClick={this.handleAdd}
359
+ >
360
+ <ui.Icon id="fa-plus" />
361
+ Add Condition
362
+ </ui.Button>
363
+ </ui.FormGroup>
280
364
  )
281
365
  }
282
366
  }
@@ -289,7 +373,9 @@ interface BackgroundColorConditionComponentProps {
289
373
  onChange: any
290
374
  }
291
375
 
292
- // Displays single background color condition
376
+ /**
377
+ * Displays single background color condition
378
+ */
293
379
  class BackgroundColorConditionComponent extends React.Component<BackgroundColorConditionComponentProps> {
294
380
  constructor(props: BackgroundColorConditionComponentProps) {
295
381
  super(props)
@@ -302,37 +388,35 @@ class BackgroundColorConditionComponent extends React.Component<BackgroundColorC
302
388
  }
303
389
 
304
390
  render() {
305
- return R(
306
- "div", {},
307
- R(
308
- ui.FormGroup,
309
- {
310
- labelMuted: true,
311
- label: "Condition"
312
- },
313
- R(ExprComponent, {
314
- schema: this.props.schema,
315
- dataSource: this.props.dataSource,
316
- onChange: this.update("condition"),
317
- types: ["boolean"],
318
- aggrStatuses: ["aggregate", "literal"],
319
- table: this.props.table,
320
- value: this.props.colorCondition.condition
321
- })
322
- ),
323
-
324
- R(
325
- ui.FormGroup,
326
- {
327
- labelMuted: true,
328
- label: "Color",
329
- hint: "Color to display when condition is met"
330
- },
331
- R(ColorComponent, {
332
- color: this.props.colorCondition.color,
333
- onChange: this.update("color")
334
- })
335
- )
391
+ return (
392
+ <div>
393
+ <ui.FormGroup
394
+ labelMuted={true}
395
+ label="Condition"
396
+ >
397
+ <ExprComponent
398
+ schema={this.props.schema}
399
+ dataSource={this.props.dataSource}
400
+ onChange={this.update("condition")}
401
+ types={["boolean"]}
402
+ aggrStatuses={["aggregate", "literal"]}
403
+ table={this.props.table}
404
+ value={this.props.colorCondition.condition}
405
+ />
406
+ </ui.FormGroup>
407
+
408
+ <ui.FormGroup
409
+ labelMuted={true}
410
+ label="Color"
411
+ hint="Color to display when condition is met"
412
+ >
413
+ <ColorComponent
414
+ color={this.props.colorCondition.color}
415
+ onChange={this.update("color")}
416
+ />
417
+ </ui.FormGroup>
418
+ </div>
336
419
  )
337
420
  }
338
421
  }
422
+