@quillsql/react 2.13.40 → 2.13.42

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 (267) 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 +30 -3
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +483 -182
  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 +95 -46
  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 +69 -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 +2 -1
  18. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  19. package/dist/cjs/ReportBuilder.js +190 -48
  20. package/dist/cjs/SQLEditor.d.ts +8 -1
  21. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  22. package/dist/cjs/SQLEditor.js +94 -10
  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 +5 -2
  66. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  67. package/dist/cjs/components/UiComponents.js +34 -7
  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/index.d.ts +1 -1
  80. package/dist/cjs/index.d.ts.map +1 -1
  81. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  82. package/dist/cjs/internals/ReportBuilder/PivotModal.js +7 -8
  83. package/dist/cjs/models/Columns.d.ts +1 -0
  84. package/dist/cjs/models/Columns.d.ts.map +1 -1
  85. package/dist/cjs/models/Filter.d.ts +20 -13
  86. package/dist/cjs/models/Filter.d.ts.map +1 -1
  87. package/dist/cjs/models/Filter.js +161 -87
  88. package/dist/cjs/models/Report.d.ts +12 -1
  89. package/dist/cjs/models/Report.d.ts.map +1 -1
  90. package/dist/cjs/models/Schema.d.ts +12 -1
  91. package/dist/cjs/models/Schema.d.ts.map +1 -1
  92. package/dist/cjs/utils/astFilterProcessing.js +22 -22
  93. package/dist/cjs/utils/astProcessing.d.ts +2 -2
  94. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  95. package/dist/cjs/utils/astProcessing.js +25 -6
  96. package/dist/cjs/utils/axisFormatter.d.ts.map +1 -1
  97. package/dist/cjs/utils/axisFormatter.js +25 -0
  98. package/dist/cjs/utils/color.d.ts +159 -0
  99. package/dist/cjs/utils/color.d.ts.map +1 -1
  100. package/dist/cjs/utils/color.js +14 -5
  101. package/dist/cjs/utils/columnProcessing.js +3 -3
  102. package/dist/cjs/utils/constants.d.ts +1 -0
  103. package/dist/cjs/utils/constants.d.ts.map +1 -1
  104. package/dist/cjs/utils/constants.js +2 -1
  105. package/dist/cjs/utils/dashboard.d.ts +14 -3
  106. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  107. package/dist/cjs/utils/dashboard.js +79 -16
  108. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  109. package/dist/cjs/utils/dataFetcher.js +3 -1
  110. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  111. package/dist/cjs/utils/filterProcessing.js +9 -9
  112. package/dist/cjs/utils/getDomain.d.ts +4 -1
  113. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  114. package/dist/cjs/utils/getDomain.js +11 -1
  115. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  116. package/dist/cjs/utils/pivotConstructor.js +9 -6
  117. package/dist/cjs/utils/queryConstructor.d.ts +1 -1
  118. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  119. package/dist/cjs/utils/queryConstructor.js +83 -49
  120. package/dist/cjs/utils/report.d.ts +23 -5
  121. package/dist/cjs/utils/report.d.ts.map +1 -1
  122. package/dist/cjs/utils/report.js +36 -14
  123. package/dist/cjs/utils/schema.d.ts +28 -3
  124. package/dist/cjs/utils/schema.d.ts.map +1 -1
  125. package/dist/cjs/utils/schema.js +79 -43
  126. package/dist/cjs/utils/tableProcessing.d.ts +12 -3
  127. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  128. package/dist/cjs/utils/tableProcessing.js +36 -8
  129. package/dist/cjs/utils/textProcessing.d.ts.map +1 -1
  130. package/dist/cjs/utils/textProcessing.js +0 -1
  131. package/dist/cjs/utils/valueFormatter.d.ts +1 -0
  132. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  133. package/dist/cjs/utils/valueFormatter.js +55 -1
  134. package/dist/esm/Chart.d.ts +5 -1
  135. package/dist/esm/Chart.d.ts.map +1 -1
  136. package/dist/esm/Chart.js +52 -29
  137. package/dist/esm/ChartBuilder.d.ts +30 -3
  138. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  139. package/dist/esm/ChartBuilder.js +487 -187
  140. package/dist/esm/ChartEditor.d.ts.map +1 -1
  141. package/dist/esm/ChartEditor.js +11 -1
  142. package/dist/esm/Context.d.ts +16 -4
  143. package/dist/esm/Context.d.ts.map +1 -1
  144. package/dist/esm/Context.js +97 -48
  145. package/dist/esm/Dashboard.d.ts +6 -3
  146. package/dist/esm/Dashboard.d.ts.map +1 -1
  147. package/dist/esm/Dashboard.js +70 -29
  148. package/dist/esm/QuillProvider.d.ts +4 -8
  149. package/dist/esm/QuillProvider.d.ts.map +1 -1
  150. package/dist/esm/ReportBuilder.d.ts +2 -1
  151. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  152. package/dist/esm/ReportBuilder.js +192 -50
  153. package/dist/esm/SQLEditor.d.ts +8 -1
  154. package/dist/esm/SQLEditor.d.ts.map +1 -1
  155. package/dist/esm/SQLEditor.js +95 -11
  156. package/dist/esm/Table.d.ts +21 -1
  157. package/dist/esm/Table.d.ts.map +1 -1
  158. package/dist/esm/Table.js +34 -196
  159. package/dist/esm/components/Chart/BarChart.d.ts +5 -1
  160. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  161. package/dist/esm/components/Chart/BarChart.js +5 -4
  162. package/dist/esm/components/Chart/CustomReferenceLine.d.ts +2 -0
  163. package/dist/esm/components/Chart/CustomReferenceLine.d.ts.map +1 -0
  164. package/dist/esm/components/Chart/CustomReferenceLine.js +23 -0
  165. package/dist/esm/components/Chart/GaugeChart.d.ts +11 -0
  166. package/dist/esm/components/Chart/GaugeChart.d.ts.map +1 -0
  167. package/dist/esm/components/Chart/GaugeChart.js +195 -0
  168. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  169. package/dist/esm/components/Chart/InternalChart.js +14 -11
  170. package/dist/esm/components/Chart/LineChart.d.ts +5 -1
  171. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  172. package/dist/esm/components/Chart/LineChart.js +5 -4
  173. package/dist/esm/components/Chart/MapChart.d.ts +36 -0
  174. package/dist/esm/components/Chart/MapChart.d.ts.map +1 -0
  175. package/dist/esm/components/Chart/MapChart.js +541 -0
  176. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  177. package/dist/esm/components/Dashboard/DataLoader.js +114 -42
  178. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  179. package/dist/esm/components/Dashboard/MetricComponent.js +57 -54
  180. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  181. package/dist/esm/components/Dashboard/TableComponent.js +5 -1
  182. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  183. package/dist/esm/components/QuillMultiSelectWithCombo.js +5 -4
  184. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
  185. package/dist/esm/components/QuillSelectWithCombo.js +12 -11
  186. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  187. package/dist/esm/components/ReportBuilder/AddColumnModal.js +2 -1
  188. package/dist/esm/components/ReportBuilder/FilterModal.js +14 -14
  189. package/dist/esm/components/ReportBuilder/FilterStack.d.ts +2 -1
  190. package/dist/esm/components/ReportBuilder/FilterStack.d.ts.map +1 -1
  191. package/dist/esm/components/ReportBuilder/FilterStack.js +4 -4
  192. package/dist/esm/components/ReportBuilder/convert.d.ts +2 -0
  193. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  194. package/dist/esm/components/ReportBuilder/convert.js +26 -7
  195. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  196. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  197. package/dist/esm/components/ReportBuilder/util.js +15 -2
  198. package/dist/esm/components/UiComponents.d.ts +5 -2
  199. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  200. package/dist/esm/components/UiComponents.js +32 -6
  201. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  202. package/dist/esm/hooks/useDashboard.js +11 -9
  203. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  204. package/dist/esm/hooks/useExport.js +19 -5
  205. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  206. package/dist/esm/hooks/useQuill.js +16 -3
  207. package/dist/esm/hooks/useReport.d.ts.map +1 -1
  208. package/dist/esm/hooks/useReport.js +1 -7
  209. package/dist/esm/hooks/useVirtualTables.d.ts +6 -2
  210. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  211. package/dist/esm/hooks/useVirtualTables.js +6 -3
  212. package/dist/esm/index.d.ts +1 -1
  213. package/dist/esm/index.d.ts.map +1 -1
  214. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  215. package/dist/esm/internals/ReportBuilder/PivotModal.js +7 -8
  216. package/dist/esm/models/Columns.d.ts +1 -0
  217. package/dist/esm/models/Columns.d.ts.map +1 -1
  218. package/dist/esm/models/Filter.d.ts +20 -13
  219. package/dist/esm/models/Filter.d.ts.map +1 -1
  220. package/dist/esm/models/Filter.js +160 -86
  221. package/dist/esm/models/Report.d.ts +12 -1
  222. package/dist/esm/models/Report.d.ts.map +1 -1
  223. package/dist/esm/models/Schema.d.ts +12 -1
  224. package/dist/esm/models/Schema.d.ts.map +1 -1
  225. package/dist/esm/utils/astFilterProcessing.js +23 -23
  226. package/dist/esm/utils/astProcessing.d.ts +2 -2
  227. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  228. package/dist/esm/utils/astProcessing.js +25 -6
  229. package/dist/esm/utils/axisFormatter.d.ts.map +1 -1
  230. package/dist/esm/utils/axisFormatter.js +25 -0
  231. package/dist/esm/utils/color.d.ts +159 -0
  232. package/dist/esm/utils/color.d.ts.map +1 -1
  233. package/dist/esm/utils/color.js +8 -2
  234. package/dist/esm/utils/columnProcessing.js +3 -3
  235. package/dist/esm/utils/constants.d.ts +1 -0
  236. package/dist/esm/utils/constants.d.ts.map +1 -1
  237. package/dist/esm/utils/constants.js +1 -0
  238. package/dist/esm/utils/dashboard.d.ts +14 -3
  239. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  240. package/dist/esm/utils/dashboard.js +80 -17
  241. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  242. package/dist/esm/utils/dataFetcher.js +3 -1
  243. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  244. package/dist/esm/utils/filterProcessing.js +10 -10
  245. package/dist/esm/utils/getDomain.d.ts +4 -1
  246. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  247. package/dist/esm/utils/getDomain.js +11 -1
  248. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  249. package/dist/esm/utils/pivotConstructor.js +9 -6
  250. package/dist/esm/utils/queryConstructor.d.ts +1 -1
  251. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  252. package/dist/esm/utils/queryConstructor.js +83 -49
  253. package/dist/esm/utils/report.d.ts +23 -5
  254. package/dist/esm/utils/report.d.ts.map +1 -1
  255. package/dist/esm/utils/report.js +38 -16
  256. package/dist/esm/utils/schema.d.ts +28 -3
  257. package/dist/esm/utils/schema.d.ts.map +1 -1
  258. package/dist/esm/utils/schema.js +78 -43
  259. package/dist/esm/utils/tableProcessing.d.ts +12 -3
  260. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  261. package/dist/esm/utils/tableProcessing.js +36 -8
  262. package/dist/esm/utils/textProcessing.d.ts.map +1 -1
  263. package/dist/esm/utils/textProcessing.js +0 -1
  264. package/dist/esm/utils/valueFormatter.d.ts +1 -0
  265. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  266. package/dist/esm/utils/valueFormatter.js +53 -0
  267. package/package.json +10 -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 { quillAutoFormat, 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,19 @@ 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 = [
31
+ 'column',
32
+ 'line',
33
+ 'table',
34
+ 'metric',
35
+ 'gauge',
36
+ 'bar',
37
+ 'pie',
38
+ 'US map',
39
+ 'World map',
40
+ ];
31
41
  const CHART_TO_LABELS = {
32
42
  column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
33
43
  line: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
@@ -35,8 +45,19 @@ const CHART_TO_LABELS = {
35
45
  metric: { xAxisLabel: 'Value' },
36
46
  bar: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
37
47
  pie: { xAxisLabel: 'Category', yAxisLabel: 'Count' },
48
+ 'US map': { xAxisLabel: 'State', yAxisLabel: 'Value' },
49
+ 'World map': { xAxisLabel: 'Country', yAxisLabel: 'Value' },
50
+ gauge: { xAxisLabel: 'Value' },
38
51
  };
39
- function getPivotMetricOptions(pivot) {
52
+ function getPivotMetricOptions(pivot, selectedPivotTable, chartType) {
53
+ if (['metric', 'gauge'].includes(chartType) && selectedPivotTable) {
54
+ return selectedPivotTable.columns.map((elem) => ({
55
+ label: elem.field === pivot?.rowField
56
+ ? `Pivot Row (${elem.field})`
57
+ : elem.field,
58
+ value: elem.field,
59
+ }));
60
+ }
40
61
  if (!pivot.rowField) {
41
62
  const valueField = disambiguatedValueField(pivot);
42
63
  return [
@@ -75,17 +96,26 @@ export function createInitialFormData(columns) {
75
96
  chartType: firstNumberColumn ? 'line' : 'table',
76
97
  pivot: null,
77
98
  template: true,
99
+ referenceLines: [],
78
100
  };
79
101
  return formEmptyState;
80
102
  }
81
103
  function getChartTypeOptions(formData, dashboard) {
82
104
  let viableCharts = CHART_TYPES;
83
105
  if (dashboard && dashboard.dateFilter && dashboard.dateFilter.comparison) {
84
- viableCharts = viableCharts.filter((chart) => !['table', 'metric', 'bar', 'pie'].includes(chart));
106
+ viableCharts = viableCharts.filter((chart) => ![
107
+ 'table',
108
+ 'metric',
109
+ 'gauge',
110
+ 'bar',
111
+ 'pie',
112
+ 'US map',
113
+ 'World map',
114
+ ].includes(chart));
85
115
  }
86
116
  if (formData.pivot && !formData.pivot.rowField) {
87
117
  return viableCharts
88
- .filter((elem) => elem === 'metric' || elem === 'table')
118
+ .filter((elem) => ['table', 'metric', 'gauge'].includes(elem))
89
119
  .map((elem) => ({
90
120
  label: elem,
91
121
  value: elem,
@@ -93,14 +123,16 @@ function getChartTypeOptions(formData, dashboard) {
93
123
  }
94
124
  else {
95
125
  return viableCharts
96
- .filter((elem) => !((formData.pivot && elem === 'metric') ||
97
- (formData.pivot &&
98
- formData.pivot.columnField &&
99
- (elem === 'bar' || elem === 'pie'))))
126
+ .filter((elem) => !(formData.pivot &&
127
+ formData.pivot.columnField &&
128
+ (elem === 'bar' ||
129
+ elem === 'pie' ||
130
+ elem === 'US map' ||
131
+ elem === 'World map')))
100
132
  .map((elem) => ({ label: elem, value: elem }));
101
133
  }
102
134
  }
103
- function createReportFromForm(formData, report, selectedPivotTable, rows = [], filtersApplied = []) {
135
+ export function createReportFromForm(formData, report, selectedPivotTable, rows = [], filtersApplied = [], referenceLineQueryResults) {
104
136
  const newReport = convertInternalReportToReport(mergeComparisonRange({
105
137
  ...formData,
106
138
  dashboardName: formData.dashboardName || '',
@@ -120,6 +152,18 @@ function createReportFromForm(formData, report, selectedPivotTable, rows = [], f
120
152
  pivotColumns: selectedPivotTable?.columns ?? undefined,
121
153
  pivotRows: selectedPivotTable?.rows ?? undefined,
122
154
  columnInternal: report?.columnInternal ?? [],
155
+ referenceLines: formData.referenceLines?.map((elem) => ({
156
+ label: elem.label,
157
+ query: elem.label === REFERENCE_LINE
158
+ ? [Number(elem.y1) || 0, Number(elem.y2) || 0]
159
+ : elem.label,
160
+ })) || [],
161
+ referenceLineYValues: formData.referenceLines?.map((elem, index) => ({
162
+ label: elem.label,
163
+ query: elem.label === REFERENCE_LINE
164
+ ? [Number(elem.y1) || 0, Number(elem.y2) || 0]
165
+ : referenceLineQueryResults?.[index],
166
+ })) || [],
123
167
  }), filtersApplied);
124
168
  return newReport;
125
169
  }
@@ -155,7 +199,7 @@ const DATE_OPTIONS = [
155
199
  { value: 'MMM_dd_hh:mm_ap_pm', label: 'day and time' },
156
200
  { value: 'hh_ap_pm', label: 'hour' },
157
201
  ];
158
- const formatOptions = [
202
+ const ALL_FORMAT_OPTIONS = [
159
203
  ...NUMBER_OPTIONS,
160
204
  ...DATE_OPTIONS,
161
205
  { value: 'string', label: 'string' },
@@ -238,9 +282,9 @@ export function ChartBuilderWithModal(props) {
238
282
  */
239
283
  export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent,
240
284
  // 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,
285
+ 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, hidePivotForm = false, onAddToDashboardComplete, onDelete, onDiscardChanges, reportId, tempReport, recommendedPivots: rp = [], createdPivots: cp = [], dateColumn, buttonLabel, organizationName, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, showTableFormatOptions, initialUniqueValues, initialUniqueValuesIsLoading, pivotRecommendationsEnabled = true, hideTableView = false, hideChartView = false, hideChartType = false, hideDiscardChanges = false, filtersEnabled, onFiltersEnabledChanged,
242
286
  // isLoading,
243
- onClickChartElement, isEditingMode = false, disableSort = true, }) {
287
+ destinationDashboard, onClickChartElement, isEditingMode = false, disableSort = true, }) {
244
288
  const [client] = useContext(ClientContext);
245
289
  const [theme] = useContext(ThemeContext);
246
290
  const [schemaData] = useContext(SchemaDataContext);
@@ -264,14 +308,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
264
308
  const inputRef = useRef(null);
265
309
  const selectRef = useRef(null);
266
310
  const processColumns = (columns) => {
267
- if (schemaData.schema) {
311
+ if (schemaData.schemaWithCustomFields) {
268
312
  const newProcessedColumns = columns?.map((col) => {
269
313
  if (col.jsType) {
270
314
  return col;
271
315
  }
272
316
  const newCol = { ...col };
273
317
  let foundColumn;
274
- schemaData.schema.forEach((table) => {
318
+ schemaData.schemaWithCustomFields.forEach((table) => {
275
319
  if (table.columns) {
276
320
  const matchedColumn = table.columns.find((c) => c.field === col.field);
277
321
  if (matchedColumn) {
@@ -356,6 +400,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
356
400
  const [isEdittingPivot, setIsEdittingPivot] = useState(false);
357
401
  const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
358
402
  const [tableName, setTableName] = useState(undefined);
403
+ const [includeCustomFields, setIncludeCustomFields] = useState(report
404
+ ? !!report.includeCustomFields
405
+ : !!client?.featureFlags?.customFieldsEnabled);
359
406
  const selectedTable = schemaData.schema?.find((t) => t.displayName === tableName);
360
407
  const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
361
408
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -370,7 +417,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
370
417
  }
371
418
  : undefined;
372
419
  const columns = report?.columnInternal ?? [];
373
- const destinationDashboard = report?.dashboardName;
420
+ const destinationDashboardName = destinationDashboard || report?.dashboardName;
374
421
  const query = report?.queryString;
375
422
  const [loadingFormData, setLoadingFormData] = useState(false);
376
423
  const [triggeredEditChart, setTriggeredEditChart] = useState(false);
@@ -378,11 +425,13 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
378
425
  const [recommendedPivots, setRecommendedPivots] = useState(rp);
379
426
  const [pivotRowField, setPivotRowField] = useState(report?.pivot?.rowField);
380
427
  const [pivotColumnField, setPivotColumnField] = useState(report?.pivot?.columnField);
381
- const [pivotAggregations, setPivotAggregations] = useState(report?.pivot?.aggregations ?? [{
428
+ const [pivotAggregations, setPivotAggregations] = useState(report?.pivot?.aggregations ?? [
429
+ {
382
430
  valueField: report?.pivot?.valueField,
383
431
  valueField2: report?.pivot?.valueField2,
384
- aggregationType: report?.pivot?.aggregationType
385
- }]);
432
+ aggregationType: report?.pivot?.aggregationType,
433
+ },
434
+ ]);
386
435
  const baseProcessing = {
387
436
  page: report?.pagination ?? {
388
437
  page: 0,
@@ -397,6 +446,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
397
446
  const [allTables, setAllTables] = useState([]);
398
447
  const [customFieldTableRef, setCustomFieldTableRef] = useState(false);
399
448
  const [referencedColumns, setReferencedColumns] = useState({});
449
+ const [referencedColumnsWithoutStar, setReferencedColumnsWithoutStar] = useState({});
400
450
  const [filterMap, setFilterMap] = useState(report?.filterMap ?? {});
401
451
  const canonicalFilterMap = useMemo(() => {
402
452
  return Object.fromEntries(Object.entries(filterMap).filter((f) => f[1].table !== undefined && f[1].field !== undefined));
@@ -409,7 +459,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
409
459
  }
410
460
  acc[filter.label] =
411
461
  !!allTables.find((table) => table === (filterMap[filter.label] ?? filter).table) &&
412
- !!schemaData.schema
462
+ !!schemaData.schemaWithCustomFields
413
463
  ?.find((table) => {
414
464
  return (table.displayName === (filterMap[filter.label] ?? filter).table);
415
465
  })
@@ -453,6 +503,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
453
503
  pivot: null,
454
504
  dateField: defaultDateField,
455
505
  template: true,
506
+ referenceLines: [],
456
507
  };
457
508
  const updateDashboardFilters = async (dashboardName) => {
458
509
  if (dashboardConfig && dashboardConfig[dashboardName]) {
@@ -493,8 +544,8 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
493
544
  const pivotFormData = (pivot) => {
494
545
  const yAxisField = pivot.columnField ?? disambiguatedValueField(pivot) ?? '';
495
546
  const yAxisLabel = report?.yAxisFields && report?.yAxisFields?.length > 0
496
- ? report.yAxisFields[0]?.label ?? ''
497
- : disambiguatedValueField(pivot) ?? '';
547
+ ? (report.yAxisFields[0]?.label ?? '')
548
+ : (disambiguatedValueField(pivot) ?? '');
498
549
  // date labels for pivots should be treated like strings since they are
499
550
  const yAxisIsDate = pivot.columnField
500
551
  ? isDateField(pivot.columnFieldType ?? '')
@@ -503,12 +554,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
503
554
  const result = {
504
555
  pivot,
505
556
  chartType: chartType,
506
- xAxisField: pivot.rowField ? pivot.rowField : disambiguatedValueField(pivot),
507
- xAxisFormat: isDateField(pivot.rowFieldType ?? '')
557
+ xAxisField: pivot.rowField
558
+ ? pivot.rowField
559
+ : disambiguatedValueField(pivot),
560
+ xAxisFormat: isDateType(pivot.rowFieldType ?? '')
508
561
  ? 'string'
509
- : report?.columns.find((col) => col.field === pivot.rowField)?.format ||
510
- report?.xAxisFormat ||
511
- 'whole_number',
562
+ : isNumberType(pivot.rowFieldType ?? '')
563
+ ? 'whole_number'
564
+ : 'string',
512
565
  xAxisLabel: report?.xAxisLabel || pivot.rowField,
513
566
  yAxisFields: [
514
567
  {
@@ -517,43 +570,71 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
517
570
  format: yAxisIsDate
518
571
  ? 'string'
519
572
  : 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',
573
+ ? (report?.yAxisFields[0]?.format ?? 'whole_number')
574
+ : (report?.columns.find((col) => col.field === disambiguatedValueField(pivot))?.format ?? 'whole_number'),
523
575
  },
524
576
  ],
525
577
  };
526
578
  return result;
527
579
  };
528
- const getReferencedTables = async (client, sqlQuery, dbTables) => {
580
+ const getReferencedTables = async (client, sqlQuery, dbTables, skipStar) => {
529
581
  const resp = await getDataFromCloud(client, `astify`, {
530
582
  query: sqlQuery,
531
583
  publicKey: client.publicKey,
532
584
  useNewNodeSql: true,
533
585
  });
534
586
  if (resp.success === false) {
535
- return getTablesHelper(getSelectFromAST({}), dbTables);
587
+ return getTablesHelper(getSelectFromAST({}), dbTables, skipStar);
536
588
  }
537
- return getTablesHelper(getSelectFromAST(resp.ast), dbTables);
589
+ return getTablesHelper(getSelectFromAST(resp.ast), dbTables, skipStar);
538
590
  };
539
591
  const formFormDataFromReport = (report) => {
540
- let pivotData = {};
592
+ // let pivotData = {};
541
593
  let dateField = defaultDateField;
542
- if (report?.pivot) {
543
- pivotData = pivotFormData(report.pivot);
544
- }
594
+ // if (report?.pivot) {
595
+ // pivotData = pivotFormData(report.pivot);
596
+ // }
545
597
  if (report) {
546
598
  dateField = report.dateField || defaultDateField;
547
599
  }
548
600
  return {
549
601
  ...formEmptyState,
550
602
  ...report,
551
- ...pivotData,
552
- ...(report?.dashboardName && { dashboardName: report?.dashboardName }),
603
+ // ...pivotData,
553
604
  dateField: dateField,
605
+ referenceLines: report?.referenceLines
606
+ ? report.referenceLines?.map(({ label, query }) => {
607
+ if (typeof query === 'string') {
608
+ return { label, y1: undefined, y2: undefined };
609
+ }
610
+ return {
611
+ label,
612
+ y1: query[0],
613
+ y2: query[1],
614
+ };
615
+ })
616
+ : [],
554
617
  };
555
618
  };
556
619
  const [formData, setFormData] = useState(formFormDataFromReport(report));
620
+ const reportCustomFields = useMemo(() => {
621
+ return (report?.columnsWithCustomFields?.filter((col) => !report?.columns?.some((c) => col.field === c.field)) ?? []);
622
+ }, [report?.columnsWithCustomFields, report?.columns]);
623
+ const referenceLineQueryResults = useMemo(() => {
624
+ return formData?.referenceLines?.map((line) => {
625
+ if (line.label === REFERENCE_LINE) {
626
+ return [Number(line.y1) || 0, Number(line.y2) || 0];
627
+ }
628
+ // line.label is a field
629
+ // Get the first and last row of the field
630
+ const field = formData.columns.find((col) => col.field === line.label);
631
+ if (!field) {
632
+ return [0, 0];
633
+ }
634
+ // return [Number(rows[0]?.[field.field]) || 0, Number(rows[rows.length - 1]?.[field.field]) || 0];
635
+ return (pivotData?.rows ? pivotData.rows : rows).map((row) => Number(row[field.field]) || 0);
636
+ });
637
+ }, [formData?.referenceLines]);
557
638
  const currentDashboard = useMemo(() => {
558
639
  return dashboardConfig[formData.dashboardName ?? report?.dashboardName ?? '']?.config;
559
640
  }, [dashboardConfig, formData.dashboardName, report?.dashboardName]);
@@ -561,6 +642,19 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
561
642
  return (currentDashboard?.tenantKeys?.map((tenantKey) => client?.allTenantTypes?.find((t) => t.tenantField === tenantKey)) ?? []);
562
643
  }, [client?.allTenantTypes, currentDashboard?.tenantKeys]);
563
644
  const dashboardOwner = currentDashboardTenants?.[0];
645
+ const currentTenantAsFormFlags = useMemo(() => {
646
+ if (!tenants || !tenants.length) {
647
+ return undefined;
648
+ }
649
+ const tenantField = typeof tenants[0] !== 'object'
650
+ ? dashboardOwner?.name
651
+ : tenants[0]?.tenantField;
652
+ if (!tenantField) {
653
+ return undefined;
654
+ }
655
+ const tenantIds = typeof tenants[0] !== 'object' ? tenants : tenants[0]?.tenantIds;
656
+ return { [tenantField]: tenantIds };
657
+ }, [tenants, dashboardOwner]);
564
658
  const invalidColumns = useMemo(() => {
565
659
  if (!rows || !rows.length) {
566
660
  return [];
@@ -575,6 +669,62 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
575
669
  const data = formFormDataFromReport(report);
576
670
  return getChartTypeOptions(data, dashboardConfig[data.dashboardName || '']);
577
671
  })());
672
+ const reportContainsCustomFields = useMemo(() => {
673
+ // Check whether report query contains custom fields
674
+ const customFieldsMap = schemaData.customFields;
675
+ const reportQueryContainsCustomFields = allTables.some((table) => {
676
+ const tableColumns = referencedColumnsWithoutStar[table] ?? [];
677
+ const customFieldColumns = customFieldsMap?.[table] ?? [];
678
+ return tableColumns.some((column) => customFieldColumns.some((field) => field.field === column));
679
+ });
680
+ return reportQueryContainsCustomFields;
681
+ }, [allTables, referencedColumnsWithoutStar]);
682
+ const chartBuilderFormDataContainsCustomFields = useMemo(() => {
683
+ const customFields = allTables
684
+ .map((table) => schemaData.customFields?.[table] ?? [])
685
+ .flat();
686
+ const customFieldsMap = schemaData.customFields;
687
+ const pivotContainsCustomFields = customFields.some((field) => field.field === formData.pivot?.columnField ||
688
+ field.field === formData.pivot?.rowField ||
689
+ field.field === formData.pivot?.valueField);
690
+ const xAxisFieldContainsCustomFields = customFields.some((field) => field.field === formData.xAxisField);
691
+ const yAxisFieldsContainsCustomFields = formData.yAxisFields.some((yAxisField) => {
692
+ return customFields.some((field) => field.field === yAxisField.field);
693
+ });
694
+ const dateFieldContainsCustomFields = customFields.some((field) => field.field === formData.dateField?.field);
695
+ const canonicalFilterMapContainsCustomFields = Object.values(canonicalFilterMap).some((filter) => {
696
+ return customFieldsMap?.[filter.table || '']?.some((field) => field.field === filter.field);
697
+ });
698
+ return (pivotContainsCustomFields ||
699
+ xAxisFieldContainsCustomFields ||
700
+ yAxisFieldsContainsCustomFields ||
701
+ dateFieldContainsCustomFields ||
702
+ canonicalFilterMapContainsCustomFields);
703
+ }, [
704
+ allTables,
705
+ formData.pivot,
706
+ formData.xAxisField,
707
+ formData.yAxisFields,
708
+ formData.dateField,
709
+ canonicalFilterMap,
710
+ ]);
711
+ const customFieldsInTabularColumns = useMemo(() => {
712
+ const customFields = allTables
713
+ .map((table) => schemaData.customFields?.[table] ?? [])
714
+ .flat();
715
+ return formData.columns.some((col) => {
716
+ return customFields.some((field) => field.field === col.field);
717
+ });
718
+ }, [allTables, formData.columns]);
719
+ const containsCustomFields = useMemo(() => {
720
+ return (reportContainsCustomFields ||
721
+ customFieldsInTabularColumns ||
722
+ chartBuilderFormDataContainsCustomFields);
723
+ }, [
724
+ reportContainsCustomFields,
725
+ customFieldsInTabularColumns,
726
+ chartBuilderFormDataContainsCustomFields,
727
+ ]);
578
728
  useEffect(() => {
579
729
  if (!loadingFormData && triggeredEditChart) {
580
730
  editChart();
@@ -600,24 +750,25 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
600
750
  { label: 'New - Dashboard', value: 'New - Dashboard' },
601
751
  ];
602
752
  }
603
- if (destinationDashboard) {
753
+ if (destinationDashboardName) {
604
754
  dashboardOptions = [
605
- { label: destinationDashboard, value: destinationDashboard },
755
+ { label: destinationDashboardName, value: destinationDashboardName },
606
756
  ];
607
757
  }
608
758
  let dashboardName = report?.dashboardName ?? dashboardOptions[0]?.label ?? '';
609
- if (destinationDashboard) {
610
- dashboardName = destinationDashboard;
759
+ if (destinationDashboardName) {
760
+ dashboardName = destinationDashboardName;
611
761
  }
612
762
  const curDashboard = await updateDashboardFilters(dashboardName);
613
763
  setDashboardOptions(dashboardOptions);
614
764
  curFormData.dashboardName = dashboardName;
615
- const curSchemaData = schemaData.schema;
765
+ const curSchemaData = schemaData.schemaWithCustomFields;
616
766
  if (!query) {
617
767
  setLoadingFormData(false);
618
768
  return;
619
769
  }
620
770
  const result = await getReferencedTables(client, query, curSchemaData);
771
+ const referencedTablesWithoutStar = await getReferencedTables(client, query, curSchemaData, true);
621
772
  setDateFieldOptions(result.dateFields);
622
773
  if (result.dateFields[0] && result.dateFields[0].columns[0]) {
623
774
  setDefaultDateField({
@@ -641,6 +792,11 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
641
792
  acc[table.name] = table.columns.map((col) => col.field);
642
793
  return acc;
643
794
  }, {});
795
+ const referencedColumnsWithoutStar = referencedTablesWithoutStar.referencedTablesAndColumns.reduce((acc, table) => {
796
+ acc[table.name] = table.columns.map((col) => col.field);
797
+ return acc;
798
+ }, {});
799
+ setReferencedColumnsWithoutStar(referencedColumnsWithoutStar);
644
800
  setReferencedColumns(referencedColumns);
645
801
  setTableName(result.dateFields[0]?.name);
646
802
  const dateField = {
@@ -698,12 +854,21 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
698
854
  };
699
855
  }, [selectedPivotTable, formData.pivot]);
700
856
  const chartData = useMemo(() => {
701
- const data = createReportFromForm(formData, report ? { ...report, rowCount } : tempReport, selectedPivotTable, rows, currentDashboardFilters);
857
+ const data = createReportFromForm(formData, report ? { ...report, rowCount } : tempReport, selectedPivotTable, rows, currentDashboardFilters, referenceLineQueryResults);
702
858
  return {
703
859
  ...data,
704
860
  filterMap: canonicalFilterMap,
705
861
  };
706
862
  }, [formData, selectedPivotTable, report, rows, rowCount]);
863
+ const xAxisFormatOptions = useMemo(() => {
864
+ return chartData?.chartType === 'gauge'
865
+ ? [
866
+ { value: 'whole_number', label: 'whole number' },
867
+ { value: 'two_decimal_places', label: 'two decimal places' },
868
+ { value: 'percent', label: 'percentage' },
869
+ ]
870
+ : ALL_FORMAT_OPTIONS;
871
+ }, [chartData?.chartType]);
707
872
  const fetchPivotData = async (pivot, tableInfo, uniqueValues, overrideFilters) => {
708
873
  const dashboardFilters = filtersEnabled
709
874
  ? (overrideFilters ?? currentDashboardFilters)
@@ -731,7 +896,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
731
896
  : undefined,
732
897
  client,
733
898
  uniqueValues,
734
- dashboardName: destinationDashboard,
899
+ dashboardName: destinationDashboardName,
735
900
  tenants,
736
901
  additionalProcessing: baseProcessing,
737
902
  });
@@ -752,11 +917,10 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
752
917
  if (selectedPivotTable &&
753
918
  selectedPivotTable.columns &&
754
919
  formData.chartType === 'table') {
755
- console.log('selectedPivotTable', selectedPivotTable);
756
920
  const columns = selectedPivotTable.columns;
757
921
  columns.forEach((col, index) => {
758
922
  // ADD THE RIGHT FIELD TYPE FOR THE VALUE COLUMNS
759
- if ((['min', 'max'].includes(formData.pivot?.aggregations?.[0]?.aggregationType ?? '')) &&
923
+ if (['min', 'max'].includes(formData.pivot?.aggregations?.[0]?.aggregationType ?? '') &&
760
924
  index !== 0) {
761
925
  col.format = 'two_decimal_places';
762
926
  }
@@ -777,12 +941,17 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
777
941
  if (!rows)
778
942
  return [];
779
943
  return rows.map((row) => {
780
- return formData.columns.reduce((formattedRow, column) => {
944
+ const columns = formData.includeCustomFields && !containsCustomFields
945
+ ? formData.columns.concat(reportCustomFields)
946
+ : formData.columns;
947
+ return columns.reduce((formattedRow, column) => {
781
948
  // Apply the format function to each field in the row
782
- const formattedValue = quillFormat({
783
- value: row[column.field],
784
- format: column.format,
785
- });
949
+ const formattedValue = column.inferFormat
950
+ ? quillAutoFormat(row[column.field])
951
+ : quillFormat({
952
+ value: row[column.field],
953
+ format: column.format,
954
+ });
786
955
  formattedRow[column.field] = formattedValue;
787
956
  return formattedRow;
788
957
  }, {});
@@ -813,7 +982,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
813
982
  rowsOnly: false,
814
983
  rowCountOnly: true,
815
984
  filterMap: canonicalFilterMap,
816
- dashboardName: destinationDashboard,
985
+ dashboardName: destinationDashboardName,
817
986
  });
818
987
  if (tableInfo.rowCount !== undefined) {
819
988
  setRowCount(tableInfo.rowCount);
@@ -865,7 +1034,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
865
1034
  rowsOnly: true,
866
1035
  rowCountOnly: false,
867
1036
  filterMap: canonicalFilterMap,
868
- dashboardName: destinationDashboard,
1037
+ dashboardName: destinationDashboardName,
869
1038
  });
870
1039
  setCurrentProcessing(processing);
871
1040
  setRows(tableInfo.rows);
@@ -874,7 +1043,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
874
1043
  fetchRowCount(processing, overrideFilters);
875
1044
  if (formData.pivot) {
876
1045
  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);
1046
+ const uniqueValues = await getUniqueValuesByColumns(tableInfo.columns.filter((column) => column.field === formData.pivot?.columnField), report.queryString, tableInfo.rows, client, tenants, schemaData.customFields ?? {}, overrideFilters, destinationDashboardName);
878
1047
  fetchPivotData(formData.pivot, tableInfo, uniqueValues, overrideFilters);
879
1048
  }
880
1049
  catch (e) {
@@ -941,7 +1110,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
941
1110
  rowsOnly: false,
942
1111
  rowCountOnly: false,
943
1112
  filterMap: canonicalFilterMap,
944
- dashboardName: destinationDashboard,
1113
+ dashboardName: destinationDashboardName,
945
1114
  pivot: isPivotTable ? report.pivot : undefined,
946
1115
  getPivotRowCount: false,
947
1116
  });
@@ -989,8 +1158,20 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
989
1158
  else if (index !== undefined) {
990
1159
  // For dynamic array fields
991
1160
  const [field, subfield] = fieldName.split('.');
1161
+ let newLabel = undefined;
1162
+ if (field === 'columns' && subfield === 'field') {
1163
+ if (!formData['columns'][index]?.label) {
1164
+ newLabel = snakeAndCamelCaseToTitleCase(value);
1165
+ }
1166
+ }
992
1167
  // @ts-ignore
993
- const updatedArray = formData[field].map((item, i) => i === index ? { ...item, [subfield]: value } : item);
1168
+ const updatedArray = formData[field].map((item, i) => i === index
1169
+ ? {
1170
+ ...item,
1171
+ label: newLabel ? newLabel : item.label,
1172
+ [subfield]: value,
1173
+ }
1174
+ : item);
994
1175
  updatedForm = { ...formData, [field]: updatedArray };
995
1176
  setFormData(updatedForm);
996
1177
  setChartTypes(getChartTypeOptions(updatedForm, dashboardConfig[updatedForm.dashboardName ?? '']));
@@ -1027,7 +1208,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1027
1208
  else if (field === 'dateField' &&
1028
1209
  subfield === 'table' &&
1029
1210
  !formData.dateField?.field) {
1030
- const field = schemaData.schema?.find((elem) => elem.name === value)?.columns?.[0]?.field;
1211
+ const field = schemaData.schemaWithCustomFields?.find((elem) => elem.name === value)?.columns?.[0]?.field;
1031
1212
  updatedForm.dateField = {
1032
1213
  // @ts-ignore
1033
1214
  ...updatedForm[field],
@@ -1045,6 +1226,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1045
1226
  // For simple fields
1046
1227
  updatedForm = { ...updatedForm, [fieldName]: value };
1047
1228
  }
1229
+ if (fieldName === 'chartType') {
1230
+ if (value === 'metric') {
1231
+ updatedForm.xAxisFormat = 'whole_number';
1232
+ }
1233
+ else if (value === 'gauge') {
1234
+ updatedForm.xAxisFormat = 'percent';
1235
+ }
1236
+ }
1048
1237
  let dashboardName = updatedForm.dashboardName;
1049
1238
  if (fieldName === 'dashboardName') {
1050
1239
  dashboardName = value;
@@ -1096,6 +1285,11 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1096
1285
  ...formData,
1097
1286
  dashboardName: formData.dashboardName,
1098
1287
  pivot: null,
1288
+ chartType: formEmptyState.chartType,
1289
+ xAxisField: formEmptyState.xAxisField,
1290
+ xAxisFormat: formEmptyState.xAxisFormat,
1291
+ xAxisLabel: formEmptyState.xAxisLabel,
1292
+ yAxisFields: formEmptyState.yAxisFields,
1099
1293
  });
1100
1294
  // maybe validate
1101
1295
  setSelectedPivotTable(undefined);
@@ -1105,7 +1299,10 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1105
1299
  if (fieldName === 'columns') {
1106
1300
  setFormData({
1107
1301
  ...formData,
1108
- columns: [...formData.columns, { label: '', field: '', format: 'whole_number' }],
1302
+ columns: [
1303
+ ...formData.columns,
1304
+ { label: '', field: '', format: 'string' },
1305
+ ],
1109
1306
  });
1110
1307
  }
1111
1308
  else if (fieldName === 'yAxisFields') {
@@ -1113,7 +1310,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1113
1310
  ...formData,
1114
1311
  yAxisFields: [
1115
1312
  ...formData.yAxisFields,
1116
- { label: '', field: '', format: 'whole_number' },
1313
+ { label: '', field: '', format: 'string' },
1117
1314
  ],
1118
1315
  });
1119
1316
  }
@@ -1131,6 +1328,15 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1131
1328
  },
1132
1329
  });
1133
1330
  }
1331
+ else if (fieldName === 'referenceLines') {
1332
+ setFormData({
1333
+ ...formData,
1334
+ referenceLines: [
1335
+ ...formData.referenceLines,
1336
+ { label: '', y1: undefined, y2: undefined },
1337
+ ],
1338
+ });
1339
+ }
1134
1340
  };
1135
1341
  const handleRemoveField = (fieldName, index) => {
1136
1342
  if (fieldName === 'pivot') {
@@ -1178,31 +1384,40 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1178
1384
  ...(formData.dateField?.table
1179
1385
  ? {}
1180
1386
  : { dateField: { ...defaultDateField } }),
1181
- ...(formData.dashboardName
1182
- ? {}
1183
- : { dashboardName: report?.dashboardName }),
1387
+ dashboardName: destinationDashboardName,
1184
1388
  query: report?.queryString ?? '',
1185
1389
  pivot: formData.pivot,
1186
1390
  referencedTables: allTables,
1187
1391
  referencedColumns,
1392
+ includeCustomFields: includeCustomFields || containsCustomFields,
1188
1393
  template: tenants
1189
1394
  ? undefined
1190
1395
  : report && !isAdmin && formData.template
1191
1396
  ? false
1192
1397
  : 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,
1398
+ reportFlags: containsCustomFields
1399
+ ? currentTenantAsFormFlags
1400
+ : formFlags
1401
+ ? Object.fromEntries(Object.entries(formFlags)
1402
+ .filter(([, value]) => value.length > 0)
1403
+ .map(([key, value]) => {
1404
+ return [
1405
+ key,
1406
+ Object.keys(allTenantMap).length > 1 &&
1407
+ allTenantMap[key]?.length === value.length
1408
+ ? ALL_TENANTS
1409
+ : value,
1410
+ ];
1411
+ }))
1412
+ : undefined,
1413
+ referenceLines: formData.referenceLines.map((line) => {
1414
+ return {
1415
+ label: line.label,
1416
+ query: line.label === REFERENCE_LINE
1417
+ ? [Number(line.y1 ?? 0) || 0, Number(line.y2 ?? 0) || 0]
1418
+ : '',
1419
+ };
1420
+ }),
1206
1421
  };
1207
1422
  const resp = await saveReport({
1208
1423
  report: { ...newReport, rows: undefined, pivotRows: undefined }, // stop including rows in request
@@ -1262,15 +1477,17 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1262
1477
  gap: '20px',
1263
1478
  flexDirection: isHorizontalView ? 'row' : 'column',
1264
1479
  boxSizing: 'border-box',
1265
- }, children: [_jsxs("div", { style: {
1480
+ }, children: [hideChartView ? null : (_jsxs("div", { style: {
1266
1481
  display: 'flex',
1267
1482
  flexDirection: 'column',
1268
1483
  gap: isOpen ? 16 : 20,
1269
1484
  overflowY: 'scroll',
1270
1485
  height: isHorizontalView || !isOpen ? '100%' : 800,
1271
1486
  ...(isHorizontalView && {
1272
- flexGrow: 1,
1273
- maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
1487
+ // flexGrow: 1,
1488
+ width: !isOpen
1489
+ ? '100%'
1490
+ : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
1274
1491
  }),
1275
1492
  ...(!isHorizontalView && isOpen && { width: formWidth }),
1276
1493
  }, children: [!isEditingMode && (report?.adminError || report?.error) ? (_jsx(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : ((isHorizontalView || (!isOpen && windowWidth > 1200)) && (_jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
@@ -1281,10 +1498,13 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1281
1498
  // formData.chartType === 'metric'
1282
1499
  // ? 100
1283
1500
  // : `calc(${filtersEnabled ? 50 : 70}%)`,
1284
- ...(isHorizontalView && { flexGrow: formData.chartType !== 'table' ? 1 : 0 }),
1501
+ ...(isHorizontalView && {
1502
+ flexGrow: !['table'].includes(formData.chartType) ? 1 : 0,
1503
+ }),
1285
1504
  }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen }))),
1286
1505
  // Make sure to display non-pivoted table when using pivot chart
1287
- (isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsxs("div", { style: {
1506
+ !hideChartView &&
1507
+ (isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsxs("div", { style: {
1288
1508
  width: '100%',
1289
1509
  // height:
1290
1510
  // isHorizontalView || !isOpen
@@ -1298,21 +1518,29 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1298
1518
  onFiltersEnabledChanged(hide);
1299
1519
  }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1300
1520
  width: '100%',
1301
- height: formData.chartType === 'table' ? 200 : formData.chartType === 'metric' ? 300 : 500,
1521
+ height: formData.chartType === 'table'
1522
+ ? 200
1523
+ : formData.chartType === 'metric'
1524
+ ? 300
1525
+ : 500,
1302
1526
  flexGrow: formData.chartType !== 'table' ? 1 : 0,
1303
- }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen })), formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1527
+ }, onClickChartElement: onClickChartElement, filterToggleDisabled: Object.values(validFilter).includes(false), onDashboardFilterChange: onDashboardFilterChange, layoutChanged: isOpen })), hideTableView ? null : formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: includeCustomFields && !containsCustomFields
1528
+ ? formData.columns.concat(reportCustomFields)
1529
+ : formData.columns, onPageChange: (page) => {
1304
1530
  onPageChange(page);
1305
1531
  setCurrentPage(page);
1306
1532
  }, onSortChange: (sort) => {
1307
1533
  onSortChange && onSortChange(sort);
1308
- }, currentPage: currentPage, rowCount: rowCount, isLoading: isLoading, rowCountIsLoading: rowCountIsLoading, disableSort: disableSort })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1534
+ }, currentPage: currentPage, rowCount: rowCount, isLoading: isLoading, rowCountIsLoading: rowCountIsLoading, disableSort: disableSort, hideLabels: false })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1309
1535
  ? selectedPivotTable.columns
1310
- : formData.columns, onPageChange: (page) => {
1536
+ : includeCustomFields && !containsCustomFields
1537
+ ? formData.columns.concat(reportCustomFields)
1538
+ : formData.columns, onPageChange: (page) => {
1311
1539
  onPageChange(page, true);
1312
1540
  setCurrentPage(page);
1313
1541
  }, onSortChange: (sort) => {
1314
1542
  onSortChange && onSortChange(sort, true);
1315
- }, currentPage: currentPage, rowCount: selectedPivotTable ? pivotData?.rowCount : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort }))] }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
1543
+ }, currentPage: currentPage, rowCount: selectedPivotTable ? pivotData?.rowCount : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort, hideLabels: false }))] }))] })), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
1316
1544
  display: 'flex',
1317
1545
  flexDirection: 'column',
1318
1546
  gap: 20,
@@ -1328,27 +1556,35 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1328
1556
  paddingTop: modalPadding,
1329
1557
  paddingBottom: modalPadding,
1330
1558
  }),
1331
- }, children: [_jsxs(FormContainer, { children: [(formData.pivot || formData.chartType !== 'table') &&
1332
- windowWidth < 1200 && (_jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
1333
- onFiltersEnabledChanged(hide);
1334
- }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1335
- width: '100%',
1336
- height: formData.chartType === 'table' ? 200 : formData.chartType === 'metric' ? 300 : 500,
1337
- flexGrow: formData.chartType !== 'table' ? 1 : 0,
1338
- }, 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
1559
+ }, children: [_jsxs(FormContainer, { children: [hideChartView
1560
+ ? null
1561
+ : (formData.pivot || formData.chartType !== 'table') &&
1562
+ windowWidth < 1200 && (_jsx(InternalChart, { report: chartData, filtersEnabled: filtersEnabled, setFiltersEnabled: (hide) => {
1563
+ onFiltersEnabledChanged(hide);
1564
+ }, colors: theme?.chartColors, loading: false, hideDateRangeFilter: hideDateRangeFilter, isAdmin: isAdmin, containerStyle: {
1565
+ width: '100%',
1566
+ height: formData.chartType === 'table'
1567
+ ? 200
1568
+ : formData.chartType === 'metric'
1569
+ ? 300
1570
+ : formData.chartType === 'US map' ||
1571
+ formData.chartType === 'World map'
1572
+ ? 'fit-content'
1573
+ : 500,
1574
+ flexGrow: !['table'].includes(formData.chartType)
1575
+ ? 1
1576
+ : 0,
1577
+ }, 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
1578
  // {...autofocusRefProp}
1340
1579
  , {
1341
1580
  // {...autofocusRefProp}
1342
- id: "chart-builder-name", label: "Name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" }) }), showDashboardDropdown && !destinationDashboard && (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Dashboard", value: formData.dashboardName || '', onChange: async (e) => {
1581
+ id: "chart-builder-name", label: "Name", width: 200, value: formData.name, onChange: (e) => handleChange(e.target.value, 'name'), placeholder: "Name" }) }), showDashboardDropdown && !destinationDashboardName && (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Dashboard", value: formData.dashboardName || '', onChange: async (e) => {
1343
1582
  handleChange(e.target.value, 'dashboardName');
1344
1583
  await updateDashboardFilters(e.target.value);
1345
1584
  }, options: dashboardOptions.map((elem) => ({
1346
1585
  label: elem.label,
1347
1586
  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: {
1587
+ })), width: 200 }) })), hideChartType ? (_jsx("div", { style: { 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 }) }))] }), hidePivotForm ? null : (_jsxs("div", { style: {
1352
1588
  display: 'flex',
1353
1589
  flexDirection: 'column',
1354
1590
  gap: 6,
@@ -1364,33 +1600,43 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1364
1600
  setShowPivotPopover(true);
1365
1601
  setPivotRowField(formData.pivot?.rowField);
1366
1602
  setPivotColumnField(formData.pivot?.columnField);
1367
- setPivotAggregations(formData.pivot?.aggregations ?? [{
1603
+ setPivotAggregations(formData.pivot?.aggregations ?? [
1604
+ {
1368
1605
  valueField: formData.pivot?.valueField,
1369
1606
  aggregationType: formData.pivot?.aggregationType,
1370
1607
  valueField2: formData.pivot?.valueField2,
1371
- }]);
1608
+ },
1609
+ ]);
1372
1610
  setPivotPopUpTitle('Edit pivot');
1373
- }, 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: {
1611
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: handleDeletePivot, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }) }) }))] })] })), !hideChartView &&
1612
+ (formData.pivot || formData.chartType !== 'table') && (_jsxs("div", { children: [CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsx("div", { style: {
1374
1613
  display: 'flex',
1375
1614
  flexDirection: 'column',
1376
- }, 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)
1615
+ }, children: _jsx(HeaderComponent, { label: "Chart" }) })), CHART_TO_LABELS[formData.chartType]?.xAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.xAxisLabel ??
1616
+ '' }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.xAxisField, onChange: (e) => handleChange(e.target.value, 'xAxisField'), options: formData.pivot
1617
+ ? getPivotMetricOptions(formData.pivot, selectedPivotTable, formData.chartType)
1378
1618
  : columns.map((elem) => ({
1379
1619
  label: elem.field,
1380
1620
  value: elem.field,
1381
1621
  })), 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'
