@quillsql/react 2.13.40 → 2.13.41

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 (253) hide show
  1. package/dist/cjs/Chart.d.ts +5 -1
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +51 -28
  4. package/dist/cjs/ChartBuilder.d.ts +13 -1
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +342 -138
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +11 -1
  9. package/dist/cjs/Context.d.ts +16 -4
  10. package/dist/cjs/Context.d.ts.map +1 -1
  11. package/dist/cjs/Context.js +57 -38
  12. package/dist/cjs/Dashboard.d.ts +6 -3
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +70 -28
  15. package/dist/cjs/QuillProvider.d.ts +4 -8
  16. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  17. package/dist/cjs/ReportBuilder.d.ts +1 -1
  18. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  19. package/dist/cjs/ReportBuilder.js +117 -45
  20. package/dist/cjs/SQLEditor.d.ts +7 -1
  21. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  22. package/dist/cjs/SQLEditor.js +53 -9
  23. package/dist/cjs/Table.d.ts +21 -1
  24. package/dist/cjs/Table.d.ts.map +1 -1
  25. package/dist/cjs/Table.js +30 -192
  26. package/dist/cjs/components/Chart/BarChart.d.ts +5 -1
  27. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  28. package/dist/cjs/components/Chart/BarChart.js +4 -3
  29. package/dist/cjs/components/Chart/CustomReferenceLine.d.ts +2 -0
  30. package/dist/cjs/components/Chart/CustomReferenceLine.d.ts.map +1 -0
  31. package/dist/cjs/components/Chart/CustomReferenceLine.js +26 -0
  32. package/dist/cjs/components/Chart/GaugeChart.d.ts +11 -0
  33. package/dist/cjs/components/Chart/GaugeChart.d.ts.map +1 -0
  34. package/dist/cjs/components/Chart/GaugeChart.js +198 -0
  35. package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
  36. package/dist/cjs/components/Chart/InternalChart.js +14 -11
  37. package/dist/cjs/components/Chart/LineChart.d.ts +5 -1
  38. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  39. package/dist/cjs/components/Chart/LineChart.js +4 -3
  40. package/dist/cjs/components/Chart/MapChart.d.ts +36 -0
  41. package/dist/cjs/components/Chart/MapChart.d.ts.map +1 -0
  42. package/dist/cjs/components/Chart/MapChart.js +548 -0
  43. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  44. package/dist/cjs/components/Dashboard/DataLoader.js +114 -42
  45. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  46. package/dist/cjs/components/Dashboard/MetricComponent.js +57 -54
  47. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  48. package/dist/cjs/components/Dashboard/TableComponent.js +5 -1
  49. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  50. package/dist/cjs/components/QuillMultiSelectWithCombo.js +5 -4
  51. package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
  52. package/dist/cjs/components/QuillSelectWithCombo.js +12 -11
  53. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  54. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +2 -1
  55. package/dist/cjs/components/ReportBuilder/FilterModal.js +13 -13
  56. package/dist/cjs/components/ReportBuilder/FilterStack.d.ts +2 -1
  57. package/dist/cjs/components/ReportBuilder/FilterStack.d.ts.map +1 -1
  58. package/dist/cjs/components/ReportBuilder/FilterStack.js +4 -4
  59. package/dist/cjs/components/ReportBuilder/convert.d.ts +2 -0
  60. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  61. package/dist/cjs/components/ReportBuilder/convert.js +28 -7
  62. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
  63. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  64. package/dist/cjs/components/ReportBuilder/util.js +15 -2
  65. package/dist/cjs/components/UiComponents.d.ts +4 -1
  66. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  67. package/dist/cjs/components/UiComponents.js +31 -5
  68. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  69. package/dist/cjs/hooks/useDashboard.js +11 -9
  70. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  71. package/dist/cjs/hooks/useExport.js +18 -4
  72. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  73. package/dist/cjs/hooks/useQuill.js +16 -3
  74. package/dist/cjs/hooks/useReport.d.ts.map +1 -1
  75. package/dist/cjs/hooks/useReport.js +1 -7
  76. package/dist/cjs/hooks/useVirtualTables.d.ts +6 -2
  77. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
  78. package/dist/cjs/hooks/useVirtualTables.js +5 -2
  79. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  80. package/dist/cjs/internals/ReportBuilder/PivotModal.js +6 -7
  81. package/dist/cjs/models/Filter.d.ts +20 -13
  82. package/dist/cjs/models/Filter.d.ts.map +1 -1
  83. package/dist/cjs/models/Filter.js +161 -87
  84. package/dist/cjs/models/Report.d.ts +12 -1
  85. package/dist/cjs/models/Report.d.ts.map +1 -1
  86. package/dist/cjs/models/Schema.d.ts +12 -1
  87. package/dist/cjs/models/Schema.d.ts.map +1 -1
  88. package/dist/cjs/utils/astFilterProcessing.js +22 -22
  89. package/dist/cjs/utils/astProcessing.d.ts +2 -2
  90. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  91. package/dist/cjs/utils/astProcessing.js +25 -6
  92. package/dist/cjs/utils/axisFormatter.d.ts.map +1 -1
  93. package/dist/cjs/utils/axisFormatter.js +25 -0
  94. package/dist/cjs/utils/color.d.ts +159 -0
  95. package/dist/cjs/utils/color.d.ts.map +1 -1
  96. package/dist/cjs/utils/color.js +14 -5
  97. package/dist/cjs/utils/columnProcessing.js +3 -3
  98. package/dist/cjs/utils/constants.d.ts +1 -0
  99. package/dist/cjs/utils/constants.d.ts.map +1 -1
  100. package/dist/cjs/utils/constants.js +2 -1
  101. package/dist/cjs/utils/dashboard.d.ts +13 -3
  102. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  103. package/dist/cjs/utils/dashboard.js +73 -16
  104. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  105. package/dist/cjs/utils/dataFetcher.js +3 -1
  106. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  107. package/dist/cjs/utils/filterProcessing.js +9 -9
  108. package/dist/cjs/utils/getDomain.d.ts +4 -1
  109. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  110. package/dist/cjs/utils/getDomain.js +11 -1
  111. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  112. package/dist/cjs/utils/pivotConstructor.js +5 -5
  113. package/dist/cjs/utils/queryConstructor.d.ts +1 -1
  114. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  115. package/dist/cjs/utils/queryConstructor.js +71 -43
  116. package/dist/cjs/utils/report.d.ts +23 -5
  117. package/dist/cjs/utils/report.d.ts.map +1 -1
  118. package/dist/cjs/utils/report.js +28 -8
  119. package/dist/cjs/utils/schema.d.ts +26 -3
  120. package/dist/cjs/utils/schema.d.ts.map +1 -1
  121. package/dist/cjs/utils/schema.js +75 -43
  122. package/dist/cjs/utils/tableProcessing.d.ts +10 -3
  123. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  124. package/dist/cjs/utils/tableProcessing.js +4 -6
  125. package/dist/cjs/utils/textProcessing.d.ts.map +1 -1
  126. package/dist/cjs/utils/textProcessing.js +0 -1
  127. package/dist/esm/Chart.d.ts +5 -1
  128. package/dist/esm/Chart.d.ts.map +1 -1
  129. package/dist/esm/Chart.js +52 -29
  130. package/dist/esm/ChartBuilder.d.ts +13 -1
  131. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  132. package/dist/esm/ChartBuilder.js +347 -143
  133. package/dist/esm/ChartEditor.d.ts.map +1 -1
  134. package/dist/esm/ChartEditor.js +11 -1
  135. package/dist/esm/Context.d.ts +16 -4
  136. package/dist/esm/Context.d.ts.map +1 -1
  137. package/dist/esm/Context.js +59 -40
  138. package/dist/esm/Dashboard.d.ts +6 -3
  139. package/dist/esm/Dashboard.d.ts.map +1 -1
  140. package/dist/esm/Dashboard.js +71 -29
  141. package/dist/esm/QuillProvider.d.ts +4 -8
  142. package/dist/esm/QuillProvider.d.ts.map +1 -1
  143. package/dist/esm/ReportBuilder.d.ts +1 -1
  144. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  145. package/dist/esm/ReportBuilder.js +119 -47
  146. package/dist/esm/SQLEditor.d.ts +7 -1
  147. package/dist/esm/SQLEditor.d.ts.map +1 -1
  148. package/dist/esm/SQLEditor.js +54 -10
  149. package/dist/esm/Table.d.ts +21 -1
  150. package/dist/esm/Table.d.ts.map +1 -1
  151. package/dist/esm/Table.js +34 -196
  152. package/dist/esm/components/Chart/BarChart.d.ts +5 -1
  153. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  154. package/dist/esm/components/Chart/BarChart.js +5 -4
  155. package/dist/esm/components/Chart/CustomReferenceLine.d.ts +2 -0
  156. package/dist/esm/components/Chart/CustomReferenceLine.d.ts.map +1 -0
  157. package/dist/esm/components/Chart/CustomReferenceLine.js +23 -0
  158. package/dist/esm/components/Chart/GaugeChart.d.ts +11 -0
  159. package/dist/esm/components/Chart/GaugeChart.d.ts.map +1 -0
  160. package/dist/esm/components/Chart/GaugeChart.js +195 -0
  161. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  162. package/dist/esm/components/Chart/InternalChart.js +14 -11
  163. package/dist/esm/components/Chart/LineChart.d.ts +5 -1
  164. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  165. package/dist/esm/components/Chart/LineChart.js +5 -4
  166. package/dist/esm/components/Chart/MapChart.d.ts +36 -0
  167. package/dist/esm/components/Chart/MapChart.d.ts.map +1 -0
  168. package/dist/esm/components/Chart/MapChart.js +541 -0
  169. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  170. package/dist/esm/components/Dashboard/DataLoader.js +114 -42
  171. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  172. package/dist/esm/components/Dashboard/MetricComponent.js +57 -54
  173. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  174. package/dist/esm/components/Dashboard/TableComponent.js +5 -1
  175. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  176. package/dist/esm/components/QuillMultiSelectWithCombo.js +5 -4
  177. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
  178. package/dist/esm/components/QuillSelectWithCombo.js +12 -11
  179. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  180. package/dist/esm/components/ReportBuilder/AddColumnModal.js +2 -1
  181. package/dist/esm/components/ReportBuilder/FilterModal.js +14 -14
  182. package/dist/esm/components/ReportBuilder/FilterStack.d.ts +2 -1
  183. package/dist/esm/components/ReportBuilder/FilterStack.d.ts.map +1 -1
  184. package/dist/esm/components/ReportBuilder/FilterStack.js +4 -4
  185. package/dist/esm/components/ReportBuilder/convert.d.ts +2 -0
  186. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  187. package/dist/esm/components/ReportBuilder/convert.js +26 -7
  188. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  189. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  190. package/dist/esm/components/ReportBuilder/util.js +15 -2
  191. package/dist/esm/components/UiComponents.d.ts +4 -1
  192. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  193. package/dist/esm/components/UiComponents.js +29 -4
  194. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  195. package/dist/esm/hooks/useDashboard.js +11 -9
  196. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  197. package/dist/esm/hooks/useExport.js +19 -5
  198. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  199. package/dist/esm/hooks/useQuill.js +16 -3
  200. package/dist/esm/hooks/useReport.d.ts.map +1 -1
  201. package/dist/esm/hooks/useReport.js +1 -7
  202. package/dist/esm/hooks/useVirtualTables.d.ts +6 -2
  203. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  204. package/dist/esm/hooks/useVirtualTables.js +6 -3
  205. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  206. package/dist/esm/internals/ReportBuilder/PivotModal.js +6 -7
  207. package/dist/esm/models/Filter.d.ts +20 -13
  208. package/dist/esm/models/Filter.d.ts.map +1 -1
  209. package/dist/esm/models/Filter.js +160 -86
  210. package/dist/esm/models/Report.d.ts +12 -1
  211. package/dist/esm/models/Report.d.ts.map +1 -1
  212. package/dist/esm/models/Schema.d.ts +12 -1
  213. package/dist/esm/models/Schema.d.ts.map +1 -1
  214. package/dist/esm/utils/astFilterProcessing.js +23 -23
  215. package/dist/esm/utils/astProcessing.d.ts +2 -2
  216. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  217. package/dist/esm/utils/astProcessing.js +25 -6
  218. package/dist/esm/utils/axisFormatter.d.ts.map +1 -1
  219. package/dist/esm/utils/axisFormatter.js +25 -0
  220. package/dist/esm/utils/color.d.ts +159 -0
  221. package/dist/esm/utils/color.d.ts.map +1 -1
  222. package/dist/esm/utils/color.js +8 -2
  223. package/dist/esm/utils/columnProcessing.js +3 -3
  224. package/dist/esm/utils/constants.d.ts +1 -0
  225. package/dist/esm/utils/constants.d.ts.map +1 -1
  226. package/dist/esm/utils/constants.js +1 -0
  227. package/dist/esm/utils/dashboard.d.ts +13 -3
  228. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  229. package/dist/esm/utils/dashboard.js +73 -16
  230. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  231. package/dist/esm/utils/dataFetcher.js +3 -1
  232. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  233. package/dist/esm/utils/filterProcessing.js +10 -10
  234. package/dist/esm/utils/getDomain.d.ts +4 -1
  235. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  236. package/dist/esm/utils/getDomain.js +11 -1
  237. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  238. package/dist/esm/utils/pivotConstructor.js +5 -5
  239. package/dist/esm/utils/queryConstructor.d.ts +1 -1
  240. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  241. package/dist/esm/utils/queryConstructor.js +71 -43
  242. package/dist/esm/utils/report.d.ts +23 -5
  243. package/dist/esm/utils/report.d.ts.map +1 -1
  244. package/dist/esm/utils/report.js +29 -9
  245. package/dist/esm/utils/schema.d.ts +26 -3
  246. package/dist/esm/utils/schema.d.ts.map +1 -1
  247. package/dist/esm/utils/schema.js +74 -43
  248. package/dist/esm/utils/tableProcessing.d.ts +10 -3
  249. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  250. package/dist/esm/utils/tableProcessing.js +4 -6
  251. package/dist/esm/utils/textProcessing.d.ts.map +1 -1
  252. package/dist/esm/utils/textProcessing.js +0 -1
  253. package/package.json +8 -3
