@quillsql/react 2.12.37 → 2.12.39

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 (463) hide show
  1. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  2. package/dist/cjs/ChartBuilder.js +2 -2
  3. package/dist/cjs/Context.d.ts.map +1 -1
  4. package/dist/cjs/Context.js +2 -0
  5. package/dist/cjs/Dashboard.d.ts.map +1 -1
  6. package/dist/cjs/Dashboard.js +3 -1
  7. package/dist/cjs/utils/constants.d.ts +1 -0
  8. package/dist/cjs/utils/constants.d.ts.map +1 -1
  9. package/dist/cjs/utils/constants.js +2 -1
  10. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  11. package/dist/cjs/utils/pivotProcessing.js +5 -2
  12. package/dist/cjs/utils/schema.d.ts.map +1 -1
  13. package/dist/cjs/utils/schema.js +5 -2
  14. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  15. package/dist/cjs/utils/tableProcessing.js +2 -1
  16. package/dist/esm/Chart.d.ts +204 -0
  17. package/dist/esm/Chart.d.ts.map +1 -0
  18. package/dist/esm/Chart.js +431 -0
  19. package/dist/esm/ChartBuilder.d.ts +339 -0
  20. package/dist/esm/ChartBuilder.d.ts.map +1 -0
  21. package/dist/esm/ChartBuilder.js +1312 -0
  22. package/dist/esm/ChartEditor.d.ts +209 -0
  23. package/dist/esm/ChartEditor.d.ts.map +1 -0
  24. package/dist/esm/ChartEditor.js +182 -0
  25. package/dist/esm/Context.d.ts +14 -0
  26. package/dist/esm/Context.d.ts.map +1 -0
  27. package/dist/esm/Context.js +271 -0
  28. package/dist/esm/Dashboard.d.ts +279 -0
  29. package/dist/esm/Dashboard.d.ts.map +1 -0
  30. package/dist/esm/Dashboard.js +662 -0
  31. package/dist/esm/DateRangePicker/Calendar.d.ts +17 -0
  32. package/dist/esm/DateRangePicker/Calendar.d.ts.map +1 -0
  33. package/dist/esm/DateRangePicker/Calendar.js +164 -0
  34. package/dist/esm/DateRangePicker/DateRangePicker.d.ts +39 -0
  35. package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -0
  36. package/dist/esm/DateRangePicker/DateRangePicker.js +95 -0
  37. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +22 -0
  38. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +1 -0
  39. package/dist/esm/DateRangePicker/DateRangePickerButton.js +134 -0
  40. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +25 -0
  41. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
  42. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +260 -0
  43. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +80 -0
  44. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -0
  45. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +521 -0
  46. package/dist/esm/DateRangePicker/index.d.ts +3 -0
  47. package/dist/esm/DateRangePicker/index.d.ts.map +1 -0
  48. package/dist/esm/DateRangePicker/index.js +2 -0
  49. package/dist/esm/QuillProvider.d.ts +163 -0
  50. package/dist/esm/QuillProvider.d.ts.map +1 -0
  51. package/dist/esm/QuillProvider.js +104 -0
  52. package/dist/esm/ReportBuilder.d.ts +318 -0
  53. package/dist/esm/ReportBuilder.d.ts.map +1 -0
  54. package/dist/esm/ReportBuilder.js +3279 -0
  55. package/dist/esm/SQLEditor.d.ts +272 -0
  56. package/dist/esm/SQLEditor.d.ts.map +1 -0
  57. package/dist/esm/SQLEditor.js +510 -0
  58. package/dist/esm/Table.d.ts +167 -0
  59. package/dist/esm/Table.d.ts.map +1 -0
  60. package/dist/esm/Table.js +215 -0
  61. package/dist/esm/TableChart.d.ts +15 -0
  62. package/dist/esm/TableChart.d.ts.map +1 -0
  63. package/dist/esm/TableChart.js +95 -0
  64. package/dist/esm/assets/ArrowDownHeadIcon.d.ts +5 -0
  65. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -0
  66. package/dist/esm/assets/ArrowDownHeadIcon.js +3 -0
  67. package/dist/esm/assets/ArrowDownIcon.d.ts +5 -0
  68. package/dist/esm/assets/ArrowDownIcon.d.ts.map +1 -0
  69. package/dist/esm/assets/ArrowDownIcon.js +3 -0
  70. package/dist/esm/assets/ArrowDownRightIcon.d.ts +5 -0
  71. package/dist/esm/assets/ArrowDownRightIcon.d.ts.map +1 -0
  72. package/dist/esm/assets/ArrowDownRightIcon.js +3 -0
  73. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts +5 -0
  74. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts.map +1 -0
  75. package/dist/esm/assets/ArrowLeftHeadIcon.js +3 -0
  76. package/dist/esm/assets/ArrowRightHeadIcon.d.ts +5 -0
  77. package/dist/esm/assets/ArrowRightHeadIcon.d.ts.map +1 -0
  78. package/dist/esm/assets/ArrowRightHeadIcon.js +3 -0
  79. package/dist/esm/assets/ArrowRightIcon.d.ts +5 -0
  80. package/dist/esm/assets/ArrowRightIcon.d.ts.map +1 -0
  81. package/dist/esm/assets/ArrowRightIcon.js +3 -0
  82. package/dist/esm/assets/ArrowUpHeadIcon.d.ts +5 -0
  83. package/dist/esm/assets/ArrowUpHeadIcon.d.ts.map +1 -0
  84. package/dist/esm/assets/ArrowUpHeadIcon.js +3 -0
  85. package/dist/esm/assets/ArrowUpIcon.d.ts +5 -0
  86. package/dist/esm/assets/ArrowUpIcon.d.ts.map +1 -0
  87. package/dist/esm/assets/ArrowUpIcon.js +3 -0
  88. package/dist/esm/assets/ArrowUpRightIcon.d.ts +5 -0
  89. package/dist/esm/assets/ArrowUpRightIcon.d.ts.map +1 -0
  90. package/dist/esm/assets/ArrowUpRightIcon.js +3 -0
  91. package/dist/esm/assets/CalendarIcon.d.ts +5 -0
  92. package/dist/esm/assets/CalendarIcon.d.ts.map +1 -0
  93. package/dist/esm/assets/CalendarIcon.js +3 -0
  94. package/dist/esm/assets/CalendarNormalIcon.d.ts +5 -0
  95. package/dist/esm/assets/CalendarNormalIcon.d.ts.map +1 -0
  96. package/dist/esm/assets/CalendarNormalIcon.js +3 -0
  97. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts +5 -0
  98. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -0
  99. package/dist/esm/assets/DoubleArrowLeftHeadIcon.js +3 -0
  100. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts +5 -0
  101. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -0
  102. package/dist/esm/assets/DoubleArrowRightHeadIcon.js +3 -0
  103. package/dist/esm/assets/ExclamationFilledIcon.d.ts +5 -0
  104. package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +1 -0
  105. package/dist/esm/assets/ExclamationFilledIcon.js +3 -0
  106. package/dist/esm/assets/FilterIcon.d.ts +5 -0
  107. package/dist/esm/assets/FilterIcon.d.ts.map +1 -0
  108. package/dist/esm/assets/FilterIcon.js +3 -0
  109. package/dist/esm/assets/LoadingSpinner.d.ts +5 -0
  110. package/dist/esm/assets/LoadingSpinner.d.ts.map +1 -0
  111. package/dist/esm/assets/LoadingSpinner.js +3 -0
  112. package/dist/esm/assets/RefreshIcon.d.ts +5 -0
  113. package/dist/esm/assets/RefreshIcon.d.ts.map +1 -0
  114. package/dist/esm/assets/RefreshIcon.js +3 -0
  115. package/dist/esm/assets/SearchIcon.d.ts +5 -0
  116. package/dist/esm/assets/SearchIcon.d.ts.map +1 -0
  117. package/dist/esm/assets/SearchIcon.js +3 -0
  118. package/dist/esm/assets/UpLeftArrowsIcon.d.ts +5 -0
  119. package/dist/esm/assets/UpLeftArrowsIcon.d.ts.map +1 -0
  120. package/dist/esm/assets/UpLeftArrowsIcon.js +3 -0
  121. package/dist/esm/assets/XCircleIcon.d.ts +5 -0
  122. package/dist/esm/assets/XCircleIcon.d.ts.map +1 -0
  123. package/dist/esm/assets/XCircleIcon.js +3 -0
  124. package/dist/esm/assets/XIcon.d.ts +5 -0
  125. package/dist/esm/assets/XIcon.d.ts.map +1 -0
  126. package/dist/esm/assets/XIcon.js +3 -0
  127. package/dist/esm/assets/index.d.ts +22 -0
  128. package/dist/esm/assets/index.d.ts.map +1 -0
  129. package/dist/esm/assets/index.js +21 -0
  130. package/dist/esm/components/Banner/index.d.ts +3 -0
  131. package/dist/esm/components/Banner/index.d.ts.map +1 -0
  132. package/dist/esm/components/Banner/index.js +24 -0
  133. package/dist/esm/components/BigModal/BigModal.d.ts +15 -0
  134. package/dist/esm/components/BigModal/BigModal.d.ts.map +1 -0
  135. package/dist/esm/components/BigModal/BigModal.js +56 -0
  136. package/dist/esm/components/Chart/BarChart.d.ts +23 -0
  137. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -0
  138. package/dist/esm/components/Chart/BarChart.js +110 -0
  139. package/dist/esm/components/Chart/BarList.d.ts +27 -0
  140. package/dist/esm/components/Chart/BarList.d.ts.map +1 -0
  141. package/dist/esm/components/Chart/BarList.js +148 -0
  142. package/dist/esm/components/Chart/ChartError.d.ts +10 -0
  143. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -0
  144. package/dist/esm/components/Chart/ChartError.js +65 -0
  145. package/dist/esm/components/Chart/ChartSkeleton.d.ts +8 -0
  146. package/dist/esm/components/Chart/ChartSkeleton.d.ts.map +1 -0
  147. package/dist/esm/components/Chart/ChartSkeleton.js +19 -0
  148. package/dist/esm/components/Chart/ChartTooltip.d.ts +31 -0
  149. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -0
  150. package/dist/esm/components/Chart/ChartTooltip.js +234 -0
  151. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts +6 -0
  152. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts.map +1 -0
  153. package/dist/esm/components/Chart/ChartTooltipFrame.js +14 -0
  154. package/dist/esm/components/Chart/ChartTooltipGroup.d.ts +11 -0
  155. package/dist/esm/components/Chart/ChartTooltipGroup.d.ts.map +1 -0
  156. package/dist/esm/components/Chart/ChartTooltipGroup.js +23 -0
  157. package/dist/esm/components/Chart/ChartTooltipRow.d.ts +8 -0
  158. package/dist/esm/components/Chart/ChartTooltipRow.d.ts.map +1 -0
  159. package/dist/esm/components/Chart/ChartTooltipRow.js +41 -0
  160. package/dist/esm/components/Chart/LineChart.d.ts +29 -0
  161. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -0
  162. package/dist/esm/components/Chart/LineChart.js +163 -0
  163. package/dist/esm/components/Chart/PieChart.d.ts +62 -0
  164. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -0
  165. package/dist/esm/components/Chart/PieChart.js +195 -0
  166. package/dist/esm/components/Dashboard/ChartComponent.d.ts +4 -0
  167. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -0
  168. package/dist/esm/components/Dashboard/ChartComponent.js +60 -0
  169. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +38 -0
  170. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -0
  171. package/dist/esm/components/Dashboard/DashboardFilter.js +89 -0
  172. package/dist/esm/components/Dashboard/DashboardSection.d.ts +7 -0
  173. package/dist/esm/components/Dashboard/DashboardSection.d.ts.map +1 -0
  174. package/dist/esm/components/Dashboard/DashboardSection.js +22 -0
  175. package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts +3 -0
  176. package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts.map +1 -0
  177. package/dist/esm/components/Dashboard/DashboardSectionContainer.js +10 -0
  178. package/dist/esm/components/Dashboard/DataLoader.d.ts +44 -0
  179. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -0
  180. package/dist/esm/components/Dashboard/DataLoader.js +190 -0
  181. package/dist/esm/components/Dashboard/MetricComponent.d.ts +4 -0
  182. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -0
  183. package/dist/esm/components/Dashboard/MetricComponent.js +133 -0
  184. package/dist/esm/components/Dashboard/TableComponent.d.ts +15 -0
  185. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -0
  186. package/dist/esm/components/Dashboard/TableComponent.js +62 -0
  187. package/dist/esm/components/Dropdown/Dropdown.d.ts +14 -0
  188. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -0
  189. package/dist/esm/components/Dropdown/Dropdown.js +69 -0
  190. package/dist/esm/components/Dropdown/DropdownItem.d.ts +11 -0
  191. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -0
  192. package/dist/esm/components/Dropdown/DropdownItem.js +37 -0
  193. package/dist/esm/components/Dropdown/index.d.ts +3 -0
  194. package/dist/esm/components/Dropdown/index.d.ts.map +1 -0
  195. package/dist/esm/components/Dropdown/index.js +2 -0
  196. package/dist/esm/components/Modal/Modal.d.ts +15 -0
  197. package/dist/esm/components/Modal/Modal.d.ts.map +1 -0
  198. package/dist/esm/components/Modal/Modal.js +64 -0
  199. package/dist/esm/components/Modal/index.d.ts +2 -0
  200. package/dist/esm/components/Modal/index.d.ts.map +1 -0
  201. package/dist/esm/components/Modal/index.js +1 -0
  202. package/dist/esm/components/QuillCard.d.ts +9 -0
  203. package/dist/esm/components/QuillCard.d.ts.map +1 -0
  204. package/dist/esm/components/QuillCard.js +56 -0
  205. package/dist/esm/components/QuillMultiSelect.d.ts +11 -0
  206. package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -0
  207. package/dist/esm/components/QuillMultiSelect.js +193 -0
  208. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts +11 -0
  209. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -0
  210. package/dist/esm/components/QuillMultiSelectWithCombo.js +215 -0
  211. package/dist/esm/components/QuillSelect.d.ts +6 -0
  212. package/dist/esm/components/QuillSelect.d.ts.map +1 -0
  213. package/dist/esm/components/QuillSelect.js +136 -0
  214. package/dist/esm/components/QuillSelectWithCombo.d.ts +6 -0
  215. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -0
  216. package/dist/esm/components/QuillSelectWithCombo.js +163 -0
  217. package/dist/esm/components/QuillTable.d.ts +31 -0
  218. package/dist/esm/components/QuillTable.d.ts.map +1 -0
  219. package/dist/esm/components/QuillTable.js +261 -0
  220. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +34 -0
  221. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  222. package/dist/esm/components/ReportBuilder/AddColumnModal.js +145 -0
  223. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +26 -0
  224. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -0
  225. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +36 -0
  226. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +23 -0
  227. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -0
  228. package/dist/esm/components/ReportBuilder/AddSortPopover.js +73 -0
  229. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +30 -0
  230. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -0
  231. package/dist/esm/components/ReportBuilder/FilterModal.js +576 -0
  232. package/dist/esm/components/ReportBuilder/ast.d.ts +523 -0
  233. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -0
  234. package/dist/esm/components/ReportBuilder/ast.js +230 -0
  235. package/dist/esm/components/ReportBuilder/bigDateMap.d.ts +7 -0
  236. package/dist/esm/components/ReportBuilder/bigDateMap.d.ts.map +1 -0
  237. package/dist/esm/components/ReportBuilder/bigDateMap.js +687 -0
  238. package/dist/esm/components/ReportBuilder/constants.d.ts +117 -0
  239. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -0
  240. package/dist/esm/components/ReportBuilder/constants.js +161 -0
  241. package/dist/esm/components/ReportBuilder/convert.d.ts +65 -0
  242. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -0
  243. package/dist/esm/components/ReportBuilder/convert.js +717 -0
  244. package/dist/esm/components/ReportBuilder/operators.d.ts +462 -0
  245. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -0
  246. package/dist/esm/components/ReportBuilder/operators.js +581 -0
  247. package/dist/esm/components/ReportBuilder/pivot.d.ts +16 -0
  248. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -0
  249. package/dist/esm/components/ReportBuilder/pivot.js +1 -0
  250. package/dist/esm/components/ReportBuilder/postgres.d.ts +150 -0
  251. package/dist/esm/components/ReportBuilder/postgres.d.ts.map +1 -0
  252. package/dist/esm/components/ReportBuilder/postgres.js +355 -0
  253. package/dist/esm/components/ReportBuilder/schema.d.ts +23 -0
  254. package/dist/esm/components/ReportBuilder/schema.d.ts.map +1 -0
  255. package/dist/esm/components/ReportBuilder/schema.js +1 -0
  256. package/dist/esm/components/ReportBuilder/ui.d.ts +119 -0
  257. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -0
  258. package/dist/esm/components/ReportBuilder/ui.js +382 -0
  259. package/dist/esm/components/ReportBuilder/util.d.ts +76 -0
  260. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -0
  261. package/dist/esm/components/ReportBuilder/util.js +729 -0
  262. package/dist/esm/components/UiComponents.d.ts +221 -0
  263. package/dist/esm/components/UiComponents.d.ts.map +1 -0
  264. package/dist/esm/components/UiComponents.js +571 -0
  265. package/dist/esm/components/selectUtils.d.ts +9 -0
  266. package/dist/esm/components/selectUtils.d.ts.map +1 -0
  267. package/dist/esm/components/selectUtils.js +17 -0
  268. package/dist/esm/contexts/BaseColorContext.d.ts +4 -0
  269. package/dist/esm/contexts/BaseColorContext.d.ts.map +1 -0
  270. package/dist/esm/contexts/BaseColorContext.js +3 -0
  271. package/dist/esm/contexts/HoveredValueContext.d.ts +8 -0
  272. package/dist/esm/contexts/HoveredValueContext.d.ts.map +1 -0
  273. package/dist/esm/contexts/HoveredValueContext.js +5 -0
  274. package/dist/esm/contexts/RootStylesContext.d.ts +4 -0
  275. package/dist/esm/contexts/RootStylesContext.d.ts.map +1 -0
  276. package/dist/esm/contexts/RootStylesContext.js +3 -0
  277. package/dist/esm/contexts/SelectedValueContext.d.ts +8 -0
  278. package/dist/esm/contexts/SelectedValueContext.d.ts.map +1 -0
  279. package/dist/esm/contexts/SelectedValueContext.js +6 -0
  280. package/dist/esm/contexts/index.d.ts +5 -0
  281. package/dist/esm/contexts/index.d.ts.map +1 -0
  282. package/dist/esm/contexts/index.js +4 -0
  283. package/dist/esm/hooks/index.d.ts +6 -0
  284. package/dist/esm/hooks/index.d.ts.map +1 -0
  285. package/dist/esm/hooks/index.js +5 -0
  286. package/dist/esm/hooks/useAstToFilterTree.d.ts +11 -0
  287. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -0
  288. package/dist/esm/hooks/useAstToFilterTree.js +24 -0
  289. package/dist/esm/hooks/useDashboard.d.ts +7 -0
  290. package/dist/esm/hooks/useDashboard.d.ts.map +1 -0
  291. package/dist/esm/hooks/useDashboard.js +69 -0
  292. package/dist/esm/hooks/useExport.d.ts +6 -0
  293. package/dist/esm/hooks/useExport.d.ts.map +1 -0
  294. package/dist/esm/hooks/useExport.js +125 -0
  295. package/dist/esm/hooks/useFormat.d.ts +5 -0
  296. package/dist/esm/hooks/useFormat.d.ts.map +1 -0
  297. package/dist/esm/hooks/useFormat.js +25 -0
  298. package/dist/esm/hooks/useInternalState.d.ts +4 -0
  299. package/dist/esm/hooks/useInternalState.d.ts.map +1 -0
  300. package/dist/esm/hooks/useInternalState.js +14 -0
  301. package/dist/esm/hooks/useOnClickOutside.d.ts +3 -0
  302. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -0
  303. package/dist/esm/hooks/useOnClickOutside.js +18 -0
  304. package/dist/esm/hooks/useOnWindowResize.d.ts +5 -0
  305. package/dist/esm/hooks/useOnWindowResize.d.ts.map +1 -0
  306. package/dist/esm/hooks/useOnWindowResize.js +14 -0
  307. package/dist/esm/hooks/useQuill.d.ts +37 -0
  308. package/dist/esm/hooks/useQuill.d.ts.map +1 -0
  309. package/dist/esm/hooks/useQuill.js +182 -0
  310. package/dist/esm/hooks/useSelectOnKeyDown.d.ts +3 -0
  311. package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -0
  312. package/dist/esm/hooks/useSelectOnKeyDown.js +63 -0
  313. package/dist/esm/hooks/useTheme.d.ts +7 -0
  314. package/dist/esm/hooks/useTheme.d.ts.map +1 -0
  315. package/dist/esm/hooks/useTheme.js +10 -0
  316. package/dist/esm/index.d.ts +29 -0
  317. package/dist/esm/index.d.ts.map +1 -0
  318. package/dist/esm/index.js +16 -0
  319. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +28 -0
  320. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -0
  321. package/dist/esm/internals/ReportBuilder/PivotForm.js +62 -0
  322. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +39 -0
  323. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -0
  324. package/dist/esm/internals/ReportBuilder/PivotList.js +89 -0
  325. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +146 -0
  326. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -0
  327. package/dist/esm/internals/ReportBuilder/PivotModal.js +1210 -0
  328. package/dist/esm/lib/font.d.ts +14 -0
  329. package/dist/esm/lib/font.d.ts.map +1 -0
  330. package/dist/esm/lib/font.js +13 -0
  331. package/dist/esm/lib/index.d.ts +4 -0
  332. package/dist/esm/lib/index.d.ts.map +1 -0
  333. package/dist/esm/lib/index.js +3 -0
  334. package/dist/esm/lib/inputTypes.d.ts +21 -0
  335. package/dist/esm/lib/inputTypes.d.ts.map +1 -0
  336. package/dist/esm/lib/inputTypes.js +55 -0
  337. package/dist/esm/lib/utils.d.ts +10 -0
  338. package/dist/esm/lib/utils.d.ts.map +1 -0
  339. package/dist/esm/lib/utils.js +35 -0
  340. package/dist/esm/models/Columns.d.ts +12 -0
  341. package/dist/esm/models/Columns.d.ts.map +1 -0
  342. package/dist/esm/models/Columns.js +1 -0
  343. package/dist/esm/models/Filter.d.ts +118 -0
  344. package/dist/esm/models/Filter.d.ts.map +1 -0
  345. package/dist/esm/models/Filter.js +98 -0
  346. package/dist/esm/models/Pagination.d.ts +10 -0
  347. package/dist/esm/models/Pagination.d.ts.map +1 -0
  348. package/dist/esm/models/Pagination.js +1 -0
  349. package/dist/esm/models/Pivots.d.ts +2 -0
  350. package/dist/esm/models/Pivots.d.ts.map +1 -0
  351. package/dist/esm/models/Pivots.js +1 -0
  352. package/dist/esm/models/Report.d.ts +103 -0
  353. package/dist/esm/models/Report.d.ts.map +1 -0
  354. package/dist/esm/models/Report.js +1 -0
  355. package/dist/esm/models/Tables.d.ts +8 -0
  356. package/dist/esm/models/Tables.d.ts.map +1 -0
  357. package/dist/esm/models/Tables.js +1 -0
  358. package/dist/esm/utils/aggregate.d.ts +4 -0
  359. package/dist/esm/utils/aggregate.d.ts.map +1 -0
  360. package/dist/esm/utils/aggregate.js +422 -0
  361. package/dist/esm/utils/astFilterProcessing.d.ts +36 -0
  362. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -0
  363. package/dist/esm/utils/astFilterProcessing.js +8084 -0
  364. package/dist/esm/utils/astProcessing.d.ts +26 -0
  365. package/dist/esm/utils/astProcessing.d.ts.map +1 -0
  366. package/dist/esm/utils/astProcessing.js +254 -0
  367. package/dist/esm/utils/axisFormatter.d.ts +20 -0
  368. package/dist/esm/utils/axisFormatter.d.ts.map +1 -0
  369. package/dist/esm/utils/axisFormatter.js +179 -0
  370. package/dist/esm/utils/color.d.ts +44 -0
  371. package/dist/esm/utils/color.d.ts.map +1 -0
  372. package/dist/esm/utils/color.js +425 -0
  373. package/dist/esm/utils/columnProcessing.d.ts +13 -0
  374. package/dist/esm/utils/columnProcessing.d.ts.map +1 -0
  375. package/dist/esm/utils/columnProcessing.js +260 -0
  376. package/dist/esm/utils/constants.d.ts +3 -0
  377. package/dist/esm/utils/constants.d.ts.map +1 -0
  378. package/dist/esm/utils/constants.js +2 -0
  379. package/dist/esm/utils/crypto.d.ts +2 -0
  380. package/dist/esm/utils/crypto.d.ts.map +1 -0
  381. package/dist/esm/utils/crypto.js +10 -0
  382. package/dist/esm/utils/csv.d.ts +6 -0
  383. package/dist/esm/utils/csv.d.ts.map +1 -0
  384. package/dist/esm/utils/csv.js +78 -0
  385. package/dist/esm/utils/dashboard.d.ts +13 -0
  386. package/dist/esm/utils/dashboard.d.ts.map +1 -0
  387. package/dist/esm/utils/dashboard.js +171 -0
  388. package/dist/esm/utils/dataFetcher.d.ts +3 -0
  389. package/dist/esm/utils/dataFetcher.d.ts.map +1 -0
  390. package/dist/esm/utils/dataFetcher.js +205 -0
  391. package/dist/esm/utils/dataProcessing.d.ts +11 -0
  392. package/dist/esm/utils/dataProcessing.d.ts.map +1 -0
  393. package/dist/esm/utils/dataProcessing.js +162 -0
  394. package/dist/esm/utils/dates.d.ts +20 -0
  395. package/dist/esm/utils/dates.d.ts.map +1 -0
  396. package/dist/esm/utils/dates.js +95 -0
  397. package/dist/esm/utils/error.d.ts +5 -0
  398. package/dist/esm/utils/error.d.ts.map +1 -0
  399. package/dist/esm/utils/error.js +8 -0
  400. package/dist/esm/utils/errorProcessing.d.ts +2 -0
  401. package/dist/esm/utils/errorProcessing.d.ts.map +1 -0
  402. package/dist/esm/utils/errorProcessing.js +5 -0
  403. package/dist/esm/utils/filterConstants.d.ts +34 -0
  404. package/dist/esm/utils/filterConstants.d.ts.map +1 -0
  405. package/dist/esm/utils/filterConstants.js +33 -0
  406. package/dist/esm/utils/filterProcessing.d.ts +10 -0
  407. package/dist/esm/utils/filterProcessing.d.ts.map +1 -0
  408. package/dist/esm/utils/filterProcessing.js +232 -0
  409. package/dist/esm/utils/getDomain.d.ts +8 -0
  410. package/dist/esm/utils/getDomain.d.ts.map +1 -0
  411. package/dist/esm/utils/getDomain.js +52 -0
  412. package/dist/esm/utils/logging.d.ts +2 -0
  413. package/dist/esm/utils/logging.d.ts.map +1 -0
  414. package/dist/esm/utils/logging.js +7 -0
  415. package/dist/esm/utils/merge.d.ts +2 -0
  416. package/dist/esm/utils/merge.d.ts.map +1 -0
  417. package/dist/esm/utils/merge.js +18 -0
  418. package/dist/esm/utils/monacoConfig.d.ts +21 -0
  419. package/dist/esm/utils/monacoConfig.d.ts.map +1 -0
  420. package/dist/esm/utils/monacoConfig.js +319 -0
  421. package/dist/esm/utils/paginationProcessing.d.ts +5 -0
  422. package/dist/esm/utils/paginationProcessing.d.ts.map +1 -0
  423. package/dist/esm/utils/paginationProcessing.js +25 -0
  424. package/dist/esm/utils/parserBigQuery.d.ts +6 -0
  425. package/dist/esm/utils/parserBigQuery.d.ts.map +1 -0
  426. package/dist/esm/utils/parserBigQuery.js +52 -0
  427. package/dist/esm/utils/parserPostgres.d.ts +3 -0
  428. package/dist/esm/utils/parserPostgres.d.ts.map +1 -0
  429. package/dist/esm/utils/parserPostgres.js +37 -0
  430. package/dist/esm/utils/pivotConstructor.d.ts +7 -0
  431. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -0
  432. package/dist/esm/utils/pivotConstructor.js +151 -0
  433. package/dist/esm/utils/pivotProcessing.d.ts +17 -0
  434. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  435. package/dist/esm/utils/pivotProcessing.js +135 -0
  436. package/dist/esm/utils/queryConstructor.d.ts +7 -0
  437. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  438. package/dist/esm/utils/queryConstructor.js +226 -0
  439. package/dist/esm/utils/report.d.ts +10 -0
  440. package/dist/esm/utils/report.d.ts.map +1 -0
  441. package/dist/esm/utils/report.js +186 -0
  442. package/dist/esm/utils/schema.d.ts +6 -0
  443. package/dist/esm/utils/schema.d.ts.map +1 -0
  444. package/dist/esm/utils/schema.js +156 -0
  445. package/dist/esm/utils/styles.d.ts +17 -0
  446. package/dist/esm/utils/styles.d.ts.map +1 -0
  447. package/dist/esm/utils/styles.js +16 -0
  448. package/dist/esm/utils/tableProcessing.d.ts +45 -0
  449. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  450. package/dist/esm/utils/tableProcessing.js +301 -0
  451. package/dist/esm/utils/textProcessing.d.ts +6 -0
  452. package/dist/esm/utils/textProcessing.d.ts.map +1 -0
  453. package/dist/esm/utils/textProcessing.js +49 -0
  454. package/dist/esm/utils/validation.d.ts +9 -0
  455. package/dist/esm/utils/validation.d.ts.map +1 -0
  456. package/dist/esm/utils/validation.js +20 -0
  457. package/dist/esm/utils/valueFormatter.d.ts +29 -0
  458. package/dist/esm/utils/valueFormatter.d.ts.map +1 -0
  459. package/dist/esm/utils/valueFormatter.js +342 -0
  460. package/dist/esm/utils/width.d.ts +12 -0
  461. package/dist/esm/utils/width.d.ts.map +1 -0
  462. package/dist/esm/utils/width.js +21 -0
  463. package/package.json +1 -1