1622
+ isDateField(formData.xAxisField ?? '')
1623
+ ? 'string'
1384
1624
  : 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'
1625
+ isDateField(formData.xAxisField ?? '')
1626
+ ? [{ value: 'string', label: 'date' }]
1627
+ : xAxisFormatOptions, width: 200, hideEmptyOption: true })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ??
1628
+ '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields.map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
1629
+ ? formData.pivot.aggregations?.length
1630
+ ? (disambiguatedValueField(formData.pivot) ?? 'count')
1631
+ : 'count'
1389
1632
  : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
1390
1633
  ? [
1391
1634
  {
1392
- label: `Pivot Column (${formData.pivot.aggregations?.length ? disambiguatedValueField(formData.pivot) ?? 'count' : 'count'})`,
1393
- value: formData.pivot.aggregations?.length ? disambiguatedValueField(formData.pivot) ?? 'count' : 'count',
1635
+ label: `Pivot Column (${formData.pivot.aggregations?.length ? (disambiguatedValueField(formData.pivot) ?? 'count') : 'count'})`,
1636
+ value: formData.pivot.aggregations
1637
+ ?.length
1638
+ ? (disambiguatedValueField(formData.pivot) ?? 'count')
1639
+ : 'count',
1394
1640
  },
1395
1641
  ]