@@ -1,15 +1,15 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useEffect, useRef, useState, useContext, useMemo, } from 'react';
3
3
  import { ClientContext, DashboardConfigContext, DashboardContext, DashboardFiltersContext, ReportFiltersContext, ReportsContext, SchemaDataContext, TenantContext, ThemeContext, } from './Context';
4
4
  import { PivotModal, generatePivotTable, isDateField, } from './internals/ReportBuilder/PivotModal';
5
5
  import { PivotCard } from './internals/ReportBuilder/PivotList';
6
- import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, QuillLoadingComponent, } from './components/UiComponents';
6
+ import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, QuillLoadingComponent, QuillToolTip, QuillChartBuilderCheckboxComponent, } from './components/UiComponents';
7
7
  import { removeDoubleQuotes, snakeAndCamelCaseToTitleCase, } from './utils/textProcessing';
8
8
  import { QuillSelectComponent } from './components/QuillSelect';
9
9
  import { TEMP_REPORT_ID, } from './models/Report';
10
10
  import { QuillCard } from './components/QuillCard';
11
- import { quillFormat } from './utils/valueFormatter';
12
- import { convertFieldTypeToJSType, isStringType, } from './utils/columnProcessing';
11
+ import { NUMBER_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
12
+ import { convertFieldTypeToJSType, isDateType, isNumberType, isStringType, } from './utils/columnProcessing';
13
13
  import { getSelectFromAST, getTablesHelper } from './utils/astProcessing';
14
14
  import { validateReport } from './utils/validation';
15
15
  import { QuillChartErrorWithAction } from './components/Chart/ChartError';
@@ -25,9 +25,9 @@ import { getDateBucketFromRange } from './utils/dates';
25
25
  import { QuillMultiSelectComponentWithCombo as MultiSelectComponent } from './components/QuillMultiSelectWithCombo';
26
26
  import { useQuillCloud } from './utils/dataFetcher';
27
27
  import { QuillMultiSelectSectionList } from './components/QuillMultiSelectSectionList';
28
- import { ALL_TENANTS, SINGLE_TENANT } from './utils/constants';
28
+ import { ALL_TENANTS, REFERENCE_LINE, SINGLE_TENANT } from './utils/constants';
29
29
  import { disambiguatedValueField } from './utils/pivotConstructor';
30
- const CHART_TYPES = ['column', 'line', 'table', 'metric', 'bar', 'pie'];
30
+ const CHART_TYPES = ['column', 'line', 'table', 'metric', 'gauge', 'bar', 'pie', 'US map', 'World map'];
31
31
  const CHART_TO_LABELS = {
32
32
  column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
33
33
  line: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
@@ -35,8 +35,17 @@ const CHART_TO_LABELS = {
35
35
  metric: { xAxisLabel: 'Value' },
36
36
  bar: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
37
37
  pie: { xAxisLabel: 'Category', yAxisLabel: 'Count' },
38
+ 'US map': { xAxisLabel: 'State', yAxisLabel: 'Value' },
39
+ 'World map': { xAxisLabel: 'Country', yAxisLabel: 'Value' },
40
+ gauge: { xAxisLabel: 'Value' },
38
41
  };
39
- function getPivotMetricOptions(pivot) {
42
+ function getPivotMetricOptions(pivot, selectedPivotTable, chartType) {
43
+ if (['metric', 'gauge'].includes(chartType) && selectedPivotTable) {
44
+ return selectedPivotTable.columns.map((elem) => ({
45
+ label: elem.field === pivot?.rowField ? `Pivot Row (${elem.field})` : elem.field,
46
+ value: elem.field,
47
+ }));
48
+ }
40
49
  if (!pivot.rowField) {
41
50
  const valueField = disambiguatedValueField(pivot);
42
51
  return [
@@ -75,17 +84,18 @@ export function createInitialFormData(columns) {
75
84
  chartType: firstNumberColumn ? 'line' : 'table',
76
85
  pivot: null,
77
86
  template: true,
87
+ referenceLines: [],
78
88
  };
79
89
  return formEmptyState;
80
90
  }
81
91
  function getChartTypeOptions(formData, dashboard) {
82
92
  let viableCharts = CHART_TYPES;
83
93
  if (dashboard && dashboard.dateFilter && dashboard.dateFilter.comparison) {
84
- viableCharts = viableCharts.filter((chart) => !['table', 'metric', 'bar', 'pie'].includes(chart));
94
+ viableCharts = viableCharts.filter((chart) => !['table', 'metric', 'gauge', 'bar', 'pie', 'US map', 'World map'].includes(chart));
85
95
  }
86
96
  if (formData.pivot && !formData.pivot.rowField) {
87
97
  return viableCharts
88
- .filter((elem) => elem === 'metric' || elem === 'table')
98
+ .filter((elem) => ['table', 'metric', 'gauge'].includes(elem))
89
99
  .map((elem) => ({
90
100
  label: elem,
91
101
  value: elem,
@@ -93,14 +103,13 @@ function getChartTypeOptions(formData, dashboard) {
93
103
  }
94
104
  else {
95
105
  return viableCharts
96
- .filter((elem) => !((formData.pivot && elem === 'metric') ||
97
- (formData.pivot &&
98
- formData.pivot.columnField &&
99
- (elem === 'bar' || elem === 'pie'))))
106
+ .filter((elem) => !((formData.pivot &&
107
+ formData.pivot.columnField &&
108
+ (elem === 'bar' || elem === 'pie' || elem === 'US map' || elem === 'World map'))))
100
109
  .map((elem) => ({ label: elem, value: elem }));
101
110
  }
102
111
  }
103
- function createReportFromForm(formData, report, selectedPivotTable, rows = [], filtersApplied = []) {
112
+ function createReportFromForm(formData, report, selectedPivotTable, rows = [], filtersApplied = [], referenceLineQueryResults) {
104
113
  const newReport = convertInternalReportToReport(mergeComparisonRange({
105
114
  ...formData,
106
115
  dashboardName: formData.dashboardName || '',
@@ -120,6 +129,14 @@ function createReportFromForm(formData, report, selectedPivotTable, rows = [], f
120
129
  pivotColumns: selectedPivotTable?.columns ?? undefined,
121
130
  pivotRows: selectedPivotTable?.rows ?? undefined,
122
131
  columnInternal: report?.columnInternal ?? [],
132
+ referenceLines: formData.referenceLines?.map((elem) => ({
133
+ label: elem.label,
134
+ query: elem.label === REFERENCE_LINE ? [Number(elem.y1) || 0, Number(elem.y2) || 0] : elem.label,
135
+ })) || [],
136
+ referenceLineYValues: formData.referenceLines?.map((elem, index) => ({
137
+ label: elem.label,
138
+ query: elem.label === REFERENCE_LINE ? [Number(elem.y1) || 0, Number(elem.y2) || 0] : referenceLineQueryResults?.[index],
139
+ })) || [],
123
140
  }), filtersApplied);
124
141
  return newReport;
125
142
  }
@@ -155,7 +172,7 @@ const DATE_OPTIONS = [
155
172
  { value: 'MMM_dd_hh:mm_ap_pm', label: 'day and time' },
156
173
  { value: 'hh_ap_pm', label: 'hour' },
157
174
  ];
158
- const formatOptions = [
175
+ const ALL_FORMAT_OPTIONS = [
159
176
  ...NUMBER_OPTIONS,
160
177
  ...DATE_OPTIONS,
161
178
  { value: 'string', label: 'string' },
@@ -238,7 +255,7 @@ export function ChartBuilderWithModal(props) {
238
255
  */
239
256
  export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent,
240
257
  // MultiSelectComponent = QuillMultiSelectComponentWithCombo,
241
- ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent = MemoizedModal, LoadingComponent = QuillLoadingComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, ErrorComponent = QuillChartErrorWithAction, onClickChartError, isOpen, isHorizontalView = true, setIsOpen, dateRange, isAdmin = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, onDiscardChanges, reportId, tempReport, recommendedPivots: rp = [], createdPivots: cp = [], dateColumn, buttonLabel, organizationName, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, showTableFormatOptions, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, filtersEnabled, onFiltersEnabledChanged,
258
+ ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, LabelComponent = MemoizedLabel, DeleteButtonComponent = MemoizedDeleteButton, TextComponent = MemoizedText, PopoverComponent = MemoizedPopover, CardComponent = QuillCard, TableComponent = QuillTableComponent, ModalComponent = MemoizedModal, LoadingComponent = QuillLoadingComponent, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, FormContainer = QuillChartBuilderFormContainer, ErrorComponent = QuillChartErrorWithAction, CheckboxComponent = QuillChartBuilderCheckboxComponent, onClickChartError, isOpen, isHorizontalView = true, setIsOpen, dateRange, isAdmin = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, onDiscardChanges, reportId, tempReport, recommendedPivots: rp = [], createdPivots: cp = [], dateColumn, buttonLabel, organizationName, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, showTableFormatOptions, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, filtersEnabled, onFiltersEnabledChanged,
242
259
  // isLoading,
243
260
  onClickChartElement, isEditingMode = false, disableSort = true, }) {
244
261
  const [client] = useContext(ClientContext);
@@ -264,14 +281,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
264
281
  const inputRef = useRef(null);
265
282
  const selectRef = useRef(null);
266
283
  const processColumns = (columns) => {
267
- if (schemaData.schema) {
284
+ if (schemaData.schemaWithCustomFields) {
268
285
  const newProcessedColumns = columns?.map((col) => {
269
286
  if (col.jsType) {
270
287
  return col;
271
288
  }
272
289
  const newCol = { ...col };
273
290
  let foundColumn;
274
- schemaData.schema.forEach((table) => {
291
+ schemaData.schemaWithCustomFields.forEach((table) => {
275
292
  if (table.columns) {
276
293
  const matchedColumn = table.columns.find((c) => c.field === col.field);
277
294
  if (matchedColumn) {
@@ -356,6 +373,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
356
373
  const [isEdittingPivot, setIsEdittingPivot] = useState(false);
357
374
  const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
358
375
  const [tableName, setTableName] = useState(undefined);
376
+ const [includeCustomFields, setIncludeCustomFields] = useState(report
377
+ ? !!report.includeCustomFields
378
+ : !!client?.featureFlags?.customFieldsEnabled);
359
379
  const selectedTable = schemaData.schema?.find((t) => t.displayName === tableName);
360
380
  const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
361
381
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -378,11 +398,13 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
378
398
  const [recommendedPivots, setRecommendedPivots] = useState(rp);
379
399
  const [pivotRowField, setPivotRowField] = useState(report?.pivot?.rowField);
380
400
  const [pivotColumnField, setPivotColumnField] = useState(report?.pivot?.columnField);
381
- const [pivotAggregations, setPivotAggregations] = useState(report?.pivot?.aggregations ?? [{
401
+ const [pivotAggregations, setPivotAggregations] = useState(report?.pivot?.aggregations ?? [
402
+ {
382
403
  valueField: report?.pivot?.valueField,
383
404
  valueField2: report?.pivot?.valueField2,
384
- aggregationType: report?.pivot?.aggregationType
385
- }]);
405
+ aggregationType: report?.pivot?.aggregationType,
406
+ },
407
+ ]);
386
408
  const baseProcessing = {
387
409
  page: report?.pagination ?? {
388
410
  page: 0,
@@ -397,6 +419,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
397
419
  const [allTables, setAllTables] = useState([]);
398
420
  const [customFieldTableRef, setCustomFieldTableRef] = useState(false);
399
421
  const [referencedColumns, setReferencedColumns] = useState({});
422
+ const [referencedColumnsWithoutStar, setReferencedColumnsWithoutStar] = useState({});
400
423
  const [filterMap, setFilterMap] = useState(report?.filterMap ?? {});
401
424
  const canonicalFilterMap = useMemo(() => {
402
425
  return Object.fromEntries(Object.entries(filterMap).filter((f) => f[1].table !== undefined && f[1].field !== undefined));
@@ -409,7 +432,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
409
432
  }
410
433
  acc[filter.label] =
411
434
  !!allTables.find((table) => table === (filterMap[filter.label] ?? filter).table) &&
412
- !!schemaData.schema
435
+ !!schemaData.schemaWithCustomFields
413
436
  ?.find((table) => {
414
437
  return (table.displayName === (filterMap[filter.label] ?? filter).table);
415
438
  })
@@ -453,6 +476,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
453
476
  pivot: null,
454
477
  dateField: defaultDateField,
455
478
  template: true,
479
+ referenceLines: [],
456
480
  };
457
481
  const updateDashboardFilters = async (dashboardName) => {
458
482
  if (dashboardConfig && dashboardConfig[dashboardName]) {
@@ -493,8 +517,8 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
493
517
  const pivotFormData = (pivot) => {
494
518
  const yAxisField = pivot.columnField ?? disambiguatedValueField(pivot) ?? '';
495
519
  const yAxisLabel = report?.yAxisFields && report?.yAxisFields?.length > 0
496
- ? report.yAxisFields[0]?.label ?? ''
497
- : disambiguatedValueField(pivot) ?? '';
520
+ ? (report.yAxisFields[0]?.label ?? '')
521
+ : (disambiguatedValueField(pivot) ?? '');
498
522
  // date labels for pivots should be treated like strings since they are
499
523
  const yAxisIsDate = pivot.columnField
500
524
  ? isDateField(pivot.columnFieldType ?? '')
@@ -503,12 +527,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
503
527
  const result = {
504
528
  pivot,
505
529
  chartType: chartType,
506
- xAxisField: pivot.rowField ? pivot.rowField : disambiguatedValueField(pivot),
507
- xAxisFormat: isDateField(pivot.rowFieldType ?? '')
530
+ xAxisField: pivot.rowField
531
+ ? pivot.rowField
532
+ : disambiguatedValueField(pivot),
533
+ xAxisFormat: isDateType(pivot.rowFieldType ?? '')
508
534
  ? 'string'
509
- : report?.columns.find((col) => col.field === pivot.rowField)?.format ||
510
- report?.xAxisFormat ||
511
- 'whole_number',
535
+ : isNumberType(pivot.rowFieldType ?? '')
536
+ ? 'whole_number'
537
+ : 'string',
512
538
  xAxisLabel: report?.xAxisLabel || pivot.rowField,
513
539
  yAxisFields: [
514
540
  {
@@ -517,43 +543,66 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
517
543
  format: yAxisIsDate
518
544
  ? 'string'
519
545
  : report?.yAxisFields && report?.yAxisFields?.length > 0
520
- ? report?.yAxisFields[0]?.format ?? 'whole_number'
521
- : report?.columns.find((col) => col.field === disambiguatedValueField(pivot))
522
- ?.format ?? 'whole_number',
546
+ ? (report?.yAxisFields[0]?.format ?? 'whole_number')
547
+ : (report?.columns.find((col) => col.field === disambiguatedValueField(pivot))?.format ?? 'whole_number'),
523
548
  },
524
549
  ],
525
550
  };
526
551
  return result;
527
552
  };
528
- const getReferencedTables = async (client, sqlQuery, dbTables) => {
553
+ const getReferencedTables = async (client, sqlQuery, dbTables, skipStar) => {
529
554
  const resp = await getDataFromCloud(client, `astify`, {
530
555
  query: sqlQuery,
531
556
  publicKey: client.publicKey,
532
557
  useNewNodeSql: true,
533
558
  });
534
559
  if (resp.success === false) {
535
- return getTablesHelper(getSelectFromAST({}), dbTables);
560
+ return getTablesHelper(getSelectFromAST({}), dbTables, skipStar);
536
561
  }
537
- return getTablesHelper(getSelectFromAST(resp.ast), dbTables);
562
+ return getTablesHelper(getSelectFromAST(resp.ast), dbTables, skipStar);
538
563
  };
539
564
  const formFormDataFromReport = (report) => {
540
- let pivotData = {};
565
+ // let pivotData = {};
541
566
  let dateField = defaultDateField;
542
- if (report?.pivot) {
543
- pivotData = pivotFormData(report.pivot);
544
- }
567
+ // if (report?.pivot) {
568
+ // pivotData = pivotFormData(report.pivot);
569
+ // }
545
570
  if (report) {
546
571
  dateField = report.dateField || defaultDateField;
547
572
  }
548
573
  return {
549
574
  ...formEmptyState,
550
575
  ...report,
551
- ...pivotData,
552
- ...(report?.dashboardName && { dashboardName: report?.dashboardName }),
576
+ // ...pivotData,
553
577
  dateField: dateField,
578
+ referenceLines: report?.referenceLines ? report.referenceLines?.map(({ label, query }) => {
579
+ if (typeof query === 'string') {
580
+ return { label, y1: undefined, y2: undefined };
581
+ }
582
+ return {
583
+ label,
584
+ y1: query[0],
585
+ y2: query[1],
586
+ };
587
+ }) : [],
554
588
  };
555
589
  };
556
590
  const [formData, setFormData] = useState(formFormDataFromReport(report));
591
+ const referenceLineQueryResults = useMemo(() => {
592
+ return formData?.referenceLines?.map((line) => {
593
+ if (line.label === REFERENCE_LINE) {
594
+ return [Number(line.y1) || 0, Number(line.y2) || 0];
595
+ }
596
+ // line.label is a field
597
+ // Get the first and last row of the field
598
+ const field = formData.columns.find((col) => col.field === line.label);
599
+ if (!field) {
600
+ return [0, 0];
601
+ }
602
+ // return [Number(rows[0]?.[field.field]) || 0, Number(rows[rows.length - 1]?.[field.field]) || 0];
603
+ return (pivotData?.rows ? pivotData.rows : rows).map((row) => Number(row[field.field]) || 0);
604
+ });
605
+ }, [formData?.referenceLines]);
557
606
  const currentDashboard = useMemo(() => {
558
607
  return dashboardConfig[formData.dashboardName ?? report?.dashboardName ?? '']?.config;
559
608
  }, [dashboardConfig, formData.dashboardName, report?.dashboardName]);
@@ -561,6 +610,19 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
561
610
  return (currentDashboard?.tenantKeys?.map((tenantKey) => client?.allTenantTypes?.find((t) => t.tenantField === tenantKey)) ?? []);
562
611
  }, [client?.allTenantTypes, currentDashboard?.tenantKeys]);
563
612
  const dashboardOwner = currentDashboardTenants?.[0];
613
+ const currentTenantAsFormFlags = useMemo(() => {
614
+ if (!tenants || !tenants.length) {
615
+ return undefined;
616
+ }
617
+ const tenantField = typeof tenants[0] !== 'object'
618
+ ? dashboardOwner?.name
619
+ : tenants[0]?.tenantField;
620
+ if (!tenantField) {
621
+ return undefined;
622
+ }
623
+ const tenantIds = typeof tenants[0] !== 'object' ? tenants : tenants[0]?.tenantIds;
624
+ return { [tenantField]: tenantIds };
625
+ }, [tenants, dashboardOwner]);
564
626
  const invalidColumns = useMemo(() => {
565
627
  if (!rows || !rows.length) {
566
628
  return [];
@@ -575,6 +637,62 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
575
637
  const data = formFormDataFromReport(report);
576
638
  return getChartTypeOptions(data, dashboardConfig[data.dashboardName || '']);
577
639
  })());
640
+ const reportContainsCustomFields = useMemo(() => {
641
+ // Check whether report query contains custom fields
642
+ const customFieldsMap = schemaData.customFields;
643
+ const reportQueryContainsCustomFields = allTables.some((table) => {
644
+ const tableColumns = referencedColumnsWithoutStar[table] ?? [];
645
+ const customFieldColumns = customFieldsMap?.[table] ?? [];
646
+ return tableColumns.some((column) => customFieldColumns.some((field) => field.field === column));
647
+ });
648
+ return reportQueryContainsCustomFields;
649
+ }, [allTables, referencedColumnsWithoutStar]);
650
+ const chartBuilderFormDataContainsCustomFields = useMemo(() => {
651
+ const customFields = allTables
652
+ .map((table) => schemaData.customFields?.[table] ?? [])
653
+ .flat();
654
+ const customFieldsMap = schemaData.customFields;
655
+ const pivotContainsCustomFields = customFields.some((field) => field.field === formData.pivot?.columnField ||
656
+ field.field === formData.pivot?.rowField ||
657
+ field.field === formData.pivot?.valueField);
658
+ const xAxisFieldContainsCustomFields = customFields.some((field) => field.field === formData.xAxisField);
659
+ const yAxisFieldsContainsCustomFields = formData.yAxisFields.some((yAxisField) => {
660
+ return customFields.some((field) => field.field === yAxisField.field);
661
+ });
662
+ const dateFieldContainsCustomFields = customFields.some((field) => field.field === formData.dateField?.field);
663
+ const canonicalFilterMapContainsCustomFields = Object.values(canonicalFilterMap).some((filter) => {
664
+ return customFieldsMap?.[filter.table || '']?.some((field) => field.field === filter.field);
665
+ });
666
+ return (pivotContainsCustomFields ||
667
+ xAxisFieldContainsCustomFields ||
668
+ yAxisFieldsContainsCustomFields ||
669
+ dateFieldContainsCustomFields ||
670
+ canonicalFilterMapContainsCustomFields);
671
+ }, [
672
+ allTables,
673
+ formData.pivot,
674
+ formData.xAxisField,
675
+ formData.yAxisFields,
676
+ formData.dateField,
677
+ canonicalFilterMap,
678
+ ]);
679
+ const customFieldsInTabularColumns = useMemo(() => {
680
+ const customFields = allTables
681
+ .map((table) => schemaData.customFields?.[table] ?? [])
682
+ .flat();
683
+ return formData.columns.some((col) => {
684
+ return customFields.some((field) => field.field === col.field);
685
+ });
686
+ }, [allTables, formData.columns]);
687
+ const containsCustomFields = useMemo(() => {
688
+ return (reportContainsCustomFields ||
689
+ customFieldsInTabularColumns ||
690
+ chartBuilderFormDataContainsCustomFields);
691
+ }, [
692
+ reportContainsCustomFields,
693
+ customFieldsInTabularColumns,
694
+ chartBuilderFormDataContainsCustomFields,
695
+ ]);
578
696
  useEffect(() => {
579
697
  if (!loadingFormData && triggeredEditChart) {
580
698
  editChart();
@@ -612,12 +730,13 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
612
730
  const curDashboard = await updateDashboardFilters(dashboardName);
613
731
  setDashboardOptions(dashboardOptions);
614
732
  curFormData.dashboardName = dashboardName;
615
- const curSchemaData = schemaData.schema;
733
+ const curSchemaData = schemaData.schemaWithCustomFields;
616
734
  if (!query) {
617
735
  setLoadingFormData(false);
618
736
  return;
619
737
  }
620
738
  const result = await getReferencedTables(client, query, curSchemaData);
739
+ const referencedTablesWithoutStar = await getReferencedTables(client, query, curSchemaData, true);
621
740
  setDateFieldOptions(result.dateFields);
622
741
  if (result.dateFields[0] && result.dateFields[0].columns[0]) {
623
742
  setDefaultDateField({
@@ -641,6 +760,11 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
641
760
  acc[table.name] = table.columns.map((col) => col.field);
642
761
  return acc;
643
762
  }, {});
763
+ const referencedColumnsWithoutStar = referencedTablesWithoutStar.referencedTablesAndColumns.reduce((acc, table) => {
764
+ acc[table.name] = table.columns.map((col) => col.field);
765
+ return acc;
766
+ }, {});
767
+ setReferencedColumnsWithoutStar(referencedColumnsWithoutStar);
644
768
  setReferencedColumns(referencedColumns);
645
769
  setTableName(result.dateFields[0]?.name);
646
770
  const dateField = {
@@ -698,12 +822,20 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
698
822
  };
699
823
  }, [selectedPivotTable, formData.pivot]);
700
824
  const chartData = useMemo(() => {
701
- const data = createReportFromForm(formData, report ? { ...report, rowCount } : tempReport, selectedPivotTable, rows, currentDashboardFilters);
825
+ const data = createReportFromForm(formData, report ? { ...report, rowCount } : tempReport, selectedPivotTable, rows, currentDashboardFilters, referenceLineQueryResults);
702
826
  return {
703
827
  ...data,
704
828
  filterMap: canonicalFilterMap,
705
829
  };
706
830
  }, [formData, selectedPivotTable, report, rows, rowCount]);
831
+ const xAxisFormatOptions = useMemo(() => {
832
+ return chartData?.chartType === 'gauge'
833
+ ? [
834
+ { value: 'whole_number', label: 'whole number' },
835
+ { value: 'two_decimal_places', label: 'two decimal places' },
836
+ { value: 'percent', label: 'percentage' },
837
+ ] : ALL_FORMAT_OPTIONS;
838
+ }, [chartData?.chartType]);
707
839
  const fetchPivotData = async (pivot, tableInfo, uniqueValues, overrideFilters) => {
708
840
  const dashboardFilters = filtersEnabled
709
841
  ? (overrideFilters ?? currentDashboardFilters)
@@ -752,11 +884,10 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
752
884
  if (selectedPivotTable &&
753
885
  selectedPivotTable.columns &&
754
886
  formData.chartType === 'table') {
755
- console.log('selectedPivotTable', selectedPivotTable);
756
887
  const columns = selectedPivotTable.columns;
757
888
  columns.forEach((col, index) => {
758
889
  // ADD THE RIGHT FIELD TYPE FOR THE VALUE COLUMNS
759
- if ((['min', 'max'].includes(formData.pivot?.aggregations?.[0]?.aggregationType ?? '')) &&
890
+ if (['min', 'max'].includes(formData.pivot?.aggregations?.[0]?.aggregationType ?? '') &&
760
891
  index !== 0) {
761
892
  col.format = 'two_decimal_places';
762
893
  }
@@ -874,7 +1005,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
874
1005
  fetchRowCount(processing, overrideFilters);
875
1006
  if (formData.pivot) {
876
1007
  try {
877
- const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, tenants, schemaData.customFields ?? [], overrideFilters, destinationDashboard);
1008
+ const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, tenants, schemaData.customFields ?? {}, overrideFilters, destinationDashboard);
878
1009
  fetchPivotData(formData.pivot, tableInfo, uniqueValues, overrideFilters);
879
1010
  }
880
1011
  catch (e) {
@@ -1027,7 +1158,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1027
1158
  else if (field === 'dateField' &&
1028
1159
  subfield === 'table' &&
1029
1160
  !formData.dateField?.field) {
1030
- const field = schemaData.schema?.find((elem) => elem.name === value)?.columns?.[0]?.field;
1161
+ const field = schemaData.schemaWithCustomFields?.find((elem) => elem.name === value)?.columns?.[0]?.field;
1031
1162
  updatedForm.dateField = {
1032
1163
  // @ts-ignore
1033
1164
  ...updatedForm[field],
@@ -1045,6 +1176,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1045
1176
  // For simple fields
1046
1177
  updatedForm = { ...updatedForm, [fieldName]: value };
1047
1178
  }
1179
+ if (fieldName === 'chartType') {
1180
+ if (value === 'metric') {
1181
+ updatedForm.xAxisFormat = 'whole_number';
1182
+ }
1183
+ else if (value === 'gauge') {
1184
+ updatedForm.xAxisFormat = 'percent';
1185
+ }
1186
+ }
1048
1187
  let dashboardName = updatedForm.dashboardName;
1049
1188
  if (fieldName === 'dashboardName') {
1050
1189
  dashboardName = value;
@@ -1105,7 +1244,10 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1105
1244
  if (fieldName === 'columns') {
1106
1245
  setFormData({
1107
1246
  ...formData,
1108
- columns: [...formData.columns, { label: '', field: '', format: 'whole_number' }],
1247
+ columns: [
1248
+ ...formData.columns,
1249
+ { label: '', field: '', format: 'string' },
1250
+ ],
1109
1251
  });
1110
1252
  }
1111
1253
  else if (fieldName === 'yAxisFields') {
@@ -1113,7 +1255,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1113
1255
  ...formData,
1114
1256
  yAxisFields: [
1115
1257
  ...formData.yAxisFields,
1116
- { label: '', field: '', format: 'whole_number' },
1258
+ { label: '', field: '', format: 'string' },
1117
1259
  ],
1118
1260
  });
1119
1261
  }
@@ -1131,6 +1273,15 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1131
1273
  },
1132
1274
  });
1133
1275
  }
1276
+ else if (fieldName === 'referenceLines') {
1277
+ setFormData({
1278
+ ...formData,
1279
+ referenceLines: [
1280
+ ...formData.referenceLines,
1281
+ { label: '', y1: undefined, y2: undefined },
1282
+ ],
1283
+ });
1284
+ }
1134
1285
  };
1135
1286
  const handleRemoveField = (fieldName, index) => {
1136
1287
  if (fieldName === 'pivot') {
@@ -1185,24 +1336,33 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1185
1336
  pivot: formData.pivot,
1186
1337
  referencedTables: allTables,
1187
1338
  referencedColumns,
1339
+ includeCustomFields: includeCustomFields || containsCustomFields,
1188
1340
  template: tenants
1189
1341
  ? undefined
1190
1342
  : report && !isAdmin && formData.template
1191
1343
  ? false
1192
1344
  : formData.template,
1193
- reportFlags: formFlags
1194
- ? Object.fromEntries(Object.entries(formFlags)
1195
- .filter(([, value]) => value.length > 0)
1196
- .map(([key, value]) => {
1197
- return [
1198
- key,
1199
- Object.keys(allTenantMap).length > 1 &&
1200
- allTenantMap[key]?.length === value.length
1201
- ? ALL_TENANTS
1202
- : value,
1203
- ];
1204
- }))
1205
- : undefined,
1345
+ reportFlags: containsCustomFields
1346
+ ? currentTenantAsFormFlags
1347
+ : formFlags
1348
+ ? Object.fromEntries(Object.entries(formFlags)
1349
+ .filter(([, value]) => value.length > 0)
1350
+ .map(([key, value]) => {
1351
+ return [
1352
+ key,
1353
+ Object.keys(allTenantMap).length > 1 &&
1354
+ allTenantMap[key]?.length === value.length
1355
+ ? ALL_TENANTS
1356
+ : value,
1357
+ ];
1358
+ }))
1359
+ : undefined,
1360
+ referenceLines: formData.referenceLines.map((line) => {
1361
+ return {
1362
+ label: line.label,
1363
+ query: line.label === REFERENCE_LINE ? [Number(line.y1 ?? 0) || 0, Number(line.y2 ?? 0) || 0] : ''
1364
+ };
1365
+ }),
1206
1366
  };
1207
1367
  const resp = await saveReport({
1208
1368
  report: { ...newReport, rows: undefined, pivotRows: undefined }, // stop including rows in request
@@ -1281,7 +1441,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1281
1441
  // formData.chartType === 'metric'
1282
1442
  // ? 100
1283
1443
  // : `calc(${filtersEnabled ? 50 : 70}%)`,
1284
- ...(isHorizontalView && { flexGrow: formData.chartType !== 'table' ? 1 : 0 }),
1444
+ ...(isHorizontalView && { flexGrow: !['table'].includes(formData.chartType) ? 1 : 0 }),
1285
1445
  }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen }))),
1286
1446
  // Make sure to display non-pivoted table when using pivot chart
1287
1447
  (isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsxs("div", { style: {
@@ -1298,8 +1458,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1298
1458
  onFiltersEnabledChanged(hide);
1299
1459
  }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1300
1460
  width: '100%',
1301
- height: formData.chartType === 'table' ? 200 : formData.chartType === 'metric' ? 300 : 500,
1302
- flexGrow: formData.chartType !== 'table' ? 1 : 0,
1461
+ height: formData.chartType === 'table'
1462
+ ? 200
1463
+ : formData.chartType === 'metric'
1464
+ ? 300
1465
+ : formData.chartType === 'US map' || formData.chartType === 'World map'
1466
+ ? 'fit-content'
1467
+ : 500,
1468
+ flexGrow: !['table'].includes(formData.chartType) ? 1 : 0,
1303
1469
  }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen })), formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1304
1470
  onPageChange(page);
1305
1471
  setCurrentPage(page);
@@ -1333,8 +1499,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1333
1499
  onFiltersEnabledChanged(hide);
1334
1500
  }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1335
1501
  width: '100%',
1336
- height: formData.chartType === 'table' ? 200 : formData.chartType === 'metric' ? 300 : 500,
1337
- flexGrow: formData.chartType !== 'table' ? 1 : 0,
1502
+ height: formData.chartType === 'table'
1503
+ ? 200
1504
+ : formData.chartType === 'metric'
1505
+ ? 300
1506
+ : formData.chartType === 'US map' || formData.chartType === 'World map'
1507
+ ? 'fit-content'
1508
+ : 500,
1509
+ flexGrow: !['table'].includes(formData.chartType) ? 1 : 0,
1338
1510
  }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen })), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { ref: inputRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(TextInputComponent
1339
1511
  // {...autofocusRefProp}
1340
1512
  , {
@@ -1345,10 +1517,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1345
1517
  }, options: dashboardOptions.map((elem) => ({
1346
1518
  label: elem.label,
1347
1519
  value: elem.label,
1348
- })), width: 200 }) })), _jsx("div", { ref: selectRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Chart type", value: formData.chartType, onChange: (e) => handleChange(e.target.value, 'chartType'),
1349
- // filter out metric for all pivots
1350
- // filter out bar and pie for row and column pivot
1351
- options: chartTypes, width: 200 }) })] }), _jsxs("div", { style: {
1520
+ })), width: 200 }) })), _jsx("div", { ref: selectRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Chart type", value: formData.chartType, onChange: (e) => handleChange(e.target.value, 'chartType'), options: chartTypes, width: 200 }) })] }), _jsxs("div", { style: {
1352
1521
  display: 'flex',
1353
1522
  flexDirection: 'column',
1354
1523
  gap: 6,
@@ -1364,33 +1533,40 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1364
1533
  setShowPivotPopover(true);
1365
1534
  setPivotRowField(formData.pivot?.rowField);
1366
1535
  setPivotColumnField(formData.pivot?.columnField);
1367
- setPivotAggregations(formData.pivot?.aggregations ?? [{
1536
+ setPivotAggregations(formData.pivot?.aggregations ?? [
1537
+ {
1368
1538
  valueField: formData.pivot?.valueField,
1369
1539
  aggregationType: formData.pivot?.aggregationType,
1370
1540
  valueField2: formData.pivot?.valueField2,
1371
- }]);
1541
+ },
1542
+ ]);
1372
1543
  setPivotPopUpTitle('Edit pivot');
1373
1544
  }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] }), (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
1374
1545
  display: 'flex',
1375
1546
  flexDirection: 'column',
1376
1547
  }, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ?? '' }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
1377
- ? getPivotMetricOptions(formData.pivot)
1548
+ ? getPivotMetricOptions(formData.pivot, selectedPivotTable, formData.chartType)
1378
1549
  : columns.map((elem) => ({
1379
1550
  label: elem.field,
1380
1551
  value: elem.field,
1381
1552
  })), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-x-axis-label", width: 200, value: formData.xAxisLabel, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'xAxisLabel') }), _jsx(SelectComponent, { value: formData.pivot &&
1382
- isDateField(formData.pivot.rowFieldType ?? '')
1383
- ? 'pivot_date'
1553
+ isDateField(formData.xAxisField ?? '')
1554
+ ? 'string'
1384
1555
  : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
1385
- isDateField(formData.pivot.rowFieldType ?? '')
1386
- ? [{ value: 'pivot_date', label: 'date' }]
1387
- : formatOptions, width: 200, hideEmptyOption: true })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
1388
- ? formData.pivot.aggregations?.length ? disambiguatedValueField(formData.pivot) ?? 'count' : 'count'
1556
+ isDateField(formData.xAxisField ?? '')
1557
+ ? [{ value: 'string', label: 'date' }]
1558
+ : xAxisFormatOptions, width: 200, hideEmptyOption: true })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
1559
+ ? formData.pivot.aggregations?.length
1560
+ ? (disambiguatedValueField(formData.pivot) ?? 'count')
1561
+ : 'count'
1389
1562
  : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
1390
1563
  ? [
1391
1564
  {
1392
- label: `Pivot Column (${formData.pivot.aggregations?.length ? disambiguatedValueField(formData.pivot) ?? 'count' : 'count'})`,
1393
- value: formData.pivot.aggregations?.length ? disambiguatedValueField(formData.pivot) ?? 'count' : 'count',
1565
+ label: `Pivot Column (${formData.pivot.aggregations?.length ? (disambiguatedValueField(formData.pivot) ?? 'count') : 'count'})`,
1566
+ value: formData.pivot.aggregations
1567
+ ?.length
1568
+ ? (disambiguatedValueField(formData.pivot) ?? 'count')
1569
+ : 'count',
1394
1570
  },
1395
1571
  ]
1396
1572
  : columns
@@ -1401,12 +1577,20 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1401
1577
  label: elem.field,
1402
1578
  value: elem.field,
1403
1579
  })), width: 200 }), _jsx(TextInputComponent, { id: "chart-builder-y-axis-label", width: 200, value: yAxisField.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'yAxisFields.label', index) }), _jsx(SelectComponent, { value: formData.pivot
1404
- ? NUMBER_OPTIONS.find((option) => {
1580
+ ? (NUMBER_OPTIONS.find((option) => {
1405
1581
  return (option.value === yAxisField.format);
1406
- })?.value ?? NUMBER_OPTIONS[0].value
1582
+ })?.value ?? NUMBER_OPTIONS[0].value)
1407
1583
  : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
1408
1584
  ? NUMBER_OPTIONS
1409
- : formatOptions, width: 200, hideEmptyOption: true }), !formData.pivot && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), !formData.pivot && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), windowWidth < 1200 && (_jsx("div", { style: {
1585
+ : ALL_FORMAT_OPTIONS, width: 200, hideEmptyOption: true }), !formData.pivot && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), !formData.pivot && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] })), client?.featureFlags?.['referenceLines'] && (chartData.chartType === 'line' || chartData.chartType === 'column') && _jsxs("div", { children: [_jsx(SubHeaderComponent, { label: 'Reference Lines' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.referenceLines?.map((refLine, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { width: 200, value: refLine.label, onChange: (e) => handleChange(e.target.value, 'referenceLines.label', index),
1586
+ // only include numeric columns
1587
+ options: [{
1588
+ label: 'Custom Values',
1589
+ value: REFERENCE_LINE
1590
+ }].concat((selectedPivotTable?.columns ? selectedPivotTable.columns : columns).filter((c) => NUMBER_FORMAT_TYPES.includes(c.format)).map((elem) => ({
1591
+ label: elem.field,
1592
+ value: elem.field,
1593
+ }))) }), refLine.label === REFERENCE_LINE && (_jsxs(_Fragment, { children: [_jsx(TextInputComponent, { id: "chart-builder-ref-line-y1", width: 200, value: refLine.y1?.toString() ?? '', placeholder: "Start value", onChange: (e) => handleChange(e.target.value, 'referenceLines.y1', index) }), _jsx(TextInputComponent, { id: "chart-builder-ref-line-y2", width: 200, value: refLine.y2?.toString() ?? '', placeholder: "End value", onChange: (e) => handleChange(e.target.value, 'referenceLines.y2', index) })] })), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('referenceLines', index) }) })] }, 'referenceLine' + index))), _jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('referenceLines'), label: "Add line +" }) })] })] })] })), windowWidth < 1200 && (_jsx("div", { style: {
1410
1594
  width: '100%',
1411
1595
  height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
1412
1596
  flexGrow: 1,
@@ -1439,14 +1623,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1439
1623
  column.field === formData.pivot.rowField
1440
1624
  ? formData.pivot &&
1441
1625
  isDateField(formData.pivot.rowFieldType || '')
1442
- ? 'pivot_date'
1626
+ ? 'string'
1443
1627
  : 'string'
1444
1628
  : formData.pivot?.aggregationType ===
1445
1629
  'percentage'
1446
1630
  ? 'percent'
1447
1631
  : 'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
1448
1632
  ? isDateField(formData.pivot.rowFieldType || '')
1449
- ? [{ label: 'date', value: 'pivot_date' }]
1633
+ ? [{ label: 'date', value: 'string' }]
1450
1634
  : [{ label: 'string', value: 'string' }]
1451
1635
  : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
1452
1636
  : formData.columns.map((column, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: rows[0]
@@ -1457,12 +1641,17 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1457
1641
  : columns.map((elem) => ({
1458
1642
  label: elem.field,
1459
1643
  value: elem.field,
1460
- })), width: 200 }), _jsx(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), _jsx(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: formatOptions, width: 200 }), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))), _jsx("div", { children: !(
1644
+ })), width: 200 }), _jsx(TextInputComponent, { id: `chart-builder-column-label-${index}`, width: 200, value: column.label, placeholder: "Column Label", onChange: (e) => handleChange(e.target.value, 'columns.label', index) }), _jsx(SelectComponent, { value: column.format, onChange: (e) => handleChange(e.target.value, 'columns.format', index), options: ALL_FORMAT_OPTIONS, width: 200 }), _jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('columns', index) }) })] }, 'column' + index))), _jsx("div", { children: !(
1461
1645
  // hide when pivoted and chartType === 'table'
1462
1646
  (formData.pivot &&
1463
1647
  selectedPivotTable &&
1464
1648
  selectedPivotTable.columns &&
1465
- formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), isAdmin && tenants && dashboardOwner && (_jsxs("div", { style: {
1649
+ formData.chartType === 'table')) && (_jsxs("div", { style: {
1650
+ display: 'flex',
1651
+ flexDirection: 'row',
1652
+ gap: 10,
1653
+ }, children: [_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" }), isAdmin &&
1654
+ client?.featureFlags?.customFieldsEnabled && (_jsx(CheckboxComponent, { isChecked: containsCustomFields || includeCustomFields, label: "Include Custom Fields", onChange: () => setIncludeCustomFields((prev) => !prev), disabled: containsCustomFields }))] })) })] })] })), isAdmin && tenants && dashboardOwner && (_jsxs("div", { style: {
1466
1655
  display: 'flex',
1467
1656
  flexDirection: 'column',
1468
1657
  gap: 12,
@@ -1476,54 +1665,61 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1476
1665
  width: 'fit-content',
1477
1666
  gap: 12,
1478
1667
  marginBottom: 8,
1479
- }, children: [_jsxs("div", { style: {
1480
- outline: '1px solid #E7E7E7',
1481
- borderRadius: 6,
1482
- padding: 4,
1483
- display: 'flex',
1484
- flexDirection: 'row',
1485
- marginLeft: 2,
1486
- backgroundColor: '#FCFCFC',
1487
- height: 38,
1488
- width: 'fit-content',
1489
- }, children: [_jsx("button", { onClick: () => {
1490
- setCustomTenantAccess(false);
1491
- setFormFlags(undefined);
1492
- }, style: {
1493
- width: 95,
1494
- outline: !customTenantAccess
1495
- ? '1px solid #E7E7E7'
1496
- : undefined,
1497
- backgroundColor: !customTenantAccess
1498
- ? 'white'
1499
- : undefined,
1500
- // Center text vertically and horizontally
1501
- display: 'flex',
1502
- justifyContent: 'center',
1503
- alignItems: 'center',
1504
- borderRadius: 6,
1505
- fontSize: 14,
1506
- fontWeight: 500,
1507
- userSelect: 'none',
1508
- }, children: "Global" }), _jsx("button", { onClick: () => {
1509
- setCustomTenantAccess(true);
1510
- }, style: {
1511
- width: 95,
1512
- outline: customTenantAccess
1513
- ? '1px solid #E7E7E7'
1514
- : undefined,
1515
- backgroundColor: customTenantAccess
1516
- ? 'white'
1517
- : undefined,
1518
- // Center text vertically and horizontally
1519
- display: 'flex',
1520
- justifyContent: 'center',
1521
- alignItems: 'center',
1522
- borderRadius: 6,
1523
- fontSize: 14,
1524
- fontWeight: 500,
1525
- userSelect: 'none',
1526
- }, children: "Custom" })] }), client?.allTenantTypes?.length === 1 ? (_jsx(MultiSelectComponent, { value: formFlags?.[dashboardOwner.tenantField] ?? [], onChange: (e) => setFormFlags({
1668
+ }, children: [_jsx(QuillToolTip, { text: 'Tenant access is restricted to current tenant with direct custom field reference.', enabled: containsCustomFields, textStyle: {
1669
+ maxWidth: '200px',
1670
+ whiteSpace: 'normal',
1671
+ }, children: _jsxs("div", { style: {
1672
+ outline: '1px solid #E7E7E7',
1673
+ borderRadius: 6,
1674
+ padding: 4,
1675
+ display: 'flex',
1676
+ flexDirection: 'row',
1677
+ marginLeft: 2,
1678
+ backgroundColor: '#FCFCFC',
1679
+ height: 38,
1680
+ width: 'fit-content',
1681
+ }, children: [_jsx("button", { onClick: () => {
1682
+ if (!containsCustomFields) {
1683
+ setCustomTenantAccess(false);
1684
+ setFormFlags(undefined);
1685
+ }
1686
+ }, style: {
1687
+ width: 95,
1688
+ outline: !(customTenantAccess || containsCustomFields)
1689
+ ? '1px solid #E7E7E7'
1690
+ : undefined,
1691
+ backgroundColor: !(customTenantAccess || containsCustomFields)
1692
+ ? 'white'
1693
+ : undefined,
1694
+ // Center text vertically and horizontally
1695
+ display: 'flex',
1696
+ justifyContent: 'center',
1697
+ alignItems: 'center',
1698
+ borderRadius: 6,
1699
+ fontSize: 14,
1700
+ fontWeight: 500,
1701
+ userSelect: 'none',
1702
+ }, children: "Global" }), _jsx("button", { onClick: () => {
1703
+ setCustomTenantAccess(true);
1704
+ }, style: {
1705
+ width: 95,
1706
+ outline: customTenantAccess || containsCustomFields
1707
+ ? '1px solid #E7E7E7'
1708
+ : undefined,
1709
+ backgroundColor: customTenantAccess || containsCustomFields
1710
+ ? 'white'
1711
+ : undefined,
1712
+ // Center text vertically and horizontally
1713
+ display: 'flex',
1714
+ justifyContent: 'center',
1715
+ alignItems: 'center',
1716
+ borderRadius: 6,
1717
+ fontSize: 14,
1718
+ fontWeight: 500,
1719
+ userSelect: 'none',
1720
+ }, children: "Custom" })] }) }), client?.allTenantTypes?.length === 1 ? (_jsx(MultiSelectComponent, { disabled: containsCustomFields, value: containsCustomFields
1721
+ ? (currentTenantAsFormFlags?.[dashboardOwner.tenantField] ?? []) // Even though value requires string[], turns out flags can be numbers
1722
+ : (formFlags?.[dashboardOwner.tenantField] ?? []), onChange: (e) => setFormFlags({
1527
1723
  ...formFlags,
1528
1724
  [dashboardOwner.tenantField]: e.target
1529
1725
  .value,
@@ -1540,7 +1736,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1540
1736
  })) ?? []), width: 200, emptyLabel: dashboardOwner.scope === 'database'
1541
1737
  ? 'No flags supplied'
1542
1738
  : undefined, allSelectedLabel: 'All ' + dashboardOwner.name + 's', style: {
1543
- display: customTenantAccess ? 'inline' : 'none',
1739
+ display: customTenantAccess || containsCustomFields
1740
+ ? 'inline'
1741
+ : 'none',
1544
1742
  marginTop: -1,
1545
1743
  marginBottom: -4,
1546
1744
  } })) : (_jsx(QuillMultiSelectSectionList, { value: formFlags ?? {}, onChange: (e) => setFormFlags(e.target.value), options: allTenantMap, sectionHeaderMap: client?.allTenantTypes?.reduce((acc, tenantType) => {
@@ -1551,7 +1749,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1551
1749
  acc[tenantType.tenantField] = tenantType.name;
1552
1750
  return acc;
1553
1751
  }, {}) ?? {}, width: 200, allSelectedLabel: 'All ' + dashboardOwner.name + 's', style: {
1554
- display: customTenantAccess ? 'inline' : 'none',
1752
+ display: customTenantAccess || containsCustomFields
1753
+ ? 'inline'
1754
+ : 'none',
1555
1755
  marginTop: -1,
1556
1756
  marginBottom: -4,
1557
1757
  }, owner: dashboardOwner.tenantField }))] }) })] })), specificDashboardFilters.length > 0 && isAdmin && (_jsxs("div", { style: {
@@ -1596,7 +1796,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1596
1796
  ...filterMap,
1597
1797
  [filter.label]: {
1598
1798
  table: e.target.value,
1599
- field: schemaData.schema
1799
+ field: schemaData.schemaWithCustomFields
1600
1800
  .find((t) => t.name == e.target.value)
1601
1801
  ?.columns.find((elem) => elem.field ===
1602
1802
  (filterMap[filter.label]?.field ??
@@ -1617,7 +1817,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1617
1817
  filter.table,
1618
1818
  field: e.target.value,
1619
1819
  },
1620
- }), options: schemaData.schema
1820
+ }), options: schemaData.schemaWithCustomFields
1621
1821
  .find((t) => t.name ==
1622
1822
  (filterMap[filter.label]?.table ??
1623
1823
  filter.table) &&
@@ -1647,8 +1847,12 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1647
1847
  justifyContent: 'space-between',
1648
1848
  alignItems: 'center',
1649
1849
  gap: 6,
1650
- }, children: [!!filterIssues?.length &&
1651
- _jsx(ErrorMessageComponent, { errorMessage: filterIssues[0] || 'Dashbord - Report issues', containerStyle: { height: '100%' } }), _jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: 10, backgroundColor: 'white' }, children: [_jsx(SecondaryButtonComponent, { onClick: () => {
1850
+ }, children: [!!filterIssues?.length && (_jsx(ErrorMessageComponent, { errorMessage: filterIssues[0] || 'Dashbord - Report issues', containerStyle: { height: '100%' } })), _jsxs("div", { style: {
1851
+ display: 'flex',
1852
+ flexDirection: 'row',
1853
+ gap: 10,
1854
+ backgroundColor: 'white',
1855
+ }, children: [_jsx(SecondaryButtonComponent, { onClick: () => {
1652
1856
  setIsOpen(false);
1653
1857
  onDiscardChanges && onDiscardChanges();
1654
1858
  }, label: 'Discard changes' }), _jsx(ButtonComponent, { onClick: () => {