@@ -0,0 +1,1312 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState, useContext, useMemo, } from 'react';
3
+ import { ClientContext, DashboardContext, DashboardDataContext, DashboardFiltersContext, SchemaContext, ThemeContext, } from './Context';
4
+ import { getData, getDataFromCloud } from './utils/dataFetcher';
5
+ import { PivotModal, generatePivotTable, isDateField, } from './internals/ReportBuilder/PivotModal';
6
+ import { PivotCard } from './internals/ReportBuilder/PivotList';
7
+ import { ChartDisplay } from './Chart';
8
+ import { MemoizedModal, QuillTextInput, MemoizedButton, MemoizedSecondaryButton, MemoizedHeader, MemoizedLabel, MemoizedDeleteButton, MemoizedText, MemoizedPopover, QuillTableComponent, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillChartBuilderFormContainer, QuillLoadingComponent, } from './components/UiComponents';
9
+ import { mergeComparisonRange } from './utils/merge';
10
+ import { removeDoubleQuotes, snakeAndCamelCaseToTitleCase, } from './utils/textProcessing';
11
+ import { QuillSelectComponent } from './components/QuillSelect';
12
+ import { QuillCard } from './components/QuillCard';
13
+ import { quillFormat } from './utils/valueFormatter';
14
+ import { convertColumnInfoToColumnInternal, convertFieldTypeToJSType, } from './utils/columnProcessing';
15
+ import { createTableNameToTableAliasMap, getColumnsByTableFromASTAndSchema, getSelectFromAST, } from './utils/astProcessing';
16
+ import { getSchemaInfoWithCustomFields } from './utils/schema';
17
+ import { getDateBucketFromRange } from './utils/dates';
18
+ import { validateReport } from './utils/validation';
19
+ import { QuillChartErrorWithAction } from './components/Chart/ChartError';
20
+ import { convertInternalReportToReport } from './utils/report';
21
+ const CHART_TYPES = ['column', 'line', 'table', 'metric', 'bar', 'pie'];
22
+ const POSTGRES_DATE_TYPES = [
23
+ 'timestamp',
24
+ 'date',
25
+ 'timestamptz',
26
+ 'time',
27
+ 'timetz',
28
+ ];
29
+ const CHART_TO_LABELS = {
30
+ column: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
31
+ line: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
32
+ table: {},
33
+ metric: { xAxisLabel: 'Value' },
34
+ bar: { xAxisLabel: 'X-Axis', yAxisLabel: 'Y-Axis' },
35
+ pie: { xAxisLabel: 'Category', yAxisLabel: 'Count' },
36
+ };
37
+ function getPivotMetricOptions(pivot) {
38
+ if (!pivot.rowField) {
39
+ return [
40
+ {
41
+ label: `Pivot Value (${pivot.valueField})`,
42
+ value: pivot.valueField,
43
+ },
44
+ ];
45
+ }
46
+ else {
47
+ return [
48
+ {
49
+ label: `Pivot Row (${pivot.rowField})`,
50
+ value: pivot.rowField,
51
+ },
52
+ ];
53
+ }
54
+ }
55
+ export function createInitialFormData(columns) {
56
+ const firstNumberColumn = columns?.find((col) => numberFormatOptions.includes(col.format));
57
+ const formEmptyState = {
58
+ name: 'My Chart',
59
+ columns: columns.map((col) => {
60
+ return { ...col, label: snakeAndCamelCaseToTitleCase(col.label) };
61
+ }),
62
+ xAxisField: columns?.[0]?.field || '',
63
+ xAxisFormat: columns?.[0]?.format || 'whole_number',
64
+ yAxisFields: [
65
+ {
66
+ field: firstNumberColumn?.field || columns?.[0]?.field || '',
67
+ label: '',
68
+ format: firstNumberColumn?.format || columns?.[0]?.format || 'string',
69
+ },
70
+ ],
71
+ xAxisLabel: '',
72
+ chartType: firstNumberColumn ? 'line' : 'table',
73
+ pivot: null,
74
+ dateField: { table: '', field: '' },
75
+ template: true,
76
+ };
77
+ return formEmptyState;
78
+ }
79
+ function getChartTypeOptions(formData, dashboard) {
80
+ let viableCharts = CHART_TYPES;
81
+ if (dashboard.dateFilter && dashboard.dateFilter.comparison) {
82
+ viableCharts = viableCharts.filter((chart) => !['table', 'metric', 'bar', 'pie'].includes(chart));
83
+ }
84
+ if (formData.pivot && !formData.pivot.rowField) {
85
+ return viableCharts
86
+ .filter((elem) => elem === 'metric' || elem === 'table')
87
+ .map((elem) => ({
88
+ label: elem,
89
+ value: elem,
90
+ }));
91
+ }
92
+ else {
93
+ return viableCharts
94
+ .filter((elem) => !((formData.pivot && elem === 'metric') ||
95
+ (formData.pivot &&
96
+ formData.pivot.columnField &&
97
+ (elem === 'bar' || elem === 'pie'))))
98
+ .map((elem) => ({ label: elem, value: elem }));
99
+ }
100
+ }
101
+ function getTablesHelper(ast, allTables) {
102
+ const tableAliasMap = createTableNameToTableAliasMap(ast);
103
+ const tablesInQuery = Object.values(tableAliasMap);
104
+ // Remove all aliased tables (with statements and subqueries)
105
+ const onlyReferenceTables = allTables
106
+ .filter((table) => tablesInQuery.includes(table.displayName))
107
+ .map((table) => table.displayName);
108
+ let referencedColumns = {};
109
+ // Get non with statement column references
110
+ referencedColumns = getColumnsByTableFromASTAndSchema(ast, allTables, tableAliasMap);
111
+ // With statement column references
112
+ if (ast.with) {
113
+ for (const withStmt of ast.with) {
114
+ const astFrom = withStmt.stmt.from ?? withStmt.stmt.ast.from;
115
+ if (astFrom) {
116
+ const withReferencedColumns = getColumnsByTableFromASTAndSchema(withStmt.stmt.ast ?? withStmt.stmt, allTables, tableAliasMap);
117
+ // @ts-ignore
118
+ Object.keys(withReferencedColumns).forEach((tableName) => {
119
+ if (referencedColumns[tableName]) {
120
+ // @ts-ignore
121
+ referencedColumns[tableName].push(...(withReferencedColumns[tableName] || []));
122
+ }
123
+ else {
124
+ // @ts-ignore
125
+ referencedColumns[tableName] = withReferencedColumns[tableName];
126
+ }
127
+ });
128
+ }
129
+ }
130
+ }
131
+ // Make all the column strings unique
132
+ for (const table in referencedColumns) {
133
+ referencedColumns[table] = Array.from(new Set(referencedColumns[table]));
134
+ }
135
+ const referencedTablesAndColumns = Object.keys(referencedColumns).map((tableName) => {
136
+ return {
137
+ name: tableName,
138
+ columns: referencedColumns[tableName]?.map((column) => {
139
+ return { field: column };
140
+ }) || [],
141
+ };
142
+ });
143
+ const dateFields = allTables
144
+ .filter((table) => onlyReferenceTables.includes(table.displayName))
145
+ .map((table) => {
146
+ return {
147
+ name: table.displayName,
148
+ columns: table.columns
149
+ .filter((column) => POSTGRES_DATE_TYPES.includes(column.fieldType))
150
+ .map((col) => {
151
+ return convertColumnInfoToColumnInternal(col);
152
+ }),
153
+ };
154
+ });
155
+ return { referencedTablesAndColumns, dateFields };
156
+ }
157
+ async function getReferencedTables(client, sqlQuery, dbTables) {
158
+ const resp = await getDataFromCloud(client, `astify`, {
159
+ query: sqlQuery,
160
+ useNewNodeSql: true,
161
+ });
162
+ if (resp.success === false) {
163
+ return getTablesHelper(getSelectFromAST({}), dbTables);
164
+ }
165
+ return getTablesHelper(getSelectFromAST(resp.ast), dbTables);
166
+ }
167
+ function createReportFromForm(formData, report, selectedPivotTable, rows = []) {
168
+ return convertInternalReportToReport({
169
+ ...formData,
170
+ dashboardName: formData.dashboardName || '',
171
+ pivot: formData.pivot,
172
+ id: '',
173
+ order: -1,
174
+ compareRows: report?.compareRows || [],
175
+ filtersApplied: report?.filtersApplied || [],
176
+ queryString: '',
177
+ rows: selectedPivotTable?.rows ?? rows,
178
+ rowCount: report?.rowCount || selectedPivotTable?.rows?.length || rows.length || 0,
179
+ yAxisFields: formData.yAxisFields ?? [],
180
+ pivotColumns: selectedPivotTable?.columns ?? undefined,
181
+ pivotRows: selectedPivotTable?.rows ?? undefined,
182
+ });
183
+ }
184
+ export const numberFormatOptions = [
185
+ 'whole_number',
186
+ 'one_decimal_place',
187
+ 'two_decimal_places',
188
+ 'dollar_amount',
189
+ 'dollar_cents',
190
+ ];
191
+ export const dateFormatOptions = [
192
+ 'MMM_yyyy',
193
+ 'MMM_dd',
194
+ 'MMM_dd_yyyy',
195
+ 'MMM_dd_hh:mm_ap_pm',
196
+ 'hh_ap_pm',
197
+ 'date',
198
+ ];
199
+ const NUMBER_OPTIONS = [
200
+ { value: 'whole_number', label: 'whole number' },
201
+ { value: 'one_decimal_place', label: 'one decimal place' },
202
+ { value: 'two_decimal_places', label: 'two decimal places' },
203
+ { value: 'dollar_amount', label: 'dollar amount' },
204
+ { value: 'dollar_cents', label: 'dollar and cent amount' },
205
+ ];
206
+ const DATE_OPTIONS = [
207
+ { value: 'MMM_yyyy', label: 'month' },
208
+ { value: 'MMM_dd', label: 'day' },
209
+ { value: 'MMM_dd_yyyy', label: 'day and year' },
210
+ { value: 'MMM_dd_hh:mm_ap_pm', label: 'day and time' },
211
+ { value: 'hh_ap_pm', label: 'hour' },
212
+ ];
213
+ const formatOptions = [
214
+ ...NUMBER_OPTIONS,
215
+ ...DATE_OPTIONS,
216
+ { value: 'percent', label: 'percent' },
217
+ { value: 'string', label: 'string' },
218
+ ];
219
+ /**
220
+ * ### Quill Chart Builder with Modal
221
+ *
222
+ * Renders a ChartBuilder component with a modal.
223
+ *
224
+ * @example
225
+ * ```js
226
+ * // Usage without custom components
227
+ * <ChartBuilder />
228
+ * ```
229
+ *
230
+ * @example
231
+ * ```js
232
+ * // You can also pass your own components
233
+ * <ChartBuilder
234
+ * ButtonComponent={MyButton}
235
+ * SecondaryButtonComponent={MySecondaryButton}
236
+ * />
237
+ * ```
238
+ *
239
+ * ### Chart Builder API
240
+ * @see https://docs.quillsql.com/components/chart-builder#with-modal
241
+ */
242
+ export function ChartBuilderWithModal(props) {
243
+ const parentRef = useRef(null);
244
+ const [modalWidth, setModalWidth] = useState(200);
245
+ const [modalHeight, setModalHeight] = useState(200);
246
+ const { isOpen, setIsOpen, title, isHorizontalView } = props;
247
+ const Modal = props.ModalComponent ?? MemoizedModal;
248
+ useEffect(() => {
249
+ function handleResize() {
250
+ const screenSize = window.innerWidth;
251
+ if (screenSize >= 1200) {
252
+ setModalWidth(window.innerWidth - 80);
253
+ }
254
+ else {
255
+ setModalWidth(undefined); // use dynamic width of contents
256
+ }
257
+ setModalHeight(window.innerHeight - 80);
258
+ }
259
+ handleResize();
260
+ window.addEventListener('resize', handleResize);
261
+ return () => {
262
+ window.removeEventListener('resize', handleResize);
263
+ };
264
+ }, []);
265
+ return (_jsx("div", { style: { height: '100%' }, ref: parentRef, children: _jsx(Modal, { isOpen: isOpen, setIsOpen: setIsOpen, title: title || 'Add to dashboard',
266
+ // For isHorizontalView, use full viewport size minus 80px for padding,
267
+ // otherwise use the default layout method of the modal (contents).
268
+ width: isHorizontalView ? modalWidth : undefined, height: isHorizontalView ? modalHeight : undefined, children: _jsx(ChartBuilder, { ...props }) }) }));
269
+ }
270
+ /**
271
+ * ### Quill Chart Builder
272
+ *
273
+ * A simple form that lets users turn a SQL query into a chart, metric, or table
274
+ * and then add that dashboard item into one of their dashboards.
275
+ *
276
+ * @example
277
+ * ```js
278
+ * // Usage without custom components
279
+ * <ChartBuilder />
280
+ * ```
281
+ *
282
+ * @example
283
+ * ```js
284
+ * // You can also pass your own components
285
+ * <ChartBuilder
286
+ * ButtonComponent={MyButton}
287
+ * SecondaryButtonComponent={MySecondaryButton}
288
+ * />
289
+ * ```
290
+ *
291
+ * ### Chart Builder API
292
+ * @see https://docs.quillsql.com/components/chart-builder
293
+ */
294
+ export default function ChartBuilder({ TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, 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, pivot, setIsOpen, rows, columns, query, queryNoDateColumn, dateRange: dr, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, showDashboardDropdown = true, onAddToDashboardComplete, onDelete, report = undefined, recommendedPivots: rp = [], createdPivots: cp = [], destinationDashboard, dateColumn, buttonLabel, organizationName, pivotData, hideDeleteButton = false, hideSubmitButton = false, hideDateRangeFilter = false, initialUniqueValues, pivotRecommendationsEnabled = true, onSortChange, onPageChange, rowCount, isLoading, isComparison, onClickChartElement, }) {
295
+ const dateRange = dr;
296
+ const [client] = useContext(ClientContext);
297
+ const [theme] = useContext(ThemeContext);
298
+ const [schema, setSchema] = useContext(SchemaContext);
299
+ const [windowWidth, setWindowWidth] = useState(1200);
300
+ const [isSubmitting, setIsSubmitting] = useState(false);
301
+ const [pivotCardWidth, setPivotCardWidth] = useState(665);
302
+ const [chartTypes, setChartTypes] = useState(CHART_TYPES.map((type) => {
303
+ return { label: type, value: type };
304
+ }));
305
+ const [formWidth, setFormWidth] = useState(665);
306
+ const inputRef = useRef(null);
307
+ const selectRef = useRef(null);
308
+ const [, dispatch] = useContext(DashboardContext);
309
+ const [processedColumns, setProcessedColumns] = useState(columns);
310
+ const parentRef = useRef(null);
311
+ const deleteRef = useRef(null);
312
+ const modalPadding = 20;
313
+ const deleteButtonMargin = -12;
314
+ const validationHelper = (formData, dashboard, dateField, tables) => {
315
+ const issues = validateReport(formData, dashboard, dateField || defaultDateField, tables || allTables);
316
+ if (issues.length > 0) {
317
+ setFilterIssues(issues);
318
+ }
319
+ else {
320
+ setFilterIssues([]);
321
+ }
322
+ };
323
+ useEffect(() => {
324
+ if (schema) {
325
+ const newProcessedColumns = columns.map((col) => {
326
+ if (col.jsType) {
327
+ return col;
328
+ }
329
+ const newCol = { ...col };
330
+ let foundColumn;
331
+ schema.forEach((table) => {
332
+ if (table.columns) {
333
+ const matchedColumn = table.columns.find((c) => c.name === col.field);
334
+ if (matchedColumn) {
335
+ foundColumn = matchedColumn;
336
+ }
337
+ }
338
+ });
339
+ if (!foundColumn) {
340
+ return col;
341
+ }
342
+ newCol.fieldType = foundColumn.fieldType;
343
+ newCol.jsType = convertFieldTypeToJSType(foundColumn.fieldType);
344
+ return newCol;
345
+ });
346
+ setProcessedColumns(newProcessedColumns);
347
+ }
348
+ }, [schema]);
349
+ useEffect(() => {
350
+ const handleResize = () => setWindowWidth(window.innerWidth);
351
+ handleResize();
352
+ window.addEventListener('resize', handleResize);
353
+ return () => {
354
+ window.removeEventListener('resize', handleResize);
355
+ };
356
+ }, []);
357
+ useEffect(() => {
358
+ const handleResize = () => {
359
+ // The pivot card should be the same width as the row of inputs
360
+ // above it (an input, two selects, plus the gaps between them).
361
+ if (inputRef.current && selectRef.current) {
362
+ const inputSize = inputRef.current?.getBoundingClientRect();
363
+ const selectSize = selectRef.current?.getBoundingClientRect();
364
+ const selectWidth = selectSize.width;
365
+ const showDash = showDashboardDropdown && !destinationDashboard;
366
+ const spaceBetween = selectSize.left - inputSize.right;
367
+ const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
368
+ const width = inputSize.width + 2 * gap + 2 * selectWidth;
369
+ setPivotCardWidth(width);
370
+ // Calculate the form width by adding the width of the delete button
371
+ const deleteSize = deleteRef.current?.getBoundingClientRect();
372
+ const deleteWidth = deleteSize?.width ?? 0;
373
+ setFormWidth(width + deleteWidth);
374
+ }
375
+ };
376
+ handleResize();
377
+ }, [isOpen]);
378
+ useEffect(() => {
379
+ const handleResize = () => {
380
+ // The pivot card should be the same width as the row of inputs
381
+ // above it (an input, two selects, plus the gaps between them).
382
+ if (inputRef.current && selectRef.current) {
383
+ const inputSize = inputRef.current?.getBoundingClientRect();
384
+ const selectSize = selectRef.current?.getBoundingClientRect();
385
+ const selectWidth = selectSize.width;
386
+ const showDash = showDashboardDropdown && !destinationDashboard;
387
+ const spaceBetween = selectSize.left - inputSize.right;
388
+ const gap = showDash ? (spaceBetween - selectWidth) / 2 : spaceBetween;
389
+ const width = inputSize.width + 2 * gap + 2 * selectWidth;
390
+ setPivotCardWidth(width);
391
+ // Calculate the form width by adding the width of the delete button
392
+ const deleteSize = deleteRef.current?.getBoundingClientRect();
393
+ const deleteWidth = deleteSize?.width ?? 0;
394
+ setFormWidth(width + deleteWidth);
395
+ }
396
+ };
397
+ handleResize();
398
+ window.addEventListener('resize', handleResize);
399
+ return () => {
400
+ window.removeEventListener('resize', handleResize);
401
+ };
402
+ }, []);
403
+ // get dashboards
404
+ const [dashboardOptions, setDashboardOptions] = useState([]);
405
+ const [defaultDashboardName, setDefaultDashboardName] = useState(destinationDashboard || report?.dashboardName || '');
406
+ const { dashboardFilters } = useContext(DashboardFiltersContext);
407
+ const { dashboardData } = useContext(DashboardDataContext);
408
+ const specificDashboardFilter = useMemo(() => {
409
+ return dashboardFilters.filter((f) => f && defaultDashboardName === f.dashboardName);
410
+ }, [dashboardFilters]);
411
+ const [showFilterModal, setShowFilterModal] = useState(false);
412
+ const [filterIssues, setFilterIssues] = useState([]);
413
+ const [showPivotPopover, setShowPivotPopover] = useState(false);
414
+ const [isEdittingPivot, setIsEdittingPivot] = useState(false);
415
+ const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
416
+ const [tableName, setTableName] = useState(undefined);
417
+ const selectedTable = schema?.find((t) => t.displayName === tableName);
418
+ const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
419
+ const [loadingFormData, setLoadingFormData] = useState(false);
420
+ const [triggeredEditChart, setTriggeredEditChart] = useState(false);
421
+ const [createdPivots, setCreatedPivots] = useState(pivot ? [pivot] : report?.pivot ? [report.pivot] : cp);
422
+ const [recommendedPivots, setRecommendedPivots] = useState(rp);
423
+ const [pivotRowField, setPivotRowField] = useState(pivot?.rowField);
424
+ const [pivotColumnField, setPivotColumnField] = useState(pivot?.columnField);
425
+ const [pivotValueField, setPivotValueField] = useState(pivot?.valueField);
426
+ const [pivotAggregation, setPivotAggregation] = useState(pivot?.aggregationType);
427
+ // initial state is the fields array passed in, but can eventually be changed to be the pivot fields
428
+ const [dateFieldOptions, setDateFieldOptions] = useState([]);
429
+ const [allTables, setAllTables] = useState([]);
430
+ const [customFieldTableRef, setCustomFieldTableRef] = useState(false);
431
+ const [referencedColumns, setReferencedColumns] = useState({});
432
+ const [defaultDateField, setDefaultDateField] = useState({
433
+ table: dateFieldOptions[0]?.name || '',
434
+ field: dateFieldOptions[0]?.columns[0]?.name || '',
435
+ });
436
+ const firstNumberColumn = columns?.find((col) => numberFormatOptions.includes(col.format));
437
+ const formEmptyState = {
438
+ name: 'My Chart',
439
+ dashboardName: dashboardOptions[0]?.label || '',
440
+ columns: columns.map((col) => {
441
+ return { ...col, label: snakeAndCamelCaseToTitleCase(col.label) };
442
+ }),
443
+ xAxisField: columns?.[0]?.field || '',
444
+ xAxisFormat: columns?.[0]?.format || 'string',
445
+ yAxisFields: [
446
+ {
447
+ field: firstNumberColumn?.field || columns?.[0]?.field || '',
448
+ label: '',
449
+ format: firstNumberColumn?.format || columns?.[0]?.format || 'string',
450
+ },
451
+ ],
452
+ xAxisLabel: '',
453
+ chartType: firstNumberColumn ? 'line' : 'table',
454
+ pivot: null,
455
+ dateField: defaultDateField,
456
+ template: true,
457
+ };
458
+ const updateDashboardFilters = async (dashboardName) => {
459
+ if (dashboardData && dashboardData[dashboardName]) {
460
+ return dashboardData[dashboardName];
461
+ }
462
+ const { queryEndpoint, queryHeaders, publicKey, customerId, withCredentials, } = client;
463
+ if (queryEndpoint) {
464
+ const response = await fetch(queryEndpoint, {
465
+ method: 'POST',
466
+ headers: {
467
+ ...queryHeaders,
468
+ 'Content-Type': 'application/json',
469
+ },
470
+ body: JSON.stringify({
471
+ metadata: {
472
+ orgId: customerId || '*',
473
+ task: 'config',
474
+ name: dashboardName,
475
+ clientId: publicKey,
476
+ databaseType: client.databaseType,
477
+ useNewNodeSql: true,
478
+ },
479
+ }),
480
+ credentials: withCredentials ? 'include' : 'omit', // If withCredentials is true, set to 'include'. Otherwise, set to 'omit'.
481
+ });
482
+ const responseData = (await response.json()).data;
483
+ if (responseData) {
484
+ return responseData;
485
+ }
486
+ }
487
+ };
488
+ const pivotFormData = (pivot) => {
489
+ const yAxisField = pivot.columnField || pivot.valueField;
490
+ const yAxisLabel = report?.yAxisFields && report?.yAxisFields?.length > 0
491
+ ? // @ts-ignore
492
+ report.yAxisFields[0].label
493
+ : pivot.valueField;
494
+ // date labels for pivots should be treated like strings since they are
495
+ const yAxisIsDate = pivot.columnField
496
+ ? isDateField(pivot.columnFieldType || '')
497
+ : false;
498
+ const chartType = report?.chartType ?? (pivot.rowField ? 'column' : 'metric');
499
+ return {
500
+ pivot,
501
+ chartType: chartType,
502
+ xAxisField: pivot.rowField ? pivot.rowField : pivot.valueField,
503
+ xAxisFormat: isDateField(pivot.rowFieldType)
504
+ ? 'string'
505
+ : columns.find((col) => col.field === pivot.rowField)?.format ||
506
+ report?.xAxisFormat ||
507
+ 'whole_number',
508
+ xAxisLabel: report?.xAxisLabel || pivot.rowField,
509
+ yAxisFields: [
510
+ {
511
+ field: yAxisField,
512
+ label: yAxisLabel,
513
+ format: yAxisIsDate
514
+ ? 'string'
515
+ : report?.yAxisFields && report?.yAxisFields?.length > 0
516
+ ? // @ts-ignore
517
+ report?.yAxisFields[0].format
518
+ : columns.find((col) => col.field === pivot.valueField)?.format ||
519
+ 'whole_number',
520
+ },
521
+ ],
522
+ };
523
+ };
524
+ const formFormDataFromReport = (report) => {
525
+ let pivotData = {};
526
+ let dateField = defaultDateField;
527
+ if (pivot) {
528
+ pivotData = pivotFormData(pivot);
529
+ }
530
+ if (report) {
531
+ dateField = report.dateField || defaultDateField;
532
+ }
533
+ return {
534
+ ...formEmptyState,
535
+ ...report,
536
+ ...pivotData,
537
+ ...(destinationDashboard && { dashboardName: destinationDashboard }),
538
+ dateField: dateField,
539
+ };
540
+ };
541
+ const [formData, setFormData] = useState(formFormDataFromReport(report));
542
+ useEffect(() => {
543
+ if (!loadingFormData && triggeredEditChart) {
544
+ editChart();
545
+ }
546
+ }, [loadingFormData]);
547
+ useEffect(() => {
548
+ async function getFormData() {
549
+ setLoadingFormData(true);
550
+ const curFormData = formData;
551
+ let dashNames = Object.keys(dashboardData).map((dashboard) => {
552
+ return dashboard;
553
+ }) ?? [];
554
+ if (dashNames.length === 0) {
555
+ const resp = await getDataFromCloud(client, `dashnames/${client.publicKey}/`, null, 'GET');
556
+ dashNames = resp.dashboardNames;
557
+ }
558
+ let dashboardOptions = dashNames
559
+ .filter((elem) => elem !== null)
560
+ .map((key) => ({ label: key, value: key }));
561
+ if (!dashboardOptions.length) {
562
+ dashboardOptions = [
563
+ { label: 'New - Dashboard', value: 'New - Dashboard' },
564
+ ];
565
+ }
566
+ if (destinationDashboard) {
567
+ dashboardOptions = [
568
+ { label: destinationDashboard, value: destinationDashboard },
569
+ ];
570
+ }
571
+ let dashboardName = report?.dashboardName
572
+ ? report.dashboardName
573
+ : dashboardOptions[0]?.label || '';
574
+ if (destinationDashboard) {
575
+ dashboardName = destinationDashboard;
576
+ }
577
+ const curDashboard = await updateDashboardFilters(dashboardName);
578
+ setDashboardOptions(dashboardOptions);
579
+ curFormData.dashboardName = dashboardName;
580
+ setDefaultDashboardName(dashboardName ??
581
+ (report ? report?.dashboardName : dashboardOptions[0]?.label));
582
+ let curSchemaData = schema;
583
+ if (!curSchemaData || curSchemaData.length === 0) {
584
+ const { schemaData } = await getSchemaInfoWithCustomFields(client, 'cb');
585
+ curSchemaData = schemaData;
586
+ setSchema(curSchemaData);
587
+ }
588
+ if (!query) {
589
+ setLoadingFormData(false);
590
+ return;
591
+ }
592
+ const result = await getReferencedTables(client, query, curSchemaData);
593
+ setDateFieldOptions(result.dateFields);
594
+ if (result.dateFields[0] && result.dateFields[0].columns[0]) {
595
+ setDefaultDateField({
596
+ table: result.dateFields[0].name,
597
+ field: result.dateFields[0].columns[0].field,
598
+ });
599
+ }
600
+ // check if the referenced table is a table with custom field info.. If so block template settings
601
+ const tableNames = result.referencedTablesAndColumns.map((table) => table.name);
602
+ setAllTables(tableNames);
603
+ let customFieldUsage = false;
604
+ for (const table of tableNames) {
605
+ const tableInfo = curSchemaData.find((elem) => elem.name === table);
606
+ if (tableInfo?.customFieldInfo) {
607
+ customFieldUsage = true;
608
+ break;
609
+ }
610
+ }
611
+ setCustomFieldTableRef(customFieldUsage && client.customerId && client.customerId !== '*');
612
+ const referencedColumns = result.referencedTablesAndColumns.reduce((acc, table) => {
613
+ acc[table.name] = table.columns.map((col) => col.field);
614
+ return acc;
615
+ }, {});
616
+ setReferencedColumns(referencedColumns);
617
+ setTableName(result.dateFields[0]?.name);
618
+ const dateField = {
619
+ table: result.dateFields[0]?.name || '',
620
+ field: result.dateFields[0]?.columns?.find((elem) => elem.field === dateColumn)?.field || '',
621
+ };
622
+ let isTemplate = curFormData.template;
623
+ if (customFieldUsage) {
624
+ isTemplate = false;
625
+ }
626
+ curFormData.dashboardName =
627
+ report && report.dashboardName
628
+ ? report?.dashboardName
629
+ : dashboardOptions[0]?.label;
630
+ curFormData.template = isTemplate;
631
+ if (!curFormData.dateField) {
632
+ curFormData.dateField = { field: '', table: '' };
633
+ }
634
+ if (!curFormData.dateField.field || !curFormData.dateField.table) {
635
+ if (dateField && dateField.field) {
636
+ curFormData.dateField = dateField;
637
+ }
638
+ }
639
+ setFormData(curFormData);
640
+ validationHelper(curFormData, curDashboard, curFormData.dateField ?? dateField, tableNames);
641
+ setLoadingFormData(false);
642
+ }
643
+ getFormData();
644
+ }, []);
645
+ const [selectedPivotTable, setSelectedPivotTable] = useState(pivotData || undefined);
646
+ const fetchPivotData = async (pivot, uniqueValues, overrideDateRange) => {
647
+ if (pivot && rows) {
648
+ const dateFilter = report
649
+ ? report.filtersApplied.find((filter) => {
650
+ return filter.filterType === 'date_range';
651
+ })
652
+ : undefined;
653
+ let dateBucket = undefined;
654
+ if (overrideDateRange) {
655
+ dateBucket = getDateBucketFromRange(overrideDateRange);
656
+ }
657
+ setSelectedPivotTable(await generatePivotTable(pivot, rows, overrideDateRange ?? dateRange, isComparison ?? false, -1, dateFilter ? dateFilter.comparisonRange : undefined, dateBucket, report, client, uniqueValues));
658
+ }
659
+ else {
660
+ setSelectedPivotTable(undefined);
661
+ }
662
+ };
663
+ const formattedRows = useMemo(() => {
664
+ if (selectedPivotTable &&
665
+ selectedPivotTable.columns &&
666
+ formData.chartType === 'table') {
667
+ const columns = selectedPivotTable.columns;
668
+ columns.forEach((col, index) => {
669
+ // ADD THE RIGHT FIELD TYPE FOR THE VALUE COLUMNS
670
+ if ((formData.pivot?.valueFieldType ||
671
+ ['min', 'max'].includes(formData.pivot?.aggregationType || '')) &&
672
+ index !== 0) {
673
+ col.format = formData?.pivot?.valueFieldType || 'two_decimal_places';
674
+ }
675
+ });
676
+ return selectedPivotTable.rows.map((row) => {
677
+ return columns.reduce((formattedRow, column) => {
678
+ // Apply the format function to each field in the row
679
+ const formattedValue = quillFormat({
680
+ value: row[column.field],
681
+ format: column.format,
682
+ });
683
+ formattedRow[column.field] = formattedValue;
684
+ return formattedRow;
685
+ }, {});
686
+ });
687
+ }
688
+ else {
689
+ if (!rows)
690
+ return [];
691
+ return rows.map((row) => {
692
+ return formData.columns.reduce((formattedRow, column) => {
693
+ // Apply the format function to each field in the row
694
+ const formattedValue = quillFormat({
695
+ value: row[column.field],
696
+ format: column.format,
697
+ });
698
+ formattedRow[column.field] = formattedValue;
699
+ return formattedRow;
700
+ }, {});
701
+ });
702
+ }
703
+ }, [
704
+ selectedPivotTable,
705
+ formData.columns,
706
+ formData.chartType,
707
+ rows,
708
+ formData.pivot,
709
+ ]);
710
+ const handleChange = async (value, fieldName, index) => {
711
+ let updatedForm = { ...formData };
712
+ try {
713
+ // WE NEED TO REPROCESS THE PIVOT TABLE IF THE PIVOT COLUMN CHANGES
714
+ // WE NEED TO UPDATE BOTH VALUEFIELDTYPE AND COLUMN FIELD TYPES
715
+ if (fieldName === 'pivotColumn') {
716
+ // CAN'T EDIT THE TYPE OF THE RowField
717
+ if (index === 0) {
718
+ return;
719
+ }
720
+ const updatedPivot = {
721
+ ...formData.pivot,
722
+ valueFieldType: value,
723
+ };
724
+ // @ts-ignore
725
+ updatedForm.pivot = updatedPivot;
726
+ }
727
+ else if (index !== undefined) {
728
+ // For dynamic array fields
729
+ const [field, subfield] = fieldName.split('.');
730
+ // @ts-ignore
731
+ const updatedArray = formData[field].map((item, i) => i === index ? { ...item, [subfield]: value } : item);
732
+ updatedForm = { ...formData, [field]: updatedArray };
733
+ setFormData({ ...formData, [field]: updatedArray });
734
+ }
735
+ else if (fieldName.includes('.')) {
736
+ // For nested fields
737
+ const [field, subfield] = fieldName.split('.');
738
+ if (field === 'pivot' && subfield !== '') {
739
+ const subfieldTypeFieldName = subfield + 'Type';
740
+ if (value.length) {
741
+ const subFieldType = columns.find((columns) => columns.field === value).fieldType;
742
+ updatedForm = {
743
+ ...updatedForm,
744
+ // @ts-ignore
745
+ [field]: {
746
+ ...updatedForm[field],
747
+ [subfield]: value,
748
+ [subfieldTypeFieldName]: subFieldType,
749
+ },
750
+ };
751
+ }
752
+ else {
753
+ updatedForm = {
754
+ ...formData,
755
+ // @ts-ignore
756
+ [field]: {
757
+ ...formData[field],
758
+ [subfield]: '',
759
+ [subfieldTypeFieldName]: '',
760
+ },
761
+ };
762
+ }
763
+ }
764
+ else if (field === 'dateField' &&
765
+ subfield === 'table' &&
766
+ !formData.dateField.field) {
767
+ const field = schema?.find((elem) => elem.name === value)
768
+ ?.columns?.[0]?.name;
769
+ updatedForm.dateField = {
770
+ // @ts-ignore
771
+ ...updatedForm[field],
772
+ [subfield]: value,
773
+ field: field,
774
+ };
775
+ }
776
+ updatedForm = {
777
+ ...updatedForm,
778
+ // @ts-ignore
779
+ [field]: { ...updatedForm[field], [subfield]: value },
780
+ };
781
+ }
782
+ else {
783
+ // For simple fields
784
+ updatedForm = { ...updatedForm, [fieldName]: value };
785
+ }
786
+ let dashboardName = updatedForm.dashboardName;
787
+ if (fieldName === 'dashboardName') {
788
+ dashboardName = value;
789
+ }
790
+ validationHelper(updatedForm, dashboardData[dashboardName || '']);
791
+ setChartTypes(getChartTypeOptions(updatedForm, dashboardData[dashboardName || '']));
792
+ }
793
+ catch (e) {
794
+ updatedForm = { ...updatedForm, [fieldName]: value };
795
+ }
796
+ setFormData(updatedForm);
797
+ };
798
+ const handleAddPivot = async (pivot, uniqueValues, dateRange, pivotData) => {
799
+ const newPivotFormData = pivotFormData(pivot);
800
+ // Only keep the old chart type if the shapes of the pivots are the same
801
+ // since the valid chart types for some pivots might have changed (eg. going
802
+ // from a 1D pivot to a 2D pivot would make bar lists not an option).
803
+ // They don't have to have the same value, just same 'truthiness'.
804
+ const isPivotSameShape = Boolean(formData.pivot?.rowField) === Boolean(pivot.rowField) &&
805
+ Boolean(formData.pivot?.columnField) === Boolean(pivot.columnField);
806
+ const isNewChartType = formData.chartType !== newPivotFormData.chartType;
807
+ const keepOldChartType = isNewChartType && isPivotSameShape;
808
+ if (pivotData) {
809
+ setSelectedPivotTable({
810
+ rows: pivotData.rows,
811
+ columns: pivotData.columns,
812
+ });
813
+ }
814
+ else {
815
+ await fetchPivotData(pivot, uniqueValues, dateRange);
816
+ }
817
+ setFormData((formData) => ({
818
+ ...formData,
819
+ ...newPivotFormData,
820
+ ...(keepOldChartType && { chartType: formData.chartType }),
821
+ }));
822
+ };
823
+ const handleDeletePivot = () => {
824
+ if (!formData.pivot) {
825
+ return;
826
+ }
827
+ setFormData({
828
+ ...formEmptyState,
829
+ dashboardName: formData.dashboardName,
830
+ pivot: null,
831
+ });
832
+ setSelectedPivotTable(undefined);
833
+ };
834
+ const handleAddField = (fieldName) => {
835
+ if (fieldName === 'columns') {
836
+ setFormData({
837
+ ...formData,
838
+ // @ts-ignore
839
+ columns: [...formData.columns, { label: '', field: '', format: '' }],
840
+ });
841
+ }
842
+ else if (fieldName === 'yAxisFields') {
843
+ setFormData({
844
+ ...formData,
845
+ yAxisFields: [
846
+ ...formData.yAxisFields,
847
+ // @ts-ignore
848
+ { label: '', field: '', chartType: '', format: '' },
849
+ ],
850
+ });
851
+ }
852
+ else if (fieldName === 'pivot') {
853
+ setFormData({
854
+ ...formData,
855
+ pivot: {
856
+ title: '',
857
+ rowField: '',
858
+ rowFieldType: '',
859
+ columnField: '',
860
+ columnFieldType: '',
861
+ valueField: '',
862
+ aggregationType: 'sum',
863
+ },
864
+ });
865
+ }
866
+ };
867
+ const handleRemoveField = (fieldName, index) => {
868
+ if (fieldName === 'pivot') {
869
+ setFormData({
870
+ ...formData,
871
+ pivot: null,
872
+ });
873
+ return;
874
+ }
875
+ // @ts-ignore
876
+ const updatedArray = formData[fieldName].filter((_, i) => i !== index);
877
+ setFormData({ ...formData, [fieldName]: updatedArray });
878
+ };
879
+ const handleSubmit = (event) => {
880
+ event.preventDefault();
881
+ };
882
+ const deleteChart = async () => {
883
+ if (!report?.id || !client) {
884
+ return;
885
+ }
886
+ const { publicKey, customerId } = client;
887
+ const cloudBody = {
888
+ dashboardItemId: report.id,
889
+ };
890
+ const searchParams = new URLSearchParams(customerId
891
+ ? {
892
+ clientId: publicKey,
893
+ customerId: customerId,
894
+ }
895
+ : { clientId: publicKey }).toString();
896
+ const resp = await getDataFromCloud(client, `deletedash/${publicKey}/${customerId}/?${searchParams}`, cloudBody);
897
+ if (resp) {
898
+ if (onDelete) {
899
+ onDelete();
900
+ }
901
+ }
902
+ setIsOpen(false);
903
+ setIsSubmitting(false);
904
+ };
905
+ const editChart = async () => {
906
+ if (isSubmitting) {
907
+ setTriggeredEditChart(false);
908
+ return;
909
+ }
910
+ setIsSubmitting(true);
911
+ const { publicKey, customerId, databaseType } = client;
912
+ if (!client) {
913
+ setTriggeredEditChart(false);
914
+ return;
915
+ }
916
+ // If the dashbaordItem is a template but the editor isn't an admin, create a new dashboardItem and set the template to false
917
+ let dashboardItemId = report ? report.id : undefined;
918
+ if (report && !showAccessControlOptions && formData.template) {
919
+ dashboardItemId = undefined;
920
+ }
921
+ const cloudBody = {
922
+ ...formData,
923
+ ...(formData.dateField?.table
924
+ ? {}
925
+ : { dateField: { ...defaultDateField } }),
926
+ ...(formData.dashboardName
927
+ ? {}
928
+ : { dashboardName: defaultDashboardName }),
929
+ dashboardItemId,
930
+ query: queryNoDateColumn || query,
931
+ queryString: queryNoDateColumn || query,
932
+ pivot: formData.pivot,
933
+ referencedTables: allTables,
934
+ referencedColumns,
935
+ template: report && !showAccessControlOptions && formData.template
936
+ ? false
937
+ : formData.template,
938
+ customerId: customerId || '*',
939
+ useNewNodeSql: true,
940
+ };
941
+ // @ts-ignore
942
+ if (cloudBody['rows']) {
943
+ // @ts-ignore
944
+ delete cloudBody['rows'];
945
+ // @ts-ignore
946
+ delete cloudBody['compareRows'];
947
+ }
948
+ // add orgId: customerId if present for hostedBody
949
+ // set defaultDateField if date field not present
950
+ const hostedBody = {
951
+ metadata: {
952
+ task: 'create',
953
+ clientId: publicKey,
954
+ databaseType: databaseType,
955
+ ...cloudBody,
956
+ orgId: customerId || '*',
957
+ useNewNodeSql: true,
958
+ },
959
+ };
960
+ const searchParams = new URLSearchParams(customerId
961
+ ? {
962
+ clientId: publicKey,
963
+ customerId: customerId,
964
+ }
965
+ : { clientId: publicKey }).toString();
966
+ const resp = await getData(client, `dashedit2?${searchParams}`, 'same-origin', hostedBody, cloudBody);
967
+ if (resp && resp.name !== 'error') {
968
+ if (resp.compareRows) {
969
+ mergeComparisonRange(resp);
970
+ }
971
+ dispatch({
972
+ type: 'UPDATE_DASHBOARD_ITEM',
973
+ id: resp._id,
974
+ data: {
975
+ ...resp,
976
+ rows,
977
+ columns,
978
+ pivotRows: selectedPivotTable?.rows || undefined,
979
+ pivotColumns: selectedPivotTable?.columns || undefined,
980
+ filtersApplied: specificDashboardFilter,
981
+ triggerReload: true,
982
+ },
983
+ });
984
+ }
985
+ setIsOpen(false);
986
+ setIsSubmitting(false);
987
+ setTriggeredEditChart(false);
988
+ if (onAddToDashboardComplete) {
989
+ onAddToDashboardComplete({
990
+ ...resp,
991
+ rows,
992
+ columns,
993
+ filtersApplied: specificDashboardFilter,
994
+ });
995
+ }
996
+ };
997
+ // Prevent horizontal view on small screens.
998
+ isHorizontalView = windowWidth < 1200 ? false : isHorizontalView;
999
+ if (!schema) {
1000
+ return null;
1001
+ }
1002
+ return (_jsxs("div", { style: {
1003
+ width: '100%',
1004
+ height: '100%',
1005
+ display: 'flex',
1006
+ flexDirection: 'column',
1007
+ flexGrow: 1,
1008
+ }, children: [_jsxs("div", { id: "quill-chart-modal", style: {
1009
+ width: '100%',
1010
+ height: '100%',
1011
+ maxWidth: '100%',
1012
+ display: 'flex',
1013
+ padding: modalPadding,
1014
+ gap: '20px',
1015
+ flexDirection: isHorizontalView ? 'row' : 'column',
1016
+ boxSizing: 'border-box',
1017
+ }, children: [_jsxs("div", { style: {
1018
+ display: 'flex',
1019
+ flexDirection: 'column',
1020
+ gap: '20px',
1021
+ height: isHorizontalView || !isOpen ? '100%' : 800,
1022
+ ...(isHorizontalView && {
1023
+ flexGrow: 1,
1024
+ maxWidth: !isOpen ? '100%' : `calc(100% - ${formWidth}px - 20px)`, // width of left sidebar plus gap
1025
+ }),
1026
+ ...(!isHorizontalView && isOpen && { width: formWidth }),
1027
+ }, children: [report?.adminError || report?.error ? (_jsx(ErrorComponent, { label: report.adminError || report.error, onClick: onClickChartError })) : (((!isHorizontalView && windowWidth >= 1200) ||
1028
+ formData.chartType !== 'table') && (_jsx(ChartDisplay, { reportId: report ? report.id : undefined, config: createReportFromForm(formData, report, selectedPivotTable, rows), scrollable: true, colors: theme.chartColors, loading: isLoading ? true : false, hideDateRangeFilter: hideDateRangeFilter, containerStyle: {
1029
+ width: '100%',
1030
+ height: formData.chartType === 'metric'
1031
+ ? 100
1032
+ : isHorizontalView || !isOpen
1033
+ ? showTableFormatOptions
1034
+ ? 'calc(50% - 10px)'
1035
+ : 'calc(100% - 10px)'
1036
+ : 400,
1037
+ ...(isHorizontalView && { flexGrow: 1 }),
1038
+ }, onClickChartElement: onClickChartElement }))),
1039
+ // Make sure to display non-pivoted table when using pivot chart
1040
+ showTableFormatOptions &&
1041
+ (isHorizontalView || (!isOpen && windowWidth < 1200)) && (_jsx("div", { style: {
1042
+ width: '100%',
1043
+ height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
1044
+ flexGrow: 1,
1045
+ }, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1046
+ onPageChange && onPageChange(page);
1047
+ }, onSortChange: (sort) => {
1048
+ onSortChange && onSortChange(sort);
1049
+ }, rowCount: rowCount, isLoading: isLoading })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1050
+ ? selectedPivotTable.columns
1051
+ : formData.columns, onPageChange: (page) => {
1052
+ onPageChange && onPageChange(page);
1053
+ }, onSortChange: (sort) => {
1054
+ onSortChange && onSortChange(sort);
1055
+ }, rowCount: rowCount, isLoading: isLoading })) }))] }), isOpen && (_jsxs("form", { ref: parentRef, id: "quill-chart-form", onSubmit: handleSubmit, style: {
1056
+ display: 'flex',
1057
+ flexDirection: 'column',
1058
+ gap: 20,
1059
+ ...(isHorizontalView && {
1060
+ height: '100%',
1061
+ minWidth: formWidth,
1062
+ maxWidth: formWidth,
1063
+ width: formWidth,
1064
+ }),
1065
+ ...(windowWidth < 1200 && {
1066
+ width: formWidth,
1067
+ paddingTop: modalPadding,
1068
+ paddingBottom: modalPadding,
1069
+ }),
1070
+ }, children: [_jsxs(FormContainer, { children: [_jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { ref: inputRef, style: { display: 'flex', flexDirection: 'column' }, children: _jsx(TextInputComponent, { 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) => {
1071
+ handleChange(e.target.value, 'dashboardName');
1072
+ await updateDashboardFilters(e.target.value);
1073
+ }, options: dashboardOptions.map((elem) => ({
1074
+ label: elem.label,
1075
+ value: elem.label,
1076
+ })), 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'),
1077
+ // filter out metric for all pivots
1078
+ // filter out bar and pie for row and column pivot
1079
+ options: chartTypes, width: 200 }) })] }), _jsxs("div", { style: {
1080
+ display: 'flex',
1081
+ flexDirection: 'column',
1082
+ gap: 6,
1083
+ }, children: [_jsx(HeaderComponent, { label: "Pivot" }), _jsxs("div", { style: { fontFamily: theme?.fontFamily }, children: [_jsx("div", { style: {
1084
+ maxWidth: 200,
1085
+ // marginTop: 6,
1086
+ display: 'flex',
1087
+ flexDirection: 'column',
1088
+ }, children: _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: selectedTable, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, theme: theme, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processedColumns, triggerButtonText: 'Add pivot +', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: handleDeletePivot, selectPivot: handleAddPivot, dateRange: dateRange, selectPivotOnEdit: true, showTrigger: !formData.pivot, query: query, pivotCountRequest: 4, initialUniqueValues: initialUniqueValues, initialSelectedPivotTable: selectedPivotTable, pivotRecommendationsEnabled: pivotRecommendationsEnabled, report: report }) }), formData.pivot && selectedPivotTable && (_jsx("div", { children: _jsx("div", { style: { width: pivotCardWidth }, children: _jsx(PivotCard, { pivotTable: {
1089
+ pivot: formData.pivot,
1090
+ rows: selectedPivotTable?.rows,
1091
+ columns: selectedPivotTable?.columns,
1092
+ }, theme: theme, index: 0, onSelectPivot: () => {
1093
+ setIsEdittingPivot(true);
1094
+ setShowPivotPopover(true);
1095
+ setPivotRowField(formData.pivot?.rowField);
1096
+ setPivotColumnField(formData.pivot?.columnField);
1097
+ setPivotValueField(formData.pivot?.valueField);
1098
+ setPivotAggregation(formData.pivot?.aggregationType);
1099
+ setPivotPopUpTitle('Edit pivot');
1100
+ }, 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: {
1101
+ display: 'flex',
1102
+ flexDirection: 'column',
1103
+ }, 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
1104
+ ? getPivotMetricOptions(formData.pivot)
1105
+ : columns.map((elem) => ({
1106
+ label: elem.field,
1107
+ value: elem.field,
1108
+ })), 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 &&
1109
+ isDateField(formData.pivot.rowFieldType)
1110
+ ? 'pivot_date'
1111
+ : formData.xAxisFormat, onChange: (e) => handleChange(e.target.value, 'xAxisFormat'), options: formData.pivot &&
1112
+ isDateField(formData.pivot.rowFieldType)
1113
+ ? [{ value: 'pivot_date', label: 'date' }]
1114
+ : formatOptions, width: 200 })] })] })), CHART_TO_LABELS[formData.chartType]?.yAxisLabel && (_jsxs("div", { children: [_jsx(SubHeaderComponent, { label: CHART_TO_LABELS[formData.chartType]?.yAxisLabel ?? '' }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.yAxisFields
1115
+ .filter((yAxisField) => {
1116
+ return !yAxisField.field.startsWith('comparison_');
1117
+ })
1118
+ .map((yAxisField, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: formData.pivot
1119
+ ? formData.pivot.valueField || 'count'
1120
+ : yAxisField.field, onChange: (e) => handleChange(e.target.value, 'yAxisFields.field', index), options: formData.pivot
1121
+ ? [
1122
+ {
1123
+ label: `Pivot Column (${formData.pivot.valueField || 'count'})`,
1124
+ value: formData.pivot.valueField ||
1125
+ 'count',
1126
+ },
1127
+ ]
1128
+ : columns
1129
+ .filter((elem) => {
1130
+ return numberFormatOptions.includes(columns.find((col) => col.field === elem.field)?.format || '');
1131
+ })
1132
+ .map((elem) => ({
1133
+ label: elem.field,
1134
+ value: elem.field,
1135
+ })), 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
1136
+ ? NUMBER_OPTIONS.find((option) => {
1137
+ return (option.value === yAxisField.format);
1138
+ })
1139
+ ? // @ts-ignore
1140
+ NUMBER_OPTIONS.find((option) => option.value === yAxisField.format).value
1141
+ : ''
1142
+ : yAxisField.format, onChange: (e) => handleChange(e.target.value, 'yAxisFields.format', index), options: formData.pivot
1143
+ ? NUMBER_OPTIONS
1144
+ : formatOptions, width: 200 }), formData.pivot === null && (_jsx("div", { ref: deleteRef, style: { marginLeft: deleteButtonMargin }, children: _jsx(DeleteButtonComponent, { onClick: () => handleRemoveField('yAxisFields', index) }) }))] }, 'yAxisField' + index))), formData.pivot === null && (_jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddField('yAxisFields'), label: "Add field +" }) }))] })] }))] })), showTableFormatOptions && windowWidth < 1200 && (_jsx("div", { style: {
1145
+ width: '100%',
1146
+ height: isHorizontalView || !isOpen ? 'calc(50% - 10px)' : 400,
1147
+ flexGrow: 1,
1148
+ }, children: formData.chartType !== 'table' ? (_jsx(TableComponent, { rows: formattedRows, columns: formData.columns, onPageChange: (page) => {
1149
+ onPageChange && onPageChange(page);
1150
+ }, onSortChange: (sort) => {
1151
+ onSortChange && onSortChange(sort);
1152
+ }, rowCount: rowCount, isLoading: isLoading })) : (_jsx(TableComponent, { rows: formattedRows, columns: selectedPivotTable
1153
+ ? selectedPivotTable.columns
1154
+ : formData.columns, onPageChange: (page) => {
1155
+ onPageChange && onPageChange(page);
1156
+ }, onSortChange: (sort) => {
1157
+ onSortChange && onSortChange(sort);
1158
+ }, rowCount: rowCount, isLoading: isLoading })) })), showTableFormatOptions && (_jsxs("div", { children: [_jsxs("div", { style: {
1159
+ display: 'flex',
1160
+ flexDirection: 'column',
1161
+ }, children: [_jsx(HeaderComponent, { label: "Table" }), _jsx(SubHeaderComponent, { label: "Columns" })] }), _jsxs(ChartBuilderInputColumnContainer, { children: [formData.pivot &&
1162
+ selectedPivotTable &&
1163
+ selectedPivotTable.columns &&
1164
+ formData.chartType === 'table'
1165
+ ? // THIS CASE IF FOR PIVOT TABLES ONLY
1166
+ selectedPivotTable.columns.map((column, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: column.label, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: selectedPivotTable.columns.map((elem) => ({
1167
+ label: elem.label,
1168
+ value: elem.label,
1169
+ })), 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:
1170
+ // The first index use rowField for the rest of them use value fields
1171
+ formData.pivot &&
1172
+ column.field === formData.pivot.rowField
1173
+ ? formData.pivot &&
1174
+ isDateField(formData.pivot.rowFieldType)
1175
+ ? 'pivot_date'
1176
+ : 'string'
1177
+ : formData.pivot?.valueFieldType ||
1178
+ 'two_decimal_places', onChange: (e) => handleChange(e.target.value, 'pivotColumn', index), options: formData.pivot && index === 0
1179
+ ? isDateField(formData.pivot.rowFieldType)
1180
+ ? [{ label: 'date', value: 'pivot_date' }]
1181
+ : [{ label: 'string', value: 'string' }]
1182
+ : [...NUMBER_OPTIONS], width: 200 })] }, 'column' + index)))
1183
+ : formData.columns.map((column, index) => (_jsxs(ChartBuilderInputRowContainer, { children: [_jsx(SelectComponent, { value: column.field, onChange: (e) => handleChange(e.target.value, 'columns.field', index), options: columns.map((elem) => ({
1184
+ label: elem.field,
1185
+ value: elem.field,
1186
+ })), 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: !(
1187
+ // hide when pivoted and chartType === 'table'
1188
+ (formData.pivot &&
1189
+ selectedPivotTable &&
1190
+ selectedPivotTable.columns &&
1191
+ formData.chartType === 'table')) && (_jsx(SecondaryButtonComponent, { onClick: () => handleAddField('columns'), label: "Add column +" })) })] })] })), showDateFieldOptions && formData.dateField && (_jsxs("div", { style: {
1192
+ display: 'flex',
1193
+ flexDirection: 'column',
1194
+ gap: 6,
1195
+ }, children: [_jsx(HeaderComponent, { label: "Date field" }), _jsxs(ChartBuilderInputRowContainer, { children: [_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Table", value: formData.dateField?.table, onChange: (e) => handleChange(e.target.value, 'dateField.table'), options: dateFieldOptions.map((elem) => ({
1196
+ label: elem.name,
1197
+ value: elem.name,
1198
+ })), width: 200 }) }), _jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsx(SelectComponent, { label: "Field", value: removeDoubleQuotes(formData.dateField?.field), onChange: (e) => handleChange(e.target.value, 'dateField.field'), options: dateFieldOptions
1199
+ ?.find((elem) => elem.name === formData.dateField?.table)
1200
+ ?.columns?.map((elem) => ({
1201
+ label: elem.field,
1202
+ value: elem.field,
1203
+ })) || [], width: 200 }) })] })] })), showAccessControlOptions && (_jsxs("div", { style: {
1204
+ display: 'flex',
1205
+ flexDirection: 'column',
1206
+ gap: 12,
1207
+ }, children: [_jsx(HeaderComponent, { label: "Organization access" }), _jsx(SegmentedControl, { onChange: (e) => handleChange(e, 'template'), value: formData.template || !organizationName, theme: theme, organizationName: organizationName, customFieldTableRef: customFieldTableRef })] }))] }), _jsxs("div", { style: {
1208
+ display: 'flex',
1209
+ flexDirection: 'row',
1210
+ justifyContent: 'flex-end',
1211
+ marginTop: 'auto',
1212
+ gap: 10,
1213
+ }, children: [!hideDeleteButton && !isHorizontalView && report && (_jsx(SecondaryButtonComponent, { onClick: deleteChart, label: 'Delete' })), !hideSubmitButton && (_jsxs("div", { style: {
1214
+ display: 'flex',
1215
+ flexDirection: 'row',
1216
+ width: '100%',
1217
+ justifyContent: 'space-between',
1218
+ alignItems: 'center',
1219
+ gap: 6,
1220
+ }, children: [filterIssues.length === 0 ? (_jsx("div", {})) : (_jsx(ErrorMessageComponent, { errorMessage: filterIssues[0] || 'Dashbord - Report issues', containerStyle: { height: '100%' } })), _jsx(ButtonComponent, { onClick: () => {
1221
+ if (loadingFormData) {
1222
+ setTriggeredEditChart(true);
1223
+ }
1224
+ else {
1225
+ editChart();
1226
+ }
1227
+ }, disabled: filterIssues.length !== 0, label: buttonLabel
1228
+ ? buttonLabel
1229
+ : report
1230
+ ? 'Save changes'
1231
+ : 'Add to dashboard' })] }))] })] }))] }), _jsx(DashboardFilterModal, { isOpen: showFilterModal, setIsOpen: setShowFilterModal, issues: filterIssues, ButtonComponent: ButtonComponent, ModalComponent: ModalComponent })] }));
1232
+ }
1233
+ function SegmentedControl({ onChange, value, theme, organizationName, customFieldTableRef, }) {
1234
+ return (_jsxs("div", { style: {
1235
+ display: 'flex',
1236
+ flexDirection: 'row',
1237
+ alignItems: 'center',
1238
+ background: '#F5F5F6',
1239
+ maxWidth: organizationName ? 418 : 209,
1240
+ padding: 4,
1241
+ borderRadius: 6,
1242
+ }, children: [!customFieldTableRef && (_jsxs("button", { className: "quill-tab", onClick: () => onChange(true), style: {
1243
+ border: value === true ? '1px solid #E7E7E7' : '1px solid transparent',
1244
+ outline: 'none',
1245
+ width: '100%',
1246
+ borderRadius: 4,
1247
+ padding: 10,
1248
+ boxShadow: value === true
1249
+ ? '0px 1px 4px 0px rgba(56, 65, 81, 0.08)'
1250
+ : undefined,
1251
+ color: value === true ? 'rgba(56, 65, 81, 1)' : 'rgba(56, 65, 81, 0.85)',
1252
+ fontWeight: value === true ? 600 : 500,
1253
+ fontSize: 14,
1254
+ fontFamily: theme?.fontFamily,
1255
+ }, children: [_jsx("style", { children: `
1256
+ .quill-tab {
1257
+ background-color: ${value === true ? 'white' : 'transparent'};
1258
+ }
1259
+ .quill-tab:hover {
1260
+ background-color: ${value === false ? 'rgba(56, 65, 81, 0.05)' : undefined};
1261
+ }
1262
+ .quill-tab:active {
1263
+ background-color: "rgba(56, 65, 81, 0.15)";
1264
+ }
1265
+ ` }), 'All Organizations'] })), organizationName && (_jsxs("button", { className: "quill-tab2", onClick: () => onChange(false), style: {
1266
+ border: value === false ? '1px solid #E7E7E7' : '1px solid transparent',
1267
+ boxShadow: value === false
1268
+ ? '0px 1px 4px 0px rgba(56, 65, 81, 0.08)'
1269
+ : undefined,
1270
+ outline: 'none',
1271
+ width: '100%',
1272
+ borderRadius: 4,
1273
+ color: value === false
1274
+ ? 'rgba(56, 65, 81, 1)'
1275
+ : 'rgba(56, 65, 81, 0.85)',
1276
+ padding: 10,
1277
+ fontWeight: value === false ? 600 : 500,
1278
+ fontSize: 14,
1279
+ fontFamily: theme?.fontFamily,
1280
+ }, children: [_jsx("style", { children: `
1281
+ .quill-tab2 {
1282
+ background-color: ${value === false ? 'white' : 'transparent'};
1283
+ }
1284
+ .quill-tab2:hover {
1285
+ background-color: ${value === true ? 'rgba(56, 65, 81, 0.05)' : undefined};
1286
+ }
1287
+ .quill-tab2:focused {
1288
+ background-color: blue;
1289
+ }
1290
+ .quill-tab2:active {
1291
+ background-color: "rgba(56, 65, 81, 0.15)";
1292
+ }
1293
+ ` }), organizationName] }))] }));
1294
+ }
1295
+ export function DashboardFilterModal({ isOpen, setIsOpen, issues, ModalComponent = MemoizedModal, ButtonComponent = MemoizedButton, }) {
1296
+ if (!isOpen)
1297
+ return null;
1298
+ return (_jsx(ModalComponent, { isOpen: isOpen, setIsOpen: setIsOpen, title: 'Chart not compatible with selected dashboard', width: 600, children: _jsxs("div", { style: {
1299
+ display: 'flex',
1300
+ flexDirection: 'column',
1301
+ width: '600px',
1302
+ padding: '20px',
1303
+ boxSizing: 'border-box',
1304
+ overflow: 'scroll',
1305
+ maxHeight: 600,
1306
+ }, children: [issues.map((issue) => (_jsx("span", { style: { paddingTop: '10px' }, children: issue }, issue))), _jsx("div", { style: {
1307
+ display: 'flex',
1308
+ flexDirection: 'row',
1309
+ justifyContent: 'flex-end',
1310
+ paddingTop: '14px',
1311
+ }, children: _jsx(ButtonComponent, { label: "Got It", onClick: () => setIsOpen(false) }) })] }) }));
1312
+ }