1396
1642
  : columns
@@ -1401,28 +1647,52 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1401
1647
  label: elem.field,
1402
1648
  value: elem.field,
1403
1649
  })), 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) => {
1650
+ ? (NUMBER_OPTIONS.find((option) => {
1405
1651
  return (option.value === yAxisField.format);
1406
- })?.value ?? NUMBER_OPTIONS[0].value
1652
+ })?.value ?? NUMBER_OPTIONS[0].value)
1407
1653
  : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
1408
1654
  ? 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: {
1655
+ : 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'] &&
1656
+ (chartData.chartType === 'line' ||
1657
+ 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),
1658
+ // only include numeric columns
1659
+ options: [
1660
+ {
1661
+ label: 'Custom Values',
1662
+ value: REFERENCE_LINE,
1663
+ },
1664
+ ].concat((selectedPivotTable?.columns
1665
+ ? selectedPivotTable.columns
1666
+ : columns)
1667
+ .filter((c) => NUMBER_FORMAT_TYPES.includes(c.format))
1668
+ .map((elem) => ({
1669
+ label: elem.field,
1670
+ value: elem.field,
1671
+ }))) }), 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
1672
  width: '100%',
1411
1673
  height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
1412
1674
  flexGrow: 1,
1413
- }, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1675
+ }, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: includeCustomFields && !containsCustomFields
1676
+ ? formData.columns.concat(reportCustomFields)
1677
+ : formData.columns, onPageChange: (page) => {
1414
1678
  onPageChange(page);
1415
1679
  setCurrentPage(page);
1416
1680
  }, onSortChange: (sort) => {
1417
1681
  onSortChange && onSortChange(sort);
1418
- }, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1682
+ }, currentPage: currentPage, rowCount: rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort, hideLabels: false })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1419
1683
  ? selectedPivotTable.columns
1420
- : formData.columns, onPageChange: (page) => {
1684
+ : includeCustomFields && !containsCustomFields
1685
+ ? formData.columns.concat(reportCustomFields)
1686
+ : formData.columns, onPageChange: (page) => {
1421
1687
  onPageChange(page, true);
1422
1688
  setCurrentPage(page);
1423
1689
  }, onSortChange: (sort) => {
1424
1690
  onSortChange && onSortChange(sort, true);
1425
- }, currentPage: currentPage, rowCount: selectedPivotTable ? pivotData?.rowCount : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort })) })), (showTableFormatOptions || isAdmin) && (_jsxs("div", { children: [_jsxs("div", { style: {
1691
+ }, currentPage: currentPage, rowCount: selectedPivotTable ? pivotData?.rowCount : rowCount, rowCountIsLoading: rowCountIsLoading, isLoading: isLoading, disableSort: disableSort, hideLabels: false })) })), (showTableFormatOptions || isAdmin) && (_jsxs("div", { style: {
1692
+ display: 'flex',
1693
+ flexDirection: 'column',
1694
+ gap: 6,
1695
+ }, children: [_jsxs("div", { style: {
1426
1696
  display: 'flex',
1427
1697
  flexDirection: 'column',
1428
1698
  }, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
@@ -1439,14 +1709,14 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1439
1709
  column.field === formData.pivot.rowField
1440
1710
  ? formData.pivot &&
1441
1711
  isDateField(formData.pivot.rowFieldType || '')
1442
- ? 'pivot_date'
1712
+ ? 'string'
1443
1713
  : 'string'
1444
1714
  : formData.pivot?.aggregationType ===
1445
1715
  'percentage'
1446
1716
  ? 'percent'
1447
1717
  : 'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
1448
1718
  ? isDateField(formData.pivot.rowFieldType || '')
1449
- ? [{ label: 'date', value: 'pivot_date' }]
1719
+ ? [{ label: 'date', value: 'string' }]
1450
1720
  : [{ label: 'string', value: 'string' }]
1451
1721
  : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
1452
1722
  : 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 +1727,24 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1457
1727
  : columns.map((elem) => ({
1458
1728
  label: elem.field,
1459
1729
  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: !(
1730
+ })), 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
1731
  // hide when pivoted and chartType === 'table'
1462
1732
  (formData.pivot &&
1463
1733
  selectedPivotTable &&
1464
1734
  selectedPivotTable.columns &&
1465
- formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), isAdmin && tenants && dashboardOwner && (_jsxs("div", { style: {
1735
+ formData.chartType === 'table')) && (_jsxs("div", { style: {
1736
+ display: 'flex',
1737
+ flexDirection: 'row',
1738
+ gap: 10,
1739
+ }, children: [_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" }), isAdmin &&
1740
+ client?.featureFlags?.customFieldsEnabled && (_jsx(QuillToolTip, { text: "Custom field directly referenced in report", enabled: containsCustomFields, textStyle: {
1741
+ maxWidth: '200px',
1742
+ whiteSpace: 'normal',
1743
+ }, children: _jsx(CheckboxComponent, { isChecked: containsCustomFields || includeCustomFields, label: "Include Custom Fields", onChange: () => setIncludeCustomFields((prev) => !prev), disabled: containsCustomFields, containerStyle: {
1744
+ height: containsCustomFields
1745
+ ? '100%' // required when wrapped with QuillToolTip
1746
+ : undefined,
1747
+ } }) }))] })) })] })] })), isAdmin && tenants && dashboardOwner && (_jsxs("div", { style: {
1466
1748
  display: 'flex',
1467
1749
  flexDirection: 'column',
1468
1750
  gap: 12,
@@ -1476,54 +1758,61 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1476
1758
  width: 'fit-content',
1477
1759
  gap: 12,
1478
1760
  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({
1761
+ }, children: [_jsx(QuillToolTip, { text: 'Tenant access is restricted to current tenant with direct custom field reference.', enabled: containsCustomFields, textStyle: {
1762
+ maxWidth: '200px',
1763
+ whiteSpace: 'normal',
1764
+ }, children: _jsxs("div", { style: {
1765
+ outline: '1px solid #E7E7E7',
1766
+ borderRadius: 6,
1767
+ padding: 4,
1768
+ display: 'flex',
1769
+ flexDirection: 'row',
1770
+ marginLeft: 2,
1771
+ backgroundColor: '#FCFCFC',
1772
+ height: 38,
1773
+ width: 'fit-content',
1774
+ }, children: [_jsx("button", { onClick: () => {
1775
+ if (!containsCustomFields) {
1776
+ setCustomTenantAccess(false);
1777
+ setFormFlags(undefined);
1778
+ }
1779
+ }, style: {
1780
+ width: 95,
1781
+ outline: !(customTenantAccess || containsCustomFields)
1782
+ ? '1px solid #E7E7E7'
1783
+ : undefined,
1784
+ backgroundColor: !(customTenantAccess || containsCustomFields)
1785
+ ? 'white'
1786
+ : undefined,
1787
+ // Center text vertically and horizontally
1788
+ display: 'flex',
1789
+ justifyContent: 'center',
1790
+ alignItems: 'center',
1791
+ borderRadius: 6,
1792
+ fontSize: 14,
1793
+ fontWeight: 500,
1794
+ userSelect: 'none',
1795
+ }, children: "Global" }), _jsx("button", { onClick: () => {
1796
+ setCustomTenantAccess(true);
1797
+ }, style: {
1798
+ width: 95,
1799
+ outline: customTenantAccess || containsCustomFields
1800
+ ? '1px solid #E7E7E7'
1801
+ : undefined,
1802
+ backgroundColor: customTenantAccess || containsCustomFields
1803
+ ? 'white'
1804
+ : undefined,
1805
+ // Center text vertically and horizontally
1806
+ display: 'flex',
1807
+ justifyContent: 'center',
1808
+ alignItems: 'center',
1809
+ borderRadius: 6,
1810
+ fontSize: 14,
1811
+ fontWeight: 500,
1812
+ userSelect: 'none',
1813
+ }, children: "Custom" })] }) }), client?.allTenantTypes?.length === 1 ? (_jsx(MultiSelectComponent, { disabled: containsCustomFields, value: containsCustomFields
1814
+ ? (currentTenantAsFormFlags?.[dashboardOwner.tenantField] ?? []) // Even though value requires string[], turns out flags can be numbers
1815
+ : (formFlags?.[dashboardOwner.tenantField] ?? []), onChange: (e) => setFormFlags({
1527
1816
  ...formFlags,
1528
1817
  [dashboardOwner.tenantField]: e.target
1529
1818
  .value,
@@ -1540,7 +1829,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1540
1829
  })) ?? []), width: 200, emptyLabel: dashboardOwner.scope === 'database'
1541
1830
  ? 'No flags supplied'
1542
1831
  : undefined, allSelectedLabel: 'All ' + dashboardOwner.name + 's', style: {
1543
- display: customTenantAccess ? 'inline' : 'none',
1832
+ display: customTenantAccess || containsCustomFields
1833
+ ? 'inline'
1834
+ : 'none',
1544
1835
  marginTop: -1,
1545
1836
  marginBottom: -4,
1546
1837
  } })) : (_jsx(QuillMultiSelectSectionList, { value: formFlags ?? {}, onChange: (e) => setFormFlags(e.target.value), options: allTenantMap, sectionHeaderMap: client?.allTenantTypes?.reduce((acc, tenantType) => {
@@ -1551,7 +1842,9 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1551
1842
  acc[tenantType.tenantField] = tenantType.name;
1552
1843
  return acc;
1553
1844
  }, {}) ?? {}, width: 200, allSelectedLabel: 'All ' + dashboardOwner.name + 's', style: {
1554
- display: customTenantAccess ? 'inline' : 'none',
1845
+ display: customTenantAccess || containsCustomFields
1846
+ ? 'inline'
1847
+ : 'none',
1555
1848
  marginTop: -1,
1556
1849
  marginBottom: -4,
1557
1850
  }, owner: dashboardOwner.tenantField }))] }) })] })), specificDashboardFilters.length > 0 && isAdmin && (_jsxs("div", { style: {
@@ -1560,7 +1853,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1560
1853
  gap: 6,
1561
1854
  }, children: [_jsx(HeaderComponent, { label: "Dashboard filter fields" }), isAdmin &&
1562
1855
  formData.dateField &&
1563
- dashboardConfig[formData.dashboardName ?? destinationDashboard ?? '']?.config.dateFilter?.label && (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.dateFilter.' +
1856
+ dashboardConfig[formData.dashboardName ?? destinationDashboardName ?? '']?.config.dateFilter?.label && (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.dateFilter.' +
1564
1857
  (dashboardConfig[formData.dashboardName ?? '']
1565
1858
  ?.config.dateFilter?.label ?? 'Date'), value: dashboardConfig[formData.dashboardName ?? '']
1566
1859
  ?.config.dateFilter?.label ?? 'Date', width: 200, onChange: () => { }, label: 'Filter', disabled: true }), _jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Virtual Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
@@ -1585,18 +1878,20 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1585
1878
  .map((filter, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(TextInputComponent, { id: 'filterMap.' + filter.label, value: filter.label, width: 200, onChange: () => { }, label: index === 0 &&
1586
1879
  !(isAdmin &&
1587
1880
  formData.dateField &&
1588
- dashboardConfig[formData.dashboardName ?? '']?.config.dateFilter?.label)
1881
+ dashboardConfig[formData.dashboardName ?? '']
1882
+ ?.config.dateFilter?.label)
1589
1883
  ? 'Filter'
1590
1884
  : '', disabled: true }), _jsx(SelectComponent, { label: index === 0 &&
1591
1885
  !(isAdmin &&
1592
1886
  formData.dateField &&
1593
- dashboardConfig[formData.dashboardName ?? '']?.config.dateFilter?.label)
1887
+ dashboardConfig[formData.dashboardName ?? '']
1888
+ ?.config.dateFilter?.label)
1594
1889
  ? 'Virtual Table'
1595
1890
  : '', value: filterMap[filter.label]?.table ?? filter.table, onChange: (e) => setFilterMap({
1596
1891
  ...filterMap,
1597
1892
  [filter.label]: {
1598
1893
  table: e.target.value,
1599
- field: schemaData.schema
1894
+ field: schemaData.schemaWithCustomFields
1600
1895
  .find((t) => t.name == e.target.value)
1601
1896
  ?.columns.find((elem) => elem.field ===
1602
1897
  (filterMap[filter.label]?.field ??
@@ -1608,7 +1903,8 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1608
1903
  })), width: 200 }), _jsx(SelectComponent, { label: index === 0 &&
1609
1904
  !(isAdmin &&
1610
1905
  formData.dateField &&
1611
- dashboardConfig[formData.dashboardName ?? '']?.config.dateFilter?.label)
1906
+ dashboardConfig[formData.dashboardName ?? '']
1907
+ ?.config.dateFilter?.label)
1612
1908
  ? 'Field'
1613
1909
  : '', value: filterMap[filter.label]?.field ?? filter.field, onChange: (e) => setFilterMap({
1614
1910
  ...filterMap,
@@ -1617,7 +1913,7 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1617
1913
  filter.table,
1618
1914
  field: e.target.value,
1619
1915
  },
1620
- }), options: schemaData.schema
1916
+ }), options: schemaData.schemaWithCustomFields
1621
1917
  .find((t) => t.name ==
1622
1918
  (filterMap[filter.label]?.table ??
1623
1919
  filter.table) &&
@@ -1647,11 +1943,15 @@ onClickChartElement, isEditingMode = false, disableSort = true, }) {
1647
1943
  justifyContent: 'space-between',
1648
1944
  alignItems: 'center',
1649
1945
  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: () => {
1946
+ }, children: [!!filterIssues?.length && (_jsx(ErrorMessageComponent, { errorMessage: filterIssues[0] || 'Dashboard - Report issues', containerStyle: { height: '100%' } })), _jsxs("div", { style: {
1947
+ display: 'flex',
1948
+ flexDirection: 'row',
1949
+ gap: 10,
1950
+ backgroundColor: 'white',
1951
+ }, children: [hideDiscardChanges ? null : (_jsx(SecondaryButtonComponent, { onClick: () => {
1652
1952
  setIsOpen(false);
1653
1953
  onDiscardChanges && onDiscardChanges();
1654
- }, label: 'Discard changes' }), _jsx(ButtonComponent, { onClick: () => {
1954
+ }, label: 'Discard changes' })), _jsx(ButtonComponent, { onClick: () => {
1655
1955
  if (loadingFormData) {
1656
1956
  setTriggeredEditChart(true);
1657
1957
  }