@quillsql/admin 1.6.1 → 1.6.3

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 (678) hide show
  1. package/dist/cjs/Admin.d.ts +41 -87
  2. package/dist/cjs/Admin.d.ts.map +1 -1
  3. package/dist/cjs/Admin.js +358 -456
  4. package/dist/cjs/AdminProvider.d.ts +108 -50
  5. package/dist/cjs/AdminProvider.d.ts.map +1 -1
  6. package/dist/cjs/AdminProvider.js +390 -208
  7. package/dist/cjs/api/ConnectionClient.d.ts +20 -38
  8. package/dist/cjs/api/ConnectionClient.d.ts.map +1 -1
  9. package/dist/cjs/api/ConnectionClient.js +291 -321
  10. package/dist/cjs/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  11. package/dist/cjs/components/Banner/index.d.ts +0 -1
  12. package/dist/cjs/components/Banner/index.d.ts.map +1 -1
  13. package/dist/cjs/components/Banner/index.js +1 -1
  14. package/dist/cjs/components/CardSection.js +1 -1
  15. package/dist/cjs/components/CardTitle.js +1 -1
  16. package/dist/cjs/components/ClipboardButton.d.ts +8 -0
  17. package/dist/cjs/components/ClipboardButton.d.ts.map +1 -0
  18. package/dist/cjs/components/ClipboardButton.js +74 -0
  19. package/dist/cjs/components/DashboardSelectPopover.d.ts +8 -5
  20. package/dist/cjs/components/DashboardSelectPopover.d.ts.map +1 -1
  21. package/dist/cjs/components/DashboardSelectPopover.js +74 -185
  22. package/dist/cjs/components/DatabaseMismatchCard.d.ts +3 -3
  23. package/dist/cjs/components/DatabaseMismatchCard.d.ts.map +1 -1
  24. package/dist/cjs/components/DatabaseMismatchCard.js +3 -3
  25. package/dist/cjs/components/DatabaseSelector.d.ts.map +1 -1
  26. package/dist/cjs/components/DatabaseSelector.js +10 -2
  27. package/dist/cjs/components/DateRangePicker/SingleDatePicker.d.ts +10 -0
  28. package/dist/cjs/components/DateRangePicker/SingleDatePicker.d.ts.map +1 -0
  29. package/dist/cjs/components/DateRangePicker/SingleDatePicker.js +263 -0
  30. package/dist/cjs/components/DateRangePicker/YearlessDateRangePicker.d.ts +18 -0
  31. package/dist/cjs/components/DateRangePicker/YearlessDateRangePicker.d.ts.map +1 -0
  32. package/dist/cjs/components/DateRangePicker/YearlessDateRangePicker.js +288 -0
  33. package/dist/cjs/components/DateRangePicker/dateRangePickerUtils.d.ts +91 -0
  34. package/dist/cjs/components/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -0
  35. package/dist/cjs/components/DateRangePicker/dateRangePickerUtils.js +898 -0
  36. package/dist/cjs/components/DeleteButton.d.ts +0 -1
  37. package/dist/cjs/components/DeleteButton.d.ts.map +1 -1
  38. package/dist/cjs/components/DeleteButton.js +1 -1
  39. package/dist/cjs/components/DropDownMenu.js +1 -1
  40. package/dist/cjs/components/DropDownMenuWithLabel.d.ts +4 -3
  41. package/dist/cjs/components/DropDownMenuWithLabel.d.ts.map +1 -1
  42. package/dist/cjs/components/DropDownMenuWithLabel.js +56 -29
  43. package/dist/cjs/components/DynamicBanner.d.ts +2 -5
  44. package/dist/cjs/components/DynamicBanner.d.ts.map +1 -1
  45. package/dist/cjs/components/DynamicBanner.js +3 -3
  46. package/dist/cjs/components/EmptyDashboardComponent/index.d.ts +0 -1
  47. package/dist/cjs/components/EmptyDashboardComponent/index.d.ts.map +1 -1
  48. package/dist/cjs/components/EmptyDashboardComponent/index.js +6 -5
  49. package/dist/cjs/components/EmptyVirtualTablesComponent.d.ts +4 -0
  50. package/dist/cjs/components/EmptyVirtualTablesComponent.d.ts.map +1 -0
  51. package/dist/cjs/components/EmptyVirtualTablesComponent.js +41 -0
  52. package/dist/cjs/components/ExternalLink.d.ts +4 -0
  53. package/dist/cjs/components/ExternalLink.d.ts.map +1 -0
  54. package/dist/cjs/components/ExternalLink.js +15 -0
  55. package/dist/cjs/components/FormTooltip.d.ts +8 -0
  56. package/dist/cjs/components/FormTooltip.d.ts.map +1 -0
  57. package/dist/cjs/components/FormTooltip.js +89 -0
  58. package/dist/cjs/components/InputLabel.d.ts +4 -1
  59. package/dist/cjs/components/InputLabel.d.ts.map +1 -1
  60. package/dist/cjs/components/InputLabel.js +13 -8
  61. package/dist/cjs/components/InternalDashboard/ChartSkeleton.d.ts +11 -0
  62. package/dist/cjs/components/InternalDashboard/ChartSkeleton.d.ts.map +1 -0
  63. package/dist/cjs/components/InternalDashboard/ChartSkeleton.js +21 -0
  64. package/dist/cjs/components/InternalDashboard/DashboardFilter.d.ts +20 -0
  65. package/dist/cjs/components/InternalDashboard/DashboardFilter.d.ts.map +1 -0
  66. package/dist/cjs/components/InternalDashboard/DashboardFilter.js +104 -0
  67. package/dist/cjs/components/InternalDashboard/DashboardLoadingComponent.d.ts +7 -0
  68. package/dist/cjs/components/InternalDashboard/DashboardLoadingComponent.d.ts.map +1 -0
  69. package/dist/cjs/components/InternalDashboard/DashboardLoadingComponent.js +22 -0
  70. package/dist/cjs/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.d.ts +37 -0
  71. package/dist/cjs/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
  72. package/dist/cjs/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.js +275 -0
  73. package/dist/cjs/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.d.ts +85 -0
  74. package/dist/cjs/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -0
  75. package/dist/cjs/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.js +534 -0
  76. package/dist/cjs/components/InternalDashboard/InternalDashboard.d.ts +17 -0
  77. package/dist/cjs/components/InternalDashboard/InternalDashboard.d.ts.map +1 -0
  78. package/dist/cjs/components/InternalDashboard/InternalDashboard.js +1947 -0
  79. package/dist/cjs/components/OrgSelect.d.ts +9 -13
  80. package/dist/cjs/components/OrgSelect.d.ts.map +1 -1
  81. package/dist/cjs/components/OrgSelect.js +136 -119
  82. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts +30 -0
  83. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -0
  84. package/dist/cjs/components/QuillMultiSelectWithCombo.js +504 -0
  85. package/dist/cjs/components/QuillPopover.d.ts +11 -0
  86. package/dist/cjs/components/QuillPopover.d.ts.map +1 -0
  87. package/dist/cjs/components/QuillPopover.js +180 -0
  88. package/dist/cjs/components/QuillSelect.d.ts +1 -1
  89. package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
  90. package/dist/cjs/components/QuillSelect.js +38 -16
  91. package/dist/cjs/components/QuillSelectWithCombo.d.ts +22 -0
  92. package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -0
  93. package/dist/cjs/components/QuillSelectWithCombo.js +327 -0
  94. package/dist/cjs/components/QuillTab.d.ts +12 -0
  95. package/dist/cjs/components/QuillTab.d.ts.map +1 -0
  96. package/dist/cjs/components/QuillTab.js +84 -0
  97. package/dist/cjs/components/QuillToolTipPortal.d.ts +11 -0
  98. package/dist/cjs/components/QuillToolTipPortal.d.ts.map +1 -0
  99. package/dist/cjs/components/QuillToolTipPortal.js +108 -0
  100. package/dist/cjs/components/SegmentedControl.d.ts +8 -2
  101. package/dist/cjs/components/SegmentedControl.d.ts.map +1 -1
  102. package/dist/cjs/components/SegmentedControl.js +11 -12
  103. package/dist/cjs/components/SqlTextEditor.d.ts +2 -5
  104. package/dist/cjs/components/SqlTextEditor.d.ts.map +1 -1
  105. package/dist/cjs/components/SqlTextEditor.js +20 -19
  106. package/dist/cjs/components/StepDisplay.d.ts.map +1 -1
  107. package/dist/cjs/components/StepDisplay.js +2 -2
  108. package/dist/cjs/components/Tenants/EditTenant.d.ts +41 -0
  109. package/dist/cjs/components/Tenants/EditTenant.d.ts.map +1 -0
  110. package/dist/cjs/components/Tenants/EditTenant.js +760 -0
  111. package/dist/cjs/components/UiComponents.d.ts +35 -6
  112. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  113. package/dist/cjs/components/UiComponents.js +226 -28
  114. package/dist/cjs/components/VirtualTableTile.d.ts +7 -0
  115. package/dist/cjs/components/VirtualTableTile.d.ts.map +1 -0
  116. package/dist/cjs/components/VirtualTableTile.js +51 -0
  117. package/dist/cjs/components/index.d.ts +5 -5
  118. package/dist/cjs/components/index.d.ts.map +1 -1
  119. package/dist/cjs/components/index.js +1 -1
  120. package/dist/cjs/constants/dataTypes.d.ts.map +1 -1
  121. package/dist/cjs/constants/dataTypes.js +2 -0
  122. package/dist/cjs/forms/client_onboard/ConnectDatabase.d.ts +15 -6
  123. package/dist/cjs/forms/client_onboard/ConnectDatabase.d.ts.map +1 -1
  124. package/dist/cjs/forms/client_onboard/ConnectDatabase.js +209 -96
  125. package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts +13 -9
  126. package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
  127. package/dist/cjs/forms/client_onboard/ConnectSchema.js +158 -236
  128. package/dist/cjs/forms/client_onboard/CreateVirtualTables.d.ts +47 -0
  129. package/dist/cjs/forms/client_onboard/CreateVirtualTables.d.ts.map +1 -0
  130. package/dist/cjs/forms/client_onboard/CreateVirtualTables.js +396 -0
  131. package/dist/cjs/forms/client_onboard/__tests__/ConnectDatabase.test.d.ts +2 -0
  132. package/dist/cjs/forms/client_onboard/__tests__/ConnectDatabase.test.d.ts.map +1 -0
  133. package/dist/cjs/forms/client_onboard/__tests__/ConnectDatabase.test.js +571 -0
  134. package/dist/cjs/forms/client_onboard/__tests__/ConnectSchema.test.d.ts +2 -0
  135. package/dist/cjs/forms/client_onboard/__tests__/ConnectSchema.test.d.ts.map +1 -0
  136. package/dist/cjs/forms/client_onboard/__tests__/ConnectSchema.test.js +459 -0
  137. package/dist/cjs/forms/client_onboard/__tests__/CreateVirtualTables.test.d.ts +2 -0
  138. package/dist/cjs/forms/client_onboard/__tests__/CreateVirtualTables.test.d.ts.map +1 -0
  139. package/dist/cjs/forms/client_onboard/__tests__/CreateVirtualTables.test.js +385 -0
  140. package/dist/cjs/forms/virtual_tables/CreateEditVirtualTable.d.ts +20 -0
  141. package/dist/cjs/forms/virtual_tables/CreateEditVirtualTable.d.ts.map +1 -0
  142. package/dist/cjs/forms/virtual_tables/CreateEditVirtualTable.js +294 -0
  143. package/dist/cjs/hooks/useDashboardManager.d.ts +16 -0
  144. package/dist/cjs/hooks/useDashboardManager.d.ts.map +1 -0
  145. package/dist/cjs/hooks/useDashboardManager.js +113 -0
  146. package/dist/cjs/hooks/useDatabaseSchema.d.ts +5 -0
  147. package/dist/cjs/hooks/useDatabaseSchema.d.ts.map +1 -0
  148. package/dist/cjs/hooks/useDatabaseSchema.js +54 -0
  149. package/dist/cjs/hooks/useItemBeingEdited.d.ts +1 -2
  150. package/dist/cjs/hooks/useItemBeingEdited.d.ts.map +1 -1
  151. package/dist/cjs/hooks/useItemBeingEdited.js +2 -14
  152. package/dist/cjs/hooks/useOnClickOutside.d.ts +4 -1
  153. package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -1
  154. package/dist/cjs/hooks/useOnClickOutside.js +50 -7
  155. package/dist/cjs/hooks/useTenants.d.ts +13 -0
  156. package/dist/cjs/hooks/useTenants.d.ts.map +1 -0
  157. package/dist/cjs/hooks/useTenants.js +174 -0
  158. package/dist/cjs/hooks/useThrottle.d.ts +2 -0
  159. package/dist/cjs/hooks/useThrottle.d.ts.map +1 -0
  160. package/dist/cjs/hooks/useThrottle.js +14 -0
  161. package/dist/cjs/icons/CheckCircleIcon.d.ts +5 -0
  162. package/dist/cjs/icons/CheckCircleIcon.d.ts.map +1 -0
  163. package/dist/cjs/icons/CheckCircleIcon.js +5 -0
  164. package/dist/cjs/icons/DownChevronIcon.d.ts +2 -0
  165. package/dist/cjs/icons/DownChevronIcon.d.ts.map +1 -0
  166. package/dist/cjs/icons/DownChevronIcon.js +7 -0
  167. package/dist/cjs/icons/ExclamationFilledIcon.d.ts +5 -0
  168. package/dist/cjs/icons/ExclamationFilledIcon.d.ts.map +1 -0
  169. package/dist/cjs/icons/ExclamationFilledIcon.js +5 -0
  170. package/dist/cjs/icons/ExteriorLinkIcon.d.ts +5 -0
  171. package/dist/cjs/icons/ExteriorLinkIcon.d.ts.map +1 -0
  172. package/dist/cjs/icons/ExteriorLinkIcon.js +5 -0
  173. package/dist/cjs/icons/GlobeIcon.d.ts +5 -0
  174. package/dist/cjs/icons/GlobeIcon.d.ts.map +1 -0
  175. package/dist/cjs/icons/GlobeIcon.js +15 -0
  176. package/dist/cjs/icons/InformationCircleIcon.d.ts +4 -0
  177. package/dist/cjs/icons/InformationCircleIcon.d.ts.map +1 -0
  178. package/dist/cjs/icons/InformationCircleIcon.js +7 -0
  179. package/dist/cjs/icons/LeftChevronIcon.d.ts +2 -0
  180. package/dist/cjs/icons/LeftChevronIcon.d.ts.map +1 -0
  181. package/dist/cjs/icons/LeftChevronIcon.js +7 -0
  182. package/dist/cjs/icons/QuestionMarkCircleIcon.d.ts +5 -0
  183. package/dist/cjs/icons/QuestionMarkCircleIcon.d.ts.map +1 -0
  184. package/dist/cjs/icons/QuestionMarkCircleIcon.js +5 -0
  185. package/dist/cjs/icons/RightChevronIcon.d.ts +2 -0
  186. package/dist/cjs/icons/RightChevronIcon.d.ts.map +1 -0
  187. package/dist/cjs/icons/RightChevronIcon.js +7 -0
  188. package/dist/cjs/icons/XMarkIcon.d.ts +0 -1
  189. package/dist/cjs/icons/XMarkIcon.d.ts.map +1 -1
  190. package/dist/cjs/icons/XMarkIcon.js +1 -1
  191. package/dist/cjs/index.d.ts +2 -3
  192. package/dist/cjs/index.d.ts.map +1 -1
  193. package/dist/cjs/index.js +6 -7
  194. package/dist/cjs/modals/CodePreview.d.ts +6 -0
  195. package/dist/cjs/modals/CodePreview.d.ts.map +1 -0
  196. package/dist/cjs/modals/CodePreview.js +151 -0
  197. package/dist/cjs/modals/EditEnvironmentModal.d.ts +15 -0
  198. package/dist/cjs/modals/EditEnvironmentModal.d.ts.map +1 -0
  199. package/dist/cjs/modals/EditEnvironmentModal.js +551 -0
  200. package/dist/cjs/modals/EditFiltersModal.d.ts +14 -10
  201. package/dist/cjs/modals/EditFiltersModal.d.ts.map +1 -1
  202. package/dist/cjs/modals/EditFiltersModal.js +1219 -263
  203. package/dist/cjs/modals/NewDashboardModal.d.ts +6 -8
  204. package/dist/cjs/modals/NewDashboardModal.d.ts.map +1 -1
  205. package/dist/cjs/modals/NewDashboardModal.js +147 -146
  206. package/dist/cjs/modals/PromoteDashboardModal.d.ts +16 -0
  207. package/dist/cjs/modals/PromoteDashboardModal.d.ts.map +1 -0
  208. package/dist/cjs/modals/PromoteDashboardModal.js +56 -0
  209. package/dist/cjs/modals/PromoteReportModal.d.ts +15 -0
  210. package/dist/cjs/modals/PromoteReportModal.d.ts.map +1 -0
  211. package/dist/cjs/modals/PromoteReportModal.js +128 -0
  212. package/dist/cjs/modals/PromoteViewModal.d.ts +5 -5
  213. package/dist/cjs/modals/PromoteViewModal.d.ts.map +1 -1
  214. package/dist/cjs/modals/PromoteViewModal.js +58 -94
  215. package/dist/cjs/modals/ReorderDashboardModal.d.ts +1 -2
  216. package/dist/cjs/modals/ReorderDashboardModal.d.ts.map +1 -1
  217. package/dist/cjs/modals/ReorderDashboardModal.js +34 -20
  218. package/dist/cjs/modals/SavedQueriesModal.d.ts +7 -0
  219. package/dist/cjs/modals/SavedQueriesModal.d.ts.map +1 -0
  220. package/dist/cjs/modals/SavedQueriesModal.js +128 -0
  221. package/dist/cjs/modals/index.d.ts +0 -1
  222. package/dist/cjs/modals/index.d.ts.map +1 -1
  223. package/dist/cjs/modals/index.js +1 -3
  224. package/dist/cjs/primitives/ButtonPrimitive.d.ts +3 -1
  225. package/dist/cjs/primitives/ButtonPrimitive.d.ts.map +1 -1
  226. package/dist/cjs/primitives/ButtonPrimitive.js +24 -16
  227. package/dist/cjs/primitives/CheckboxPrimitive.d.ts +12 -0
  228. package/dist/cjs/primitives/CheckboxPrimitive.d.ts.map +1 -0
  229. package/dist/cjs/primitives/CheckboxPrimitive.js +29 -0
  230. package/dist/cjs/primitives/HeaderPrimitive.d.ts.map +1 -1
  231. package/dist/cjs/primitives/HeaderPrimitive.js +1 -1
  232. package/dist/cjs/primitives/MiniButtonPrimitive.d.ts +7 -0
  233. package/dist/cjs/primitives/MiniButtonPrimitive.d.ts.map +1 -0
  234. package/dist/cjs/primitives/MiniButtonPrimitive.js +56 -0
  235. package/dist/cjs/primitives/ModalPrimitive.d.ts +2 -10
  236. package/dist/cjs/primitives/ModalPrimitive.d.ts.map +1 -1
  237. package/dist/cjs/primitives/ModalPrimitive.js +6 -6
  238. package/dist/cjs/primitives/PlaceholderPrimitive.d.ts +5 -0
  239. package/dist/cjs/primitives/PlaceholderPrimitive.d.ts.map +1 -0
  240. package/dist/cjs/primitives/PlaceholderPrimitive.js +18 -0
  241. package/dist/cjs/primitives/PopoverPrimitive.d.ts +8 -0
  242. package/dist/cjs/primitives/PopoverPrimitive.d.ts.map +1 -0
  243. package/dist/cjs/primitives/PopoverPrimitive.js +53 -0
  244. package/dist/cjs/primitives/SecondaryButtonPrimitive.d.ts +3 -1
  245. package/dist/cjs/primitives/SecondaryButtonPrimitive.d.ts.map +1 -1
  246. package/dist/cjs/primitives/SecondaryButtonPrimitive.js +13 -10
  247. package/dist/cjs/primitives/TextInputPrimitive.d.ts +7 -2
  248. package/dist/cjs/primitives/TextInputPrimitive.d.ts.map +1 -1
  249. package/dist/cjs/primitives/TextInputPrimitive.js +109 -14
  250. package/dist/cjs/primitives/TogglePrimitive.d.ts +6 -3
  251. package/dist/cjs/primitives/TogglePrimitive.d.ts.map +1 -1
  252. package/dist/cjs/primitives/TogglePrimitive.js +10 -7
  253. package/dist/cjs/primitives/index.d.ts +1 -1
  254. package/dist/cjs/primitives/index.d.ts.map +1 -1
  255. package/dist/cjs/primitives/index.js +3 -3
  256. package/dist/cjs/public_components/ChartQueryBuilder.d.ts +9 -0
  257. package/dist/cjs/public_components/ChartQueryBuilder.d.ts.map +1 -0
  258. package/dist/cjs/public_components/ChartQueryBuilder.js +131 -0
  259. package/dist/cjs/public_components/CreateEnvironment.d.ts +1 -1
  260. package/dist/cjs/public_components/CreateEnvironment.d.ts.map +1 -1
  261. package/dist/cjs/public_components/CreateEnvironment.js +168 -81
  262. package/dist/cjs/public_components/DashboardManager.d.ts +2 -2
  263. package/dist/cjs/public_components/DashboardManager.d.ts.map +1 -1
  264. package/dist/cjs/public_components/DashboardManager.js +346 -187
  265. package/dist/cjs/public_components/EnvSelectPopover.d.ts +12 -0
  266. package/dist/cjs/public_components/EnvSelectPopover.d.ts.map +1 -0
  267. package/dist/cjs/public_components/EnvSelectPopover.js +144 -0
  268. package/dist/cjs/public_components/{SQLViewManager.d.ts → VirtualTableManager.d.ts} +3 -2
  269. package/dist/cjs/public_components/VirtualTableManager.d.ts.map +1 -0
  270. package/dist/cjs/public_components/VirtualTableManager.js +731 -0
  271. package/dist/cjs/public_components/__tests__/CreateEnvironment.test.d.ts +2 -0
  272. package/dist/cjs/public_components/__tests__/CreateEnvironment.test.d.ts.map +1 -0
  273. package/dist/cjs/public_components/__tests__/CreateEnvironment.test.js +685 -0
  274. package/dist/cjs/utils/astProcessing.d.ts +14 -1
  275. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  276. package/dist/cjs/utils/astProcessing.js +72 -8
  277. package/dist/cjs/utils/astProcessing.uspec.js +7 -3
  278. package/dist/cjs/utils/columnProcessing.d.ts +12 -0
  279. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  280. package/dist/cjs/utils/columnProcessing.js +173 -7
  281. package/dist/cjs/utils/constants.d.ts +4 -21
  282. package/dist/cjs/utils/constants.d.ts.map +1 -1
  283. package/dist/cjs/utils/constants.js +20 -11
  284. package/dist/cjs/utils/dataEditor.d.ts +4 -3
  285. package/dist/cjs/utils/dataEditor.d.ts.map +1 -1
  286. package/dist/cjs/utils/dataEditor.js +69 -121
  287. package/dist/cjs/utils/dataFetcher.d.ts +20 -2
  288. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  289. package/dist/cjs/utils/dataFetcher.js +46 -56
  290. package/dist/cjs/utils/databases.d.ts +20 -8
  291. package/dist/cjs/utils/databases.d.ts.map +1 -1
  292. package/dist/cjs/utils/databases.js +63 -24
  293. package/dist/cjs/utils/filter.d.ts +222 -0
  294. package/dist/cjs/utils/filter.d.ts.map +1 -0
  295. package/dist/cjs/utils/filter.js +347 -0
  296. package/dist/cjs/utils/monacoAutocomplete.d.ts +2 -1
  297. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -1
  298. package/dist/cjs/utils/monacoAutocomplete.js +149 -44
  299. package/dist/cjs/utils/report.d.ts +120 -0
  300. package/dist/cjs/utils/report.d.ts.map +1 -0
  301. package/dist/cjs/utils/report.js +109 -0
  302. package/dist/cjs/utils/schema.d.ts +41 -29
  303. package/dist/cjs/utils/schema.d.ts.map +1 -1
  304. package/dist/cjs/utils/schema.js +137 -91
  305. package/dist/cjs/utils/table.d.ts +70 -4
  306. package/dist/cjs/utils/table.d.ts.map +1 -1
  307. package/dist/cjs/utils/tenants.d.ts +48 -0
  308. package/dist/cjs/utils/tenants.d.ts.map +1 -0
  309. package/dist/cjs/utils/tenants.js +37 -0
  310. package/dist/cjs/utils/textProcessing.js +1 -2
  311. package/dist/cjs/utils/ui.d.ts +2 -0
  312. package/dist/cjs/utils/ui.d.ts.map +1 -0
  313. package/dist/cjs/utils/ui.js +18 -0
  314. package/dist/cjs/utils/validation.d.ts +2 -0
  315. package/dist/cjs/utils/validation.d.ts.map +1 -0
  316. package/dist/cjs/utils/validation.js +77 -0
  317. package/dist/cjs/utils/validation.uspec.d.ts +2 -0
  318. package/dist/cjs/utils/validation.uspec.d.ts.map +1 -0
  319. package/dist/cjs/utils/validation.uspec.js +53 -0
  320. package/dist/esm/Admin.d.ts +41 -87
  321. package/dist/esm/Admin.d.ts.map +1 -1
  322. package/dist/esm/Admin.js +355 -422
  323. package/dist/esm/AdminProvider.d.ts +108 -50
  324. package/dist/esm/AdminProvider.d.ts.map +1 -1
  325. package/dist/esm/AdminProvider.js +390 -209
  326. package/dist/esm/api/ConnectionClient.d.ts +20 -38
  327. package/dist/esm/api/ConnectionClient.d.ts.map +1 -1
  328. package/dist/esm/api/ConnectionClient.js +280 -306
  329. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  330. package/dist/esm/components/Banner/index.d.ts +0 -1
  331. package/dist/esm/components/Banner/index.d.ts.map +1 -1
  332. package/dist/esm/components/ClipboardButton.d.ts +8 -0
  333. package/dist/esm/components/ClipboardButton.d.ts.map +1 -0
  334. package/dist/esm/components/ClipboardButton.js +69 -0
  335. package/dist/esm/components/DashboardSelectPopover.d.ts +8 -5
  336. package/dist/esm/components/DashboardSelectPopover.d.ts.map +1 -1
  337. package/dist/esm/components/DashboardSelectPopover.js +72 -186
  338. package/dist/esm/components/DatabaseMismatchCard.d.ts +3 -3
  339. package/dist/esm/components/DatabaseMismatchCard.d.ts.map +1 -1
  340. package/dist/esm/components/DatabaseMismatchCard.js +2 -2
  341. package/dist/esm/components/DatabaseSelector.d.ts.map +1 -1
  342. package/dist/esm/components/DatabaseSelector.js +9 -1
  343. package/dist/esm/components/DateRangePicker/SingleDatePicker.d.ts +10 -0
  344. package/dist/esm/components/DateRangePicker/SingleDatePicker.d.ts.map +1 -0
  345. package/dist/esm/components/DateRangePicker/SingleDatePicker.js +227 -0
  346. package/dist/esm/components/DateRangePicker/YearlessDateRangePicker.d.ts +18 -0
  347. package/dist/esm/components/DateRangePicker/YearlessDateRangePicker.d.ts.map +1 -0
  348. package/dist/esm/components/DateRangePicker/YearlessDateRangePicker.js +282 -0
  349. package/dist/esm/components/DateRangePicker/dateRangePickerUtils.d.ts +91 -0
  350. package/dist/esm/components/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -0
  351. package/dist/esm/components/DateRangePicker/dateRangePickerUtils.js +883 -0
  352. package/dist/esm/components/DeleteButton.d.ts +0 -1
  353. package/dist/esm/components/DeleteButton.d.ts.map +1 -1
  354. package/dist/esm/components/DropDownMenuWithLabel.d.ts +4 -3
  355. package/dist/esm/components/DropDownMenuWithLabel.d.ts.map +1 -1
  356. package/dist/esm/components/DropDownMenuWithLabel.js +37 -23
  357. package/dist/esm/components/DynamicBanner.d.ts +2 -5
  358. package/dist/esm/components/DynamicBanner.d.ts.map +1 -1
  359. package/dist/esm/components/DynamicBanner.js +2 -2
  360. package/dist/esm/components/EmptyDashboardComponent/index.d.ts +0 -1
  361. package/dist/esm/components/EmptyDashboardComponent/index.d.ts.map +1 -1
  362. package/dist/esm/components/EmptyDashboardComponent/index.js +5 -4
  363. package/dist/esm/components/EmptyVirtualTablesComponent.d.ts +4 -0
  364. package/dist/esm/components/EmptyVirtualTablesComponent.d.ts.map +1 -0
  365. package/dist/esm/components/EmptyVirtualTablesComponent.js +38 -0
  366. package/dist/esm/components/ExternalLink.d.ts +4 -0
  367. package/dist/esm/components/ExternalLink.d.ts.map +1 -0
  368. package/dist/esm/components/ExternalLink.js +9 -0
  369. package/dist/esm/components/FormTooltip.d.ts +8 -0
  370. package/dist/esm/components/FormTooltip.d.ts.map +1 -0
  371. package/dist/esm/components/FormTooltip.js +84 -0
  372. package/dist/esm/components/InputLabel.d.ts +4 -1
  373. package/dist/esm/components/InputLabel.d.ts.map +1 -1
  374. package/dist/esm/components/InputLabel.js +10 -8
  375. package/dist/esm/components/InternalDashboard/ChartSkeleton.d.ts +11 -0
  376. package/dist/esm/components/InternalDashboard/ChartSkeleton.d.ts.map +1 -0
  377. package/dist/esm/components/InternalDashboard/ChartSkeleton.js +16 -0
  378. package/dist/esm/components/InternalDashboard/DashboardFilter.d.ts +20 -0
  379. package/dist/esm/components/InternalDashboard/DashboardFilter.d.ts.map +1 -0
  380. package/dist/esm/components/InternalDashboard/DashboardFilter.js +101 -0
  381. package/dist/esm/components/InternalDashboard/DashboardLoadingComponent.d.ts +7 -0
  382. package/dist/esm/components/InternalDashboard/DashboardLoadingComponent.d.ts.map +1 -0
  383. package/dist/esm/components/InternalDashboard/DashboardLoadingComponent.js +15 -0
  384. package/dist/esm/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.d.ts +37 -0
  385. package/dist/esm/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
  386. package/dist/esm/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.js +269 -0
  387. package/dist/esm/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.d.ts +85 -0
  388. package/dist/esm/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -0
  389. package/dist/esm/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.js +520 -0
  390. package/dist/esm/components/InternalDashboard/InternalDashboard.d.ts +17 -0
  391. package/dist/esm/components/InternalDashboard/InternalDashboard.d.ts.map +1 -0
  392. package/dist/esm/components/InternalDashboard/InternalDashboard.js +1940 -0
  393. package/dist/esm/components/OrgSelect.d.ts +9 -13
  394. package/dist/esm/components/OrgSelect.d.ts.map +1 -1
  395. package/dist/esm/components/OrgSelect.js +134 -117
  396. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts +30 -0
  397. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -0
  398. package/dist/esm/components/QuillMultiSelectWithCombo.js +466 -0
  399. package/dist/esm/components/QuillPopover.d.ts +11 -0
  400. package/dist/esm/components/QuillPopover.d.ts.map +1 -0
  401. package/dist/esm/components/QuillPopover.js +144 -0
  402. package/dist/esm/components/QuillSelect.d.ts +1 -1
  403. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  404. package/dist/esm/components/QuillSelect.js +39 -16
  405. package/dist/esm/components/QuillSelectWithCombo.d.ts +22 -0
  406. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -0
  407. package/dist/esm/components/QuillSelectWithCombo.js +291 -0
  408. package/dist/esm/components/QuillTab.d.ts +12 -0
  409. package/dist/esm/components/QuillTab.d.ts.map +1 -0
  410. package/dist/esm/components/QuillTab.js +81 -0
  411. package/dist/esm/components/QuillToolTipPortal.d.ts +11 -0
  412. package/dist/esm/components/QuillToolTipPortal.d.ts.map +1 -0
  413. package/dist/esm/components/QuillToolTipPortal.js +104 -0
  414. package/dist/esm/components/SegmentedControl.d.ts +8 -2
  415. package/dist/esm/components/SegmentedControl.d.ts.map +1 -1
  416. package/dist/esm/components/SegmentedControl.js +10 -10
  417. package/dist/esm/components/SqlTextEditor.d.ts +2 -5
  418. package/dist/esm/components/SqlTextEditor.d.ts.map +1 -1
  419. package/dist/esm/components/SqlTextEditor.js +21 -20
  420. package/dist/esm/components/StepDisplay.d.ts.map +1 -1
  421. package/dist/esm/components/StepDisplay.js +1 -1
  422. package/dist/esm/components/Tenants/EditTenant.d.ts +41 -0
  423. package/dist/esm/components/Tenants/EditTenant.d.ts.map +1 -0
  424. package/dist/esm/components/Tenants/EditTenant.js +754 -0
  425. package/dist/esm/components/UiComponents.d.ts +35 -6
  426. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  427. package/dist/esm/components/UiComponents.js +220 -26
  428. package/dist/esm/components/VirtualTableTile.d.ts +7 -0
  429. package/dist/esm/components/VirtualTableTile.d.ts.map +1 -0
  430. package/dist/esm/components/VirtualTableTile.js +48 -0
  431. package/dist/esm/components/index.d.ts +5 -5
  432. package/dist/esm/components/index.d.ts.map +1 -1
  433. package/dist/esm/components/index.js +5 -5
  434. package/dist/esm/constants/dataTypes.d.ts.map +1 -1
  435. package/dist/esm/constants/dataTypes.js +2 -0
  436. package/dist/esm/forms/client_onboard/ConnectDatabase.d.ts +15 -6
  437. package/dist/esm/forms/client_onboard/ConnectDatabase.d.ts.map +1 -1
  438. package/dist/esm/forms/client_onboard/ConnectDatabase.js +211 -98
  439. package/dist/esm/forms/client_onboard/ConnectSchema.d.ts +13 -9
  440. package/dist/esm/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
  441. package/dist/esm/forms/client_onboard/ConnectSchema.js +160 -238
  442. package/dist/esm/forms/client_onboard/CreateVirtualTables.d.ts +47 -0
  443. package/dist/esm/forms/client_onboard/CreateVirtualTables.d.ts.map +1 -0
  444. package/dist/esm/forms/client_onboard/CreateVirtualTables.js +388 -0
  445. package/dist/esm/forms/client_onboard/__tests__/ConnectDatabase.test.d.ts +2 -0
  446. package/dist/esm/forms/client_onboard/__tests__/ConnectDatabase.test.d.ts.map +1 -0
  447. package/dist/esm/forms/client_onboard/__tests__/ConnectDatabase.test.js +566 -0
  448. package/dist/esm/forms/client_onboard/__tests__/ConnectSchema.test.d.ts +2 -0
  449. package/dist/esm/forms/client_onboard/__tests__/ConnectSchema.test.d.ts.map +1 -0
  450. package/dist/esm/forms/client_onboard/__tests__/ConnectSchema.test.js +454 -0
  451. package/dist/esm/forms/client_onboard/__tests__/CreateVirtualTables.test.d.ts +2 -0
  452. package/dist/esm/forms/client_onboard/__tests__/CreateVirtualTables.test.d.ts.map +1 -0
  453. package/dist/esm/forms/client_onboard/__tests__/CreateVirtualTables.test.js +380 -0
  454. package/dist/esm/forms/virtual_tables/CreateEditVirtualTable.d.ts +20 -0
  455. package/dist/esm/forms/virtual_tables/CreateEditVirtualTable.d.ts.map +1 -0
  456. package/dist/esm/forms/virtual_tables/CreateEditVirtualTable.js +288 -0
  457. package/dist/esm/hooks/useDashboardManager.d.ts +16 -0
  458. package/dist/esm/hooks/useDashboardManager.d.ts.map +1 -0
  459. package/dist/esm/hooks/useDashboardManager.js +109 -0
  460. package/dist/esm/hooks/useDatabaseSchema.d.ts +5 -0
  461. package/dist/esm/hooks/useDatabaseSchema.d.ts.map +1 -0
  462. package/dist/esm/hooks/useDatabaseSchema.js +50 -0
  463. package/dist/esm/hooks/useItemBeingEdited.d.ts +1 -2
  464. package/dist/esm/hooks/useItemBeingEdited.d.ts.map +1 -1
  465. package/dist/esm/hooks/useItemBeingEdited.js +3 -15
  466. package/dist/esm/hooks/useOnClickOutside.d.ts +4 -1
  467. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -1
  468. package/dist/esm/hooks/useOnClickOutside.js +49 -8
  469. package/dist/esm/hooks/useTenants.d.ts +13 -0
  470. package/dist/esm/hooks/useTenants.d.ts.map +1 -0
  471. package/dist/esm/hooks/useTenants.js +170 -0
  472. package/dist/esm/hooks/useThrottle.d.ts +2 -0
  473. package/dist/esm/hooks/useThrottle.d.ts.map +1 -0
  474. package/dist/esm/hooks/useThrottle.js +11 -0
  475. package/dist/esm/icons/CheckCircleIcon.d.ts +5 -0
  476. package/dist/esm/icons/CheckCircleIcon.d.ts.map +1 -0
  477. package/dist/esm/icons/CheckCircleIcon.js +3 -0
  478. package/dist/esm/icons/DownChevronIcon.d.ts +2 -0
  479. package/dist/esm/icons/DownChevronIcon.d.ts.map +1 -0
  480. package/dist/esm/icons/DownChevronIcon.js +4 -0
  481. package/dist/esm/icons/ExclamationFilledIcon.d.ts +5 -0
  482. package/dist/esm/icons/ExclamationFilledIcon.d.ts.map +1 -0
  483. package/dist/esm/icons/ExclamationFilledIcon.js +3 -0
  484. package/dist/esm/icons/ExteriorLinkIcon.d.ts +5 -0
  485. package/dist/esm/icons/ExteriorLinkIcon.d.ts.map +1 -0
  486. package/dist/esm/icons/ExteriorLinkIcon.js +3 -0
  487. package/dist/esm/icons/GlobeIcon.d.ts +5 -0
  488. package/dist/esm/icons/GlobeIcon.d.ts.map +1 -0
  489. package/dist/esm/icons/GlobeIcon.js +12 -0
  490. package/dist/esm/icons/InformationCircleIcon.d.ts +4 -0
  491. package/dist/esm/icons/InformationCircleIcon.d.ts.map +1 -0
  492. package/dist/esm/icons/InformationCircleIcon.js +4 -0
  493. package/dist/esm/icons/LeftChevronIcon.d.ts +2 -0
  494. package/dist/esm/icons/LeftChevronIcon.d.ts.map +1 -0
  495. package/dist/esm/icons/LeftChevronIcon.js +4 -0
  496. package/dist/esm/icons/QuestionMarkCircleIcon.d.ts +5 -0
  497. package/dist/esm/icons/QuestionMarkCircleIcon.d.ts.map +1 -0
  498. package/dist/esm/icons/QuestionMarkCircleIcon.js +3 -0
  499. package/dist/esm/icons/RightChevronIcon.d.ts +2 -0
  500. package/dist/esm/icons/RightChevronIcon.d.ts.map +1 -0
  501. package/dist/esm/icons/RightChevronIcon.js +4 -0
  502. package/dist/esm/icons/XMarkIcon.d.ts +0 -1
  503. package/dist/esm/icons/XMarkIcon.d.ts.map +1 -1
  504. package/dist/esm/index.d.ts +2 -3
  505. package/dist/esm/index.d.ts.map +1 -1
  506. package/dist/esm/index.js +3 -3
  507. package/dist/esm/modals/CodePreview.d.ts +6 -0
  508. package/dist/esm/modals/CodePreview.d.ts.map +1 -0
  509. package/dist/esm/modals/CodePreview.js +145 -0
  510. package/dist/esm/modals/EditEnvironmentModal.d.ts +15 -0
  511. package/dist/esm/modals/EditEnvironmentModal.d.ts.map +1 -0
  512. package/dist/esm/modals/EditEnvironmentModal.js +545 -0
  513. package/dist/esm/modals/EditFiltersModal.d.ts +14 -10
  514. package/dist/esm/modals/EditFiltersModal.d.ts.map +1 -1
  515. package/dist/esm/modals/EditFiltersModal.js +1226 -264
  516. package/dist/esm/modals/NewDashboardModal.d.ts +6 -8
  517. package/dist/esm/modals/NewDashboardModal.d.ts.map +1 -1
  518. package/dist/esm/modals/NewDashboardModal.js +148 -146
  519. package/dist/esm/modals/PromoteDashboardModal.d.ts +16 -0
  520. package/dist/esm/modals/PromoteDashboardModal.d.ts.map +1 -0
  521. package/dist/esm/modals/PromoteDashboardModal.js +53 -0
  522. package/dist/esm/modals/PromoteReportModal.d.ts +15 -0
  523. package/dist/esm/modals/PromoteReportModal.d.ts.map +1 -0
  524. package/dist/esm/modals/PromoteReportModal.js +125 -0
  525. package/dist/esm/modals/PromoteViewModal.d.ts +5 -5
  526. package/dist/esm/modals/PromoteViewModal.d.ts.map +1 -1
  527. package/dist/esm/modals/PromoteViewModal.js +58 -94
  528. package/dist/esm/modals/ReorderDashboardModal.d.ts +1 -2
  529. package/dist/esm/modals/ReorderDashboardModal.d.ts.map +1 -1
  530. package/dist/esm/modals/ReorderDashboardModal.js +34 -20
  531. package/dist/esm/modals/SavedQueriesModal.d.ts +7 -0
  532. package/dist/esm/modals/SavedQueriesModal.d.ts.map +1 -0
  533. package/dist/esm/modals/SavedQueriesModal.js +125 -0
  534. package/dist/esm/modals/index.d.ts +0 -1
  535. package/dist/esm/modals/index.d.ts.map +1 -1
  536. package/dist/esm/modals/index.js +0 -1
  537. package/dist/esm/primitives/ButtonPrimitive.d.ts +3 -1
  538. package/dist/esm/primitives/ButtonPrimitive.d.ts.map +1 -1
  539. package/dist/esm/primitives/ButtonPrimitive.js +25 -17
  540. package/dist/esm/primitives/CheckboxPrimitive.d.ts +12 -0
  541. package/dist/esm/primitives/CheckboxPrimitive.d.ts.map +1 -0
  542. package/dist/esm/primitives/CheckboxPrimitive.js +27 -0
  543. package/dist/esm/primitives/HeaderPrimitive.d.ts.map +1 -1
  544. package/dist/esm/primitives/HeaderPrimitive.js +1 -1
  545. package/dist/esm/primitives/MiniButtonPrimitive.d.ts +7 -0
  546. package/dist/esm/primitives/MiniButtonPrimitive.d.ts.map +1 -0
  547. package/dist/esm/primitives/MiniButtonPrimitive.js +54 -0
  548. package/dist/esm/primitives/ModalPrimitive.d.ts +2 -10
  549. package/dist/esm/primitives/ModalPrimitive.d.ts.map +1 -1
  550. package/dist/esm/primitives/ModalPrimitive.js +7 -7
  551. package/dist/esm/primitives/PlaceholderPrimitive.d.ts +5 -0
  552. package/dist/esm/primitives/PlaceholderPrimitive.d.ts.map +1 -0
  553. package/dist/esm/primitives/PlaceholderPrimitive.js +15 -0
  554. package/dist/esm/primitives/PopoverPrimitive.d.ts +8 -0
  555. package/dist/esm/primitives/PopoverPrimitive.d.ts.map +1 -0
  556. package/dist/esm/primitives/PopoverPrimitive.js +49 -0
  557. package/dist/esm/primitives/SecondaryButtonPrimitive.d.ts +3 -1
  558. package/dist/esm/primitives/SecondaryButtonPrimitive.d.ts.map +1 -1
  559. package/dist/esm/primitives/SecondaryButtonPrimitive.js +14 -11
  560. package/dist/esm/primitives/TextInputPrimitive.d.ts +7 -2
  561. package/dist/esm/primitives/TextInputPrimitive.d.ts.map +1 -1
  562. package/dist/esm/primitives/TextInputPrimitive.js +77 -12
  563. package/dist/esm/primitives/TogglePrimitive.d.ts +6 -3
  564. package/dist/esm/primitives/TogglePrimitive.d.ts.map +1 -1
  565. package/dist/esm/primitives/TogglePrimitive.js +10 -7
  566. package/dist/esm/primitives/index.d.ts +1 -1
  567. package/dist/esm/primitives/index.d.ts.map +1 -1
  568. package/dist/esm/primitives/index.js +1 -1
  569. package/dist/esm/public_components/ChartQueryBuilder.d.ts +9 -0
  570. package/dist/esm/public_components/ChartQueryBuilder.d.ts.map +1 -0
  571. package/dist/esm/public_components/ChartQueryBuilder.js +125 -0
  572. package/dist/esm/public_components/CreateEnvironment.d.ts +1 -1
  573. package/dist/esm/public_components/CreateEnvironment.d.ts.map +1 -1
  574. package/dist/esm/public_components/CreateEnvironment.js +152 -75
  575. package/dist/esm/public_components/DashboardManager.d.ts +2 -2
  576. package/dist/esm/public_components/DashboardManager.d.ts.map +1 -1
  577. package/dist/esm/public_components/DashboardManager.js +350 -191
  578. package/dist/esm/public_components/EnvSelectPopover.d.ts +12 -0
  579. package/dist/esm/public_components/EnvSelectPopover.d.ts.map +1 -0
  580. package/dist/esm/public_components/EnvSelectPopover.js +138 -0
  581. package/dist/esm/public_components/{SQLViewManager.d.ts → VirtualTableManager.d.ts} +3 -2
  582. package/dist/esm/public_components/VirtualTableManager.d.ts.map +1 -0
  583. package/dist/esm/public_components/VirtualTableManager.js +723 -0
  584. package/dist/esm/public_components/__tests__/CreateEnvironment.test.d.ts +2 -0
  585. package/dist/esm/public_components/__tests__/CreateEnvironment.test.d.ts.map +1 -0
  586. package/dist/esm/public_components/__tests__/CreateEnvironment.test.js +680 -0
  587. package/dist/esm/utils/astProcessing.d.ts +14 -1
  588. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  589. package/dist/esm/utils/astProcessing.js +67 -6
  590. package/dist/esm/utils/astProcessing.uspec.js +8 -4
  591. package/dist/esm/utils/columnProcessing.d.ts +12 -0
  592. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  593. package/dist/esm/utils/columnProcessing.js +167 -4
  594. package/dist/esm/utils/constants.d.ts +4 -21
  595. package/dist/esm/utils/constants.d.ts.map +1 -1
  596. package/dist/esm/utils/constants.js +18 -9
  597. package/dist/esm/utils/dataEditor.d.ts +4 -3
  598. package/dist/esm/utils/dataEditor.d.ts.map +1 -1
  599. package/dist/esm/utils/dataEditor.js +65 -117
  600. package/dist/esm/utils/dataFetcher.d.ts +20 -2
  601. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  602. package/dist/esm/utils/dataFetcher.js +44 -53
  603. package/dist/esm/utils/databases.d.ts +20 -8
  604. package/dist/esm/utils/databases.d.ts.map +1 -1
  605. package/dist/esm/utils/databases.js +60 -21
  606. package/dist/esm/utils/filter.d.ts +222 -0
  607. package/dist/esm/utils/filter.d.ts.map +1 -0
  608. package/dist/esm/utils/filter.js +343 -0
  609. package/dist/esm/utils/monacoAutocomplete.d.ts +2 -1
  610. package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -1
  611. package/dist/esm/utils/monacoAutocomplete.js +146 -41
  612. package/dist/esm/utils/report.d.ts +120 -0
  613. package/dist/esm/utils/report.d.ts.map +1 -0
  614. package/dist/esm/utils/report.js +106 -0
  615. package/dist/esm/utils/schema.d.ts +41 -29
  616. package/dist/esm/utils/schema.d.ts.map +1 -1
  617. package/dist/esm/utils/schema.js +133 -88
  618. package/dist/esm/utils/table.d.ts +70 -4
  619. package/dist/esm/utils/table.d.ts.map +1 -1
  620. package/dist/esm/utils/tenants.d.ts +48 -0
  621. package/dist/esm/utils/tenants.d.ts.map +1 -0
  622. package/dist/esm/utils/tenants.js +31 -0
  623. package/dist/esm/utils/ui.d.ts +2 -0
  624. package/dist/esm/utils/ui.d.ts.map +1 -0
  625. package/dist/esm/utils/ui.js +14 -0
  626. package/dist/esm/utils/validation.d.ts +2 -0
  627. package/dist/esm/utils/validation.d.ts.map +1 -0
  628. package/dist/esm/utils/validation.js +74 -0
  629. package/dist/esm/utils/validation.uspec.d.ts +2 -0
  630. package/dist/esm/utils/validation.uspec.d.ts.map +1 -0
  631. package/dist/esm/utils/validation.uspec.js +51 -0
  632. package/package.json +22 -9
  633. package/dist/cjs/components/EnvSelectPopover.d.ts +0 -13
  634. package/dist/cjs/components/EnvSelectPopover.d.ts.map +0 -1
  635. package/dist/cjs/components/EnvSelectPopover.js +0 -224
  636. package/dist/cjs/components/SqlViewTile.d.ts +0 -8
  637. package/dist/cjs/components/SqlViewTile.d.ts.map +0 -1
  638. package/dist/cjs/components/SqlViewTile.js +0 -69
  639. package/dist/cjs/forms/client_onboard/CreateSqlViews.d.ts +0 -24
  640. package/dist/cjs/forms/client_onboard/CreateSqlViews.d.ts.map +0 -1
  641. package/dist/cjs/forms/client_onboard/CreateSqlViews.js +0 -250
  642. package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts +0 -29
  643. package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts.map +0 -1
  644. package/dist/cjs/forms/sql_views/CreateEditSqlView.js +0 -228
  645. package/dist/cjs/modals/PromoteDashModal.d.ts +0 -17
  646. package/dist/cjs/modals/PromoteDashModal.d.ts.map +0 -1
  647. package/dist/cjs/modals/PromoteDashModal.js +0 -133
  648. package/dist/cjs/primitives/SelectPrimitive.d.ts +0 -16
  649. package/dist/cjs/primitives/SelectPrimitive.d.ts.map +0 -1
  650. package/dist/cjs/primitives/SelectPrimitive.js +0 -43
  651. package/dist/cjs/public_components/DashboardBuilder.d.ts +0 -7
  652. package/dist/cjs/public_components/DashboardBuilder.d.ts.map +0 -1
  653. package/dist/cjs/public_components/DashboardBuilder.js +0 -220
  654. package/dist/cjs/public_components/SQLViewManager.d.ts.map +0 -1
  655. package/dist/cjs/public_components/SQLViewManager.js +0 -563
  656. package/dist/esm/components/EnvSelectPopover.d.ts +0 -13
  657. package/dist/esm/components/EnvSelectPopover.d.ts.map +0 -1
  658. package/dist/esm/components/EnvSelectPopover.js +0 -221
  659. package/dist/esm/components/SqlViewTile.d.ts +0 -8
  660. package/dist/esm/components/SqlViewTile.d.ts.map +0 -1
  661. package/dist/esm/components/SqlViewTile.js +0 -40
  662. package/dist/esm/forms/client_onboard/CreateSqlViews.d.ts +0 -24
  663. package/dist/esm/forms/client_onboard/CreateSqlViews.d.ts.map +0 -1
  664. package/dist/esm/forms/client_onboard/CreateSqlViews.js +0 -242
  665. package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts +0 -29
  666. package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts.map +0 -1
  667. package/dist/esm/forms/sql_views/CreateEditSqlView.js +0 -222
  668. package/dist/esm/modals/PromoteDashModal.d.ts +0 -17
  669. package/dist/esm/modals/PromoteDashModal.d.ts.map +0 -1
  670. package/dist/esm/modals/PromoteDashModal.js +0 -130
  671. package/dist/esm/primitives/SelectPrimitive.d.ts +0 -16
  672. package/dist/esm/primitives/SelectPrimitive.d.ts.map +0 -1
  673. package/dist/esm/primitives/SelectPrimitive.js +0 -41
  674. package/dist/esm/public_components/DashboardBuilder.d.ts +0 -7
  675. package/dist/esm/public_components/DashboardBuilder.d.ts.map +0 -1
  676. package/dist/esm/public_components/DashboardBuilder.js +0 -214
  677. package/dist/esm/public_components/SQLViewManager.d.ts.map +0 -1
  678. package/dist/esm/public_components/SQLViewManager.js +0 -555
@@ -1,348 +1,1310 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
2
+ import { useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { useAdmin } from '../AdminProvider';
4
- import { useDashboard } from '@quillsql/react';
5
- import { InitialDateRangeOptions, QUILL_SERVER, defaultDateRange, } from '../utils/constants';
4
+ import { useDashboard, useDashboards, } from '@quillsql/react';
5
+ import { SAVED_QUERIES_DASHBOARD,
6
+ // DateRangeOption,
7
+ // InitialDateRangeOptions,
8
+ SINGLE_TENANT,
9
+ // defaultDateRange,
10
+ } from '../utils/constants';
6
11
  import { defaultTheme, getPostgresBasicType } from '../Admin';
7
12
  import InputLabel from '../components/InputLabel';
8
13
  import CardSection from '../components/CardSection';
9
- import TogglePrimitive from '../primitives/TogglePrimitive';
10
14
  import { SegmentedControl } from '../components/SegmentedControl';
11
15
  import { convertFieldTypeToJSType } from '../utils/columnProcessing';
12
- export function EditFiltersModal({ isOpen, dashboardData, selectedDashboard, client, setIsOpen, onSave, ModalComponent, TextInputComponent, ButtonComponent, HeaderComponent, SelectComponent, dashNames, SecondaryButtonComponent, openEditOrderModal, }) {
13
- const { state, dispatch } = useAdmin();
14
- const [selectedDashboardName, setSelectedDashboardName] = useState('');
15
- const { data } = useDashboard(selectedDashboard.name);
16
+ import { validateDashboard } from '../utils/validation';
17
+ import { OverflowContainer, } from '../components/UiComponents';
18
+ import { QuillSelectComponentWithCombo } from '../components/QuillSelectWithCombo';
19
+ import DownChevronIcon from '../icons/DownChevronIcon';
20
+ import RightChevronIcon from '../icons/RightChevronIcon';
21
+ import TextInputPrimitive from '../primitives/TextInputPrimitive';
22
+ import { SingleDatePicker } from '../components/DateRangePicker/SingleDatePicker';
23
+ import { set } from 'date-fns';
24
+ import { QuillYearlessDateRangePicker } from '../components/DateRangePicker/YearlessDateRangePicker';
25
+ import ExclamationFilledIcon from '../icons/ExclamationFilledIcon';
26
+ import { QuillToolTipPortal } from '../components/QuillToolTipPortal';
27
+ import { convertPresetOptionsToSelectableList } from '../components/DateRangePicker/dateRangePickerUtils';
28
+ import { QuillPopover } from '../components/QuillPopover';
29
+ const intervalTypeOptions = [
30
+ // {
31
+ // label: 'Week',
32
+ // value: 'week'
33
+ // },
34
+ {
35
+ label: 'Last',
36
+ value: 'relative',
37
+ },
38
+ {
39
+ label: 'Custom Term',
40
+ value: 'repeating',
41
+ },
42
+ {
43
+ label: 'Static',
44
+ value: 'static',
45
+ },
46
+ ];
47
+ export function EditFiltersModal({ isOpen, selectedDashboardName, setIsOpen, onSave, ModalComponent, TextInputComponent, ButtonComponent, HeaderComponent, SelectComponent, dashNames, SecondaryButtonComponent, ErrorComponent, openPromoteModal, }) {
48
+ const { state } = useAdmin();
49
+ const { dashboards, deleteDashboard, updateDashboard } = useDashboards();
50
+ const { data: selectedDashboard } = useDashboard(selectedDashboardName);
16
51
  const [isDateComparison, setIsDateComparison] = useState(false);
52
+ const [currentDashboardName, setCurrentDashboardName] = useState(selectedDashboardName);
17
53
  const [newFilters, setNewFilters] = useState([]);
18
- const [initialRange, setInitialRange] = useState(defaultDateRange);
54
+ const [initialRange, setInitialRange] = useState(selectedDashboard?.dateFilter?.primaryRange ?? {
55
+ label: 'Last 30 days',
56
+ value: 'LAST_30_DAYS',
57
+ });
19
58
  const [showDateFilter, setShowDateFilter] = useState(false);
20
- const [newDateFilter, setNewDateFilter] = useState(null);
59
+ const [newDateFilter, setNewDateFilter] = useState();
60
+ const [validationError, setValidationError] = useState([]);
61
+ const [filterNameMap, setFilterNameMap] = useState({});
62
+ const [showCustomIntervals, setShowCustomIntervals] = useState(false);
63
+ const [displaySubIntervals, setDisplaySubIntervals] = useState([]);
64
+ const assignDefaultInterval = (label, set, loopStart, loopEnd) => {
65
+ if (!newDateFilter)
66
+ return;
67
+ if (set) {
68
+ setNewDateFilter({
69
+ ...newDateFilter,
70
+ defaultPresetRanges: [
71
+ ...(newDateFilter?.defaultPresetRanges ?? []).filter((r) => r?.label !== label),
72
+ { label, loopStart, loopEnd },
73
+ ],
74
+ });
75
+ }
76
+ else {
77
+ setNewDateFilter({
78
+ ...newDateFilter,
79
+ defaultPresetRanges: newDateFilter?.defaultPresetRanges?.filter((r) => r?.label !== label) ?? [],
80
+ });
81
+ }
82
+ };
83
+ const getDefaultInterval = (label) => {
84
+ return newDateFilter?.defaultPresetRanges?.find((r) => r?.label === label);
85
+ };
86
+ const emptyInterval = {
87
+ week: { type: 'week' },
88
+ relative: { type: 'relative', value: 1, unit: 'days' },
89
+ repeating: {
90
+ type: 'repeating',
91
+ label: 'Quarter',
92
+ loopDate: { day: 1, month: 1 },
93
+ subIntervals: [
94
+ {
95
+ type: 'static',
96
+ startDate: { day: 1, month: 1 },
97
+ endDate: { day: 31, month: 3 },
98
+ },
99
+ {
100
+ type: 'static',
101
+ startDate: { day: 1, month: 4 },
102
+ endDate: { day: 30, month: 6 },
103
+ },
104
+ {
105
+ type: 'static',
106
+ startDate: { day: 1, month: 7 },
107
+ endDate: { day: 30, month: 9 },
108
+ },
109
+ {
110
+ type: 'static',
111
+ startDate: { day: 1, month: 10 },
112
+ endDate: { day: 31, month: 12 },
113
+ },
114
+ ],
115
+ },
116
+ static: {
117
+ type: 'static',
118
+ label: 'January',
119
+ startDate: { day: 1, month: 1 },
120
+ endDate: { day: 31, month: 1 },
121
+ },
122
+ };
123
+ const subIntervalIssues = useMemo(() => {
124
+ // Helper to check if two days are adjacent (the second follows the first)
125
+ const areAdjacent = (day1, day2) => {
126
+ // Create dates in leap year 2024 for proper handling
127
+ const date1 = new Date(2024, day1.month - 1, day1.day);
128
+ const date2 = new Date(2024, day2.month - 1, day2.day);
129
+ // Add one day to first date and check if it equals the second date
130
+ const nextDay = new Date(date1);
131
+ nextDay.setDate(nextDay.getDate() + 1);
132
+ // Compare the dates ignoring time
133
+ return (nextDay.getDate() === date2.getDate() &&
134
+ nextDay.getMonth() === date2.getMonth());
135
+ };
136
+ return (newDateFilter?.presetOptions?.reduce((acc, interval, index) => {
137
+ if (interval?.type !== 'repeating' || !interval.subIntervals?.length)
138
+ return acc;
139
+ acc[index] = interval.subIntervals?.map((subInterval) => {
140
+ if (!subInterval)
141
+ return 'Sub-interval is empty';
142
+ // if (!subInterval.label) return "Sub-interval must have a label";
143
+ if (!subInterval.startDate ||
144
+ !subInterval.startDate.day ||
145
+ !subInterval.startDate.month)
146
+ return 'Sub-interval must have a start date';
147
+ if (!subInterval.endDate ||
148
+ !subInterval.endDate.day ||
149
+ !subInterval.endDate.month)
150
+ return 'Sub-interval must have an end date';
151
+ // Verify sub-interval doesn't overlap with other sub-intervals
152
+ // Use 2024 (leap year) for proper date handling
153
+ const subIntervalStart = new Date(2024, subInterval.startDate.month - 1, subInterval.startDate.day);
154
+ const subIntervalEnd = new Date(2024, subInterval.endDate.month - 1, subInterval.endDate.day);
155
+ const overlappingSubIntervals = interval.subIntervals?.filter((otherSubInterval) => {
156
+ if (!otherSubInterval || otherSubInterval === subInterval)
157
+ return false;
158
+ // Check for proper adjacency with February end transitions
159
+ if (subInterval.endDate.month === 2 &&
160
+ (subInterval.endDate.day === 28 ||
161
+ subInterval.endDate.day === 29) &&
162
+ otherSubInterval.startDate?.month === 3 &&
163
+ otherSubInterval.startDate?.day === 1) {
164
+ if (areAdjacent(subInterval.endDate, otherSubInterval.startDate)) {
165
+ return false; // They're adjacent, not overlapping
166
+ }
167
+ }
168
+ // Otherwise do normal overlap check
169
+ const otherSubIntervalStart = new Date(2024, (otherSubInterval.startDate?.month ?? 1) - 1, otherSubInterval.startDate?.day ?? 1);
170
+ const otherSubIntervalEnd = new Date(2024, (otherSubInterval.endDate?.month ?? 1) - 1, otherSubInterval.endDate?.day ?? 1);
171
+ // Check for overlap - intervals overlap if one starts before the other ends
172
+ return (subIntervalStart <= otherSubIntervalEnd &&
173
+ subIntervalEnd >= otherSubIntervalStart);
174
+ }) ?? [];
175
+ if (overlappingSubIntervals.length)
176
+ return 'Sub-intervals overlap';
177
+ return undefined;
178
+ });
179
+ return acc;
180
+ }, {}) ?? {});
181
+ }, [newDateFilter]);
182
+ const intervalIssues = useMemo(() => {
183
+ const ucFirst = (str) => str.charAt(0).toUpperCase() + str.slice(1);
184
+ // Helper function to get the next day in month/day format
185
+ const getNextDay = (month, day) => {
186
+ const date = new Date(2024, month - 1, day + 1); // Use leap year to handle Feb correctly
187
+ return {
188
+ month: date.getMonth() + 1,
189
+ day: date.getDate(),
190
+ };
191
+ };
192
+ // Helper to compare if two date objects are the same day
193
+ const isSameDay = (date1, date2) => {
194
+ return date1.month === date2.month && date1.day === date2.day;
195
+ };
196
+ // Helper to check if two days are adjacent (the second follows the first)
197
+ const areAdjacent = (day1, day2) => {
198
+ // Normal case: check if next day of day1 is day2
199
+ const nextDay = getNextDay(day1.month, day1.day);
200
+ if (isSameDay(nextDay, day2))
201
+ return true;
202
+ // Special case for February to March transition
203
+ // This handles both leap years (Feb 29 -> Mar 1) and non-leap years (Feb 28 -> Mar 1)
204
+ if (day1.month === 2 &&
205
+ (day1.day === 28 || day1.day === 29) &&
206
+ day2.month === 3 &&
207
+ day2.day === 1) {
208
+ return true;
209
+ }
210
+ // Handle month transitions for months with 30 days
211
+ if ([4, 6, 9, 11].includes(day1.month) &&
212
+ day1.day === 30 &&
213
+ day2.day === 1 &&
214
+ day2.month === day1.month + 1) {
215
+ return true;
216
+ }
217
+ // Handle month transitions for months with 31 days
218
+ if ([1, 3, 5, 7, 8, 10, 12].includes(day1.month) &&
219
+ day1.day === 31 &&
220
+ day2.day === 1 &&
221
+ (day2.month === day1.month + 1 ||
222
+ (day1.month === 12 && day2.month === 1))) {
223
+ return true;
224
+ }
225
+ return false;
226
+ };
227
+ return newDateFilter?.presetOptions?.map((interval, index) => {
228
+ if (!interval)
229
+ return 'Option is empty';
230
+ if (!interval.type)
231
+ return 'Option must have a type';
232
+ if ((interval.type === 'repeating' || interval.type === 'static') &&
233
+ !interval.label)
234
+ return `${ucFirst(interval.type)} intervals must have a label`;
235
+ // If interval label matches one of the default intervals, it must not
236
+ if ([
237
+ 'Week',
238
+ 'Month',
239
+ 'Year',
240
+ 'Last 7 days',
241
+ 'Last 30 days',
242
+ 'Last 90 days',
243
+ 'Last 6 months',
244
+ ].includes(interval.label ?? '')) {
245
+ return 'Cannot use a default interval label';
246
+ }
247
+ if (interval.type === 'repeating' || interval.type === 'static')
248
+ if (newDateFilter?.presetOptions?.filter((o, i) => o?.label === interval.label && i !== index).length)
249
+ return 'Duplicate label';
250
+ if (interval.type === 'week' &&
251
+ newDateFilter?.presetOptions?.filter((o, i) => o?.type === 'week' && i !== index).length)
252
+ return 'Only one week interval allowed';
253
+ if (interval.type === 'relative' &&
254
+ (newDateFilter?.presetOptions?.filter((o) => o?.type === 'relative' &&
255
+ o.unit === interval.unit &&
256
+ o.value === interval.value)?.length ?? 0) > 1)
257
+ return 'Duplicate relative interval';
258
+ if (interval.type === 'static') {
259
+ if (!interval.startDate ||
260
+ !interval.startDate.day ||
261
+ !interval.startDate.month)
262
+ return 'Must have a start date';
263
+ if (!interval.endDate ||
264
+ !interval.endDate.day ||
265
+ !interval.endDate.month)
266
+ return 'Must have an end date';
267
+ }
268
+ if (interval.type === 'relative') {
269
+ if (!interval.value)
270
+ return 'Must have a value';
271
+ if (typeof interval.value !== 'number' &&
272
+ isNaN(parseInt(interval.value)))
273
+ return 'Value must be an integer';
274
+ if (typeof interval.value !== 'number' && parseInt(interval.value) <= 0)
275
+ return 'Value must be positive';
276
+ if (!interval.unit)
277
+ return 'Must have a unit';
278
+ }
279
+ if (interval.type === 'repeating') {
280
+ if (!interval.loopDate ||
281
+ !interval.loopDate.day ||
282
+ !interval.loopDate.month)
283
+ return 'Must have a loop date';
284
+ if (!interval.subIntervals?.length)
285
+ return 'Must have sub-intervals';
286
+ if (subIntervalIssues[index]?.some((issue) => !!issue))
287
+ return 'Sub-intervals have issues';
288
+ // Verify subintervals don't overlap with each other
289
+ const subIntervals = interval.subIntervals?.filter((si) => !!si) || [];
290
+ // First, sort them by start date for validation
291
+ const sortedIntervals = [...subIntervals].sort((a, b) => {
292
+ const aDate = new Date(2024, a.startDate.month - 1, a.startDate.day);
293
+ const bDate = new Date(2024, b.startDate.month - 1, b.startDate.day);
294
+ return aDate.getTime() - bDate.getTime();
295
+ });
296
+ // Find the interval that starts on the loop date
297
+ const loopDate = interval.loopDate;
298
+ const startingIntervalIndex = sortedIntervals.findIndex((si) => si?.startDate?.month === loopDate.month &&
299
+ si?.startDate?.day === loopDate.day);
300
+ if (startingIntervalIndex === -1)
301
+ return 'No sub-interval starts on the loop date';
302
+ // Reorder the array to start with the loop date interval
303
+ const orderedIntervals = [
304
+ ...sortedIntervals.slice(startingIntervalIndex),
305
+ ...sortedIntervals.slice(0, startingIntervalIndex),
306
+ ];
307
+ // Check for contiguity and completeness
308
+ for (let i = 0; i < orderedIntervals.length - 1; i++) {
309
+ const current = orderedIntervals[i];
310
+ const next = orderedIntervals[i + 1];
311
+ if (!areAdjacent(current.endDate, next.startDate)) {
312
+ return `Gap between ${current.label} and ${next.label}`;
313
+ }
314
+ }
315
+ // Check if the last interval connects back to the first one
316
+ const last = orderedIntervals[orderedIntervals.length - 1];
317
+ const first = orderedIntervals[0];
318
+ if (!areAdjacent(last.endDate, first.startDate)) {
319
+ if (!(areAdjacent({ month: 12, day: 31 }, first.startDate) &&
320
+ areAdjacent(last.endDate, { month: 1, day: 1 }))) {
321
+ return `Gap between ${last.label} and ${first.label}`;
322
+ }
323
+ }
324
+ }
325
+ });
326
+ }, [newDateFilter, subIntervalIssues]);
327
+ const filteredTables = useMemo(() => {
328
+ return state.tables.filter((table) => {
329
+ return (selectedDashboard?.tenantKeys?.[0] === SINGLE_TENANT ||
330
+ table.ownerTenantFields?.length === 0 ||
331
+ table.ownerTenantFields?.includes(selectedDashboard?.tenantKeys?.[0] ?? ''));
332
+ });
333
+ }, [state.tables, selectedDashboard?.tenantKeys]);
334
+ const months = useRef([
335
+ 'January',
336
+ 'February',
337
+ 'March',
338
+ 'April',
339
+ 'May',
340
+ 'June',
341
+ 'July',
342
+ 'August',
343
+ 'September',
344
+ 'October',
345
+ 'November',
346
+ 'December',
347
+ ]);
348
+ const monthlyInterval = useMemo(() => getDefaultInterval('Monthly'), [newDateFilter?.defaultPresetRanges]);
349
+ const yearlyInterval = useMemo(() => getDefaultInterval('Yearly'), [newDateFilter?.defaultPresetRanges]);
21
350
  useEffect(() => {
22
351
  if (!selectedDashboard) {
23
352
  return;
24
353
  }
25
- setSelectedDashboardName(selectedDashboard);
26
- setIsDateComparison(selectedDashboard.dateFilter?.comparison);
27
- setNewFilters(selectedDashboard.filters || []);
354
+ setValidationError([]);
355
+ setCurrentDashboardName(selectedDashboard.name);
356
+ setIsDateComparison(selectedDashboard?.dateFilter?.comparison ?? false);
357
+ setNewFilters(selectedDashboard?.filters ?? []);
28
358
  setNewDateFilter(selectedDashboard.dateFilter);
29
- setSelectedDashboardName(selectedDashboard.name);
359
+ setDisplaySubIntervals(selectedDashboard.dateFilter?.presetOptions?.map(() => false) ?? []);
30
360
  setShowDateFilter(!!selectedDashboard.dateFilter);
361
+ setInitialRange(selectedDashboard.dateFilter?.primaryRange ?? {
362
+ label: 'Last 30 days',
363
+ value: 'LAST_30_DAYS',
364
+ });
365
+ setFilterNameMap(selectedDashboard.filters.reduce((acc, filter) => {
366
+ acc[filter.label] = filter.label;
367
+ return acc;
368
+ }, {}));
31
369
  }, [selectedDashboard]);
370
+ const selectablePresetOptions = useMemo(() => {
371
+ return convertPresetOptionsToSelectableList((newDateFilter?.presetOptions?.filter((option, index) => !!option && !intervalIssues?.[index]) ?? []), newDateFilter?.defaultPresetRanges ?? []);
372
+ }, [
373
+ newDateFilter?.presetOptions,
374
+ newDateFilter?.defaultPresetRanges,
375
+ intervalIssues,
376
+ ]);
377
+ const dashboardValidationError = useMemo(() => {
378
+ if (!currentDashboardName)
379
+ return 'Dashboard name cannot be empty';
380
+ if (newFilters?.some((f) => !f.label || !f.table || !f.field))
381
+ return 'Filters must have a label, table, and field';
382
+ if (newFilters
383
+ ?.map((f) => f.label)
384
+ .filter((label, index, self) => self.indexOf(label) !== index).length)
385
+ return 'Filters must have unique labels';
386
+ if (newDateFilter && (!newDateFilter?.label || !initialRange))
387
+ return 'Date filter must have a label and range';
388
+ if (intervalIssues?.some((i) => i))
389
+ return 'Date filter presets have issues';
390
+ if (!selectablePresetOptions?.find((option) => option.value === initialRange.value))
391
+ return 'Date filter must have a valid initial range';
392
+ if (newDateFilter?.defaultPresetRanges?.some((range) => range?.label === 'Yearly' && !range.loopStart))
393
+ return 'Yearly intervals must have a backwards cutoff date';
394
+ if (newDateFilter?.defaultPresetRanges?.some((range) => range?.label === 'Monthly' && !range.loopStart))
395
+ return 'Monthly intervals must have a backwards cutoff date';
396
+ // Ensure loopEnd is after loopStart
397
+ if (newDateFilter?.defaultPresetRanges?.some((range) => range?.label === 'Yearly' &&
398
+ range?.loopEnd &&
399
+ range?.loopStart &&
400
+ range.loopEnd <= range.loopStart))
401
+ return 'Yearly intervals must have an end date that occurs after the start date';
402
+ if (newDateFilter?.defaultPresetRanges?.some((range) => range?.label === 'Monthly' &&
403
+ range?.loopEnd &&
404
+ range?.loopStart &&
405
+ range.loopEnd <= range.loopStart))
406
+ return 'Monthly intervals must have an end date that occurs after the start date';
407
+ }, [
408
+ currentDashboardName,
409
+ newFilters,
410
+ newDateFilter,
411
+ initialRange,
412
+ intervalIssues,
413
+ selectablePresetOptions,
414
+ ]);
32
415
  const handleAddFilter = async () => {
33
416
  setNewFilters([...newFilters, { label: '' }]);
34
417
  };
418
+ const normalizeFieldName = (fieldName) => {
419
+ return (fieldName
420
+ ?.split('_')
421
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
422
+ .join(' ') ?? '');
423
+ };
35
424
  const handleSubmitDashboardChanges = async () => {
36
- if (!selectedDashboardName ||
37
- newFilters.some((filter) => !filter.label) ||
38
- (newDateFilter &&
39
- Object.keys(newDateFilter).length &&
40
- !newDateFilter.label)) {
41
- alert('Empty fields');
42
- return;
43
- }
44
- if (newFilters.filter((elem) => !elem.field).length) {
45
- alert(`no filter field for: ${newFilters.filter((elem) => !elem.field)[0].label}`);
425
+ const validationErrorMessages = validateDashboard(newFilters, dashNames, currentDashboardName, newDateFilter ? { ...newDateFilter, comparison: isDateComparison } : null, { ...selectedDashboard, name: currentDashboardName });
426
+ if (validationErrorMessages.length !== 0) {
427
+ setValidationError(validationErrorMessages);
46
428
  return;
47
429
  }
48
430
  const updatedFilters = newFilters.map((filter) => {
49
- const table = state.tables.find((table) => table.name === filter.table);
50
- const filterType = getPostgresBasicType(table.columns.find((col) => col.name === filter.field));
431
+ const table = filteredTables.find((table) => table?.name === filter?.table);
432
+ const filterType = getPostgresBasicType(table.columns.find((col) => col?.name === filter?.field));
51
433
  return {
52
434
  table: filter.table,
53
435
  field: filter.field,
54
436
  labelField: filter.field,
55
437
  label: filter.label,
438
+ oldLabel: Object.entries(filterNameMap).find(([oldLabel, newLabel]) => newLabel === filter.label && oldLabel !== filter.label)?.[0],
56
439
  filterType,
57
440
  stringFilterType: filter.stringFilterType,
58
441
  };
59
442
  });
60
- if (dashNames &&
61
- dashNames.length > 0 &&
62
- dashNames.some((dashName) => dashName.name === selectedDashboardName &&
63
- selectedDashboardName !== selectedDashboard.name)) {
64
- alert('Dashboard name already taken!');
65
- return;
66
- }
67
- const fieldsSet = new Set();
68
- const hasDuplicateField = updatedFilters.some((filter) => {
69
- if (fieldsSet.has(filter.field)) {
70
- return true;
71
- }
72
- else {
73
- fieldsSet.add(filter.field);
74
- return false;
75
- }
76
- });
77
- if (hasDuplicateField ||
78
- (newDateFilter &&
79
- Object.keys(newDateFilter).length > 0 &&
80
- updatedFilters.some((filter) => filter.filterType === 'date'))) {
81
- alert('Maximum of one filter per field');
82
- return;
83
- }
84
- let allValid = true;
85
- updatedFilters.forEach((filter) => {
86
- if (filter.filterType !== 'string' && filter.filterType !== 'date') {
87
- allValid = false;
88
- console.error(`Invalid filterType found: ${filter.filterType}`);
89
- }
90
- });
91
- if (!allValid) {
92
- alert('We only support string and date filters.');
93
- return;
94
- }
95
- const filterProblems = [];
96
- if (newDateFilter) {
97
- data.newQueries.forEach((chart) => {
98
- if (!chart.dateField ||
99
- !chart.dateField.table ||
100
- !chart.dateField.field) {
101
- filterProblems.push({
102
- chart: chart.name,
103
- filter: `${newDateFilter.label} (Date filter)`,
104
- });
105
- }
106
- if (chart.chartType === 'pie' && isDateComparison) {
107
- filterProblems.push({
108
- chart: chart.name,
109
- filter: `${newDateFilter.label} (Date comparison)`,
110
- });
111
- }
112
- });
113
- }
114
- updatedFilters.forEach((filter) => {
115
- data.newQueries.forEach((chart) => {
116
- const chartTable = chart.referencedTables.find((table) => table === filter.table);
117
- if (!chartTable) {
118
- filterProblems.push({ chart: chart.name, filter: filter.label });
119
- }
120
- });
121
- });
122
- if (filterProblems.length > 0) {
123
- alert(`The following filters are not applicable to the following charts:\n\n${filterProblems.map((problem) => `${problem.filter} - ${problem.chart}`).join('\n')}\n\nPlease update the charts or remove the filters.`);
124
- return;
125
- }
126
- const url = `${QUILL_SERVER}/dashfilter/${client._id}/`;
127
- const body = {
128
- newDashboardName: selectedDashboardName.trim(),
129
- filters: updatedFilters,
443
+ await updateDashboard(selectedDashboardName, {
444
+ newName: currentDashboardName,
445
+ filters: updatedFilters.map((filter) => {
446
+ return {
447
+ ...filter,
448
+ filterType: filter.filterType,
449
+ dashboardName: currentDashboardName,
450
+ options: [],
451
+ };
452
+ }),
130
453
  dateFilter: newDateFilter
131
454
  ? {
132
455
  ...newDateFilter,
133
456
  comparison: isDateComparison,
134
457
  primaryRange: initialRange,
458
+ presetOptions: newDateFilter.presetOptions
459
+ ?.map((interval) => {
460
+ if (!interval)
461
+ return undefined;
462
+ if (interval.type === 'repeating') {
463
+ return {
464
+ ...interval,
465
+ subIntervals: interval.subIntervals?.map((subInterval) => {
466
+ if (!subInterval)
467
+ return undefined;
468
+ return {
469
+ ...subInterval,
470
+ startDate: subInterval.startDate,
471
+ endDate: subInterval.endDate,
472
+ };
473
+ }),
474
+ };
475
+ }
476
+ if (interval.type === 'static') {
477
+ return {
478
+ ...interval,
479
+ startDate: interval.startDate,
480
+ endDate: interval.endDate,
481
+ };
482
+ }
483
+ if (interval.type === 'relative') {
484
+ return {
485
+ ...interval,
486
+ value: typeof interval.value === 'string'
487
+ ? parseInt(interval.value)
488
+ : interval.value,
489
+ };
490
+ }
491
+ return interval;
492
+ })
493
+ .filter((interval) => !!interval),
135
494
  }
136
- : null,
137
- name: selectedDashboard.name
138
- ? selectedDashboard.name.trim()
139
- : selectedDashboardName.trim(),
140
- databaseType: state.client.databaseType,
141
- };
142
- const headers = {
143
- 'Content-Type': 'application/json',
144
- Authorization: `Bearer `,
145
- };
146
- try {
147
- const response = await fetch(url, {
148
- method: 'POST',
149
- headers: headers,
150
- body: JSON.stringify(body),
151
- });
152
- await onSave(selectedDashboardName);
153
- setIsOpen(false);
154
- }
155
- catch (e) {
156
- console.log('error');
157
- }
495
+ : undefined,
496
+ // sectionOrder,
497
+ });
498
+ await onSave(currentDashboardName);
499
+ setIsOpen(false);
158
500
  };
159
501
  const handleDeleteFilter = (filter) => {
502
+ // When a filter is deleted, we don't have any easy method of removing its entry in
503
+ // the filterMap on the actual dashboard item. We'll just leave it there for now.
504
+ delete filterNameMap[filter.label];
160
505
  setNewFilters(newFilters.filter((f) => f !== filter));
161
506
  };
162
- const handleDeleteDateFilter = async () => {
507
+ const handleDeleteDateFilter = () => {
163
508
  setShowDateFilter(false);
164
- setNewDateFilter(null);
509
+ setNewDateFilter(undefined);
165
510
  };
166
- const handleAddDateFilter = async () => {
511
+ const handleAddDateFilter = () => {
167
512
  setShowDateFilter(true);
168
- setNewDateFilter({ label: null });
513
+ setNewDateFilter({
514
+ label: 'Date',
515
+ defaultPresetRanges: [
516
+ { label: 'This week' },
517
+ { label: 'This month' },
518
+ { label: 'This year' },
519
+ { label: 'Last 7 days' },
520
+ { label: 'Last 30 days' },
521
+ { label: 'Last 90 days' },
522
+ { label: 'Last 6 months' },
523
+ ],
524
+ });
525
+ };
526
+ const handleAddInterval = () => {
527
+ setNewDateFilter({
528
+ ...newDateFilter,
529
+ presetOptions: [
530
+ ...(newDateFilter?.presetOptions ?? []),
531
+ emptyInterval['static'],
532
+ ],
533
+ });
534
+ setDisplaySubIntervals([...displaySubIntervals, false]);
535
+ };
536
+ const handleDeleteInterval = (index) => {
537
+ const updatedOptions = newDateFilter?.presetOptions?.filter((_, i) => i !== index) ?? [];
538
+ setNewDateFilter({
539
+ ...newDateFilter,
540
+ presetOptions: updatedOptions,
541
+ });
542
+ setDisplaySubIntervals(displaySubIntervals.filter((_, i) => i !== index));
543
+ };
544
+ const handleAddSubInterval = (index) => {
545
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => index === i
546
+ ? {
547
+ ...o,
548
+ subIntervals: [
549
+ ...(o.subIntervals ?? []),
550
+ emptyInterval['static'],
551
+ ],
552
+ }
553
+ : o) ?? [];
554
+ setNewDateFilter({
555
+ ...newDateFilter,
556
+ presetOptions: updatedOptions,
557
+ });
558
+ };
559
+ const handleDeleteSubInterval = (index, subIndex) => {
560
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => index === i
561
+ ? {
562
+ ...o,
563
+ subIntervals: o.subIntervals?.filter((_, j) => j !== subIndex),
564
+ }
565
+ : o) ?? [];
566
+ setNewDateFilter({
567
+ ...newDateFilter,
568
+ presetOptions: updatedOptions,
569
+ });
169
570
  };
170
571
  const handleDeleteDashboard = async () => {
171
572
  if (confirm('Are you sure? This action cannot be undone.')) {
172
- const URL = `${QUILL_SERVER}/dashboard/${selectedDashboard.name}`;
173
- await fetch(URL, {
174
- method: 'DELETE',
175
- headers: { 'Content-Type': 'application/json' },
176
- body: JSON.stringify({
177
- clientId: client._id,
178
- databaseType: state.client.databaseType,
179
- dashboardName: selectedDashboard.name,
180
- }),
181
- });
573
+ await deleteDashboard(selectedDashboardName);
574
+ onSave((dashboards?.filter((d) => d.name !== SAVED_QUERIES_DASHBOARD &&
575
+ d.name !== selectedDashboardName)?.[0]?.name ??
576
+ (state.client?.defaultDashboard?.name &&
577
+ state.client?.defaultDashboard?.name !== selectedDashboardName))
578
+ ? state.client?.defaultDashboard?.name
579
+ : null);
182
580
  setIsOpen(false);
183
581
  setNewFilters([]);
184
- await onSave();
185
582
  }
186
583
  };
187
- return (_jsx(ModalComponent, { isOpen: isOpen, close: () => {
584
+ return (_jsx(ModalComponent, { isOpen: isOpen, onClose: () => {
585
+ setValidationError([]);
188
586
  setIsOpen(false);
189
- setSelectedDashboardName(selectedDashboard);
190
- setIsDateComparison(selectedDashboard.dateFilter?.comparison);
191
- setNewFilters(selectedDashboard.filters || []);
192
- setNewDateFilter(selectedDashboard.dateFilter);
193
- setSelectedDashboardName(selectedDashboard.name);
194
- setShowDateFilter(!!selectedDashboard.dateFilter);
587
+ setIsDateComparison(selectedDashboard?.dateFilter?.comparison ?? false);
588
+ setNewFilters(selectedDashboard?.filters ?? []);
589
+ setNewDateFilter(selectedDashboard?.dateFilter ?? undefined);
590
+ setCurrentDashboardName(selectedDashboardName);
591
+ setShowDateFilter(!!selectedDashboard?.dateFilter);
195
592
  }, style: {
196
593
  minWidth: '814px',
197
- }, children: _jsxs("div", { style: {
198
- display: 'flex',
199
- gap: 16,
200
- flexDirection: 'column',
201
- width: '100%',
202
- height: '100%',
203
- maxHeight: '100%',
204
- overflowY: 'auto',
205
- }, children: [_jsx(HeaderComponent, { label: "Manage dashboard" }), _jsxs("div", { children: [_jsx(InputLabel, { children: "Name" }), _jsx("div", { style: { maxWidth: 230 }, children: _jsx(TextInputComponent, { value: selectedDashboardName, onChange: (e) => setSelectedDashboardName(e.target.value) }) })] }), _jsxs("div", { children: [_jsxs("div", { style: {
206
- display: 'flex',
207
- flexDirection: 'column',
208
- gap: '10px',
209
- }, children: [_jsx(CardSection, { children: "Date Filter" }), showDateFilter && (_jsx(_Fragment, { children: _jsxs("div", { style: {
210
- display: 'flex',
211
- flexDirection: 'row',
212
- gap: '10px',
213
- }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(InputLabel, { children: "Label" }), _jsx("div", { style: {
594
+ }, children: _jsx(OverflowContainer, { children: _jsx("div", { children: _jsxs("div", { style: {
595
+ display: 'flex',
596
+ gap: 16,
597
+ flexDirection: 'column',
598
+ width: '100%',
599
+ height: '100%',
600
+ maxHeight: '100%',
601
+ // overflowY: 'auto',
602
+ }, children: [_jsx(HeaderComponent, { label: "Manage dashboard" }), _jsxs("div", { children: [_jsx(InputLabel, { children: "Name" }), _jsx("div", { style: { maxWidth: 230 }, children: _jsx(TextInputComponent, { width: "230px", value: currentDashboardName, onChange: (e) => setCurrentDashboardName(e.target.value) }) })] }), (state.client?.allTenantTypes?.length ?? 1) <= 1 ? null : (_jsxs("div", { children: [_jsx(InputLabel, { tooltip: "Data coming into this dashboard is filtered by this singular tenant. Reports may only reference virtual tables owned by this tenant (or owned by no tenants). This is only selectable while creating a new dashboard", children: "Dashboard Owner" }), _jsx("div", { style: { maxWidth: 230 }, children: _jsx(SelectComponent, { onChange: () => { }, value: selectedDashboard?.tenantKeys?.[0] ?? '', options: state.client?.allTenantTypes?.map((tenant) => {
603
+ return {
604
+ label: tenant.name,
605
+ value: tenant.tenantField,
606
+ };
607
+ }), disabled: true }) })] })), _jsxs("div", { children: [_jsxs("div", { style: {
608
+ display: 'flex',
609
+ flexDirection: 'column',
610
+ gap: '10px',
611
+ }, children: [_jsx(CardSection, { children: "Date Filter" }), showDateFilter && (_jsxs(_Fragment, { children: [_jsxs("div", { style: {
612
+ display: 'flex',
613
+ flexDirection: 'row',
614
+ gap: '10px',
615
+ }, children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(InputLabel, { children: "Label" }), _jsx("div", { style: {
616
+ display: 'flex',
617
+ flexDirection: 'row',
618
+ alignItems: 'center',
619
+ }, children: _jsx(TextInputComponent, { value: newDateFilter?.label || '', width: "230px", onChange: (e) => {
620
+ setNewDateFilter({
621
+ ...newDateFilter,
622
+ label: e.target.value,
623
+ });
624
+ } }) })] }), _jsx("div", { style: {
625
+ display: 'flex',
626
+ flexDirection: 'row',
627
+ gap: '10px',
628
+ }, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(InputLabel, { children: "Initial Range" }), _jsx(SelectComponent, { value: initialRange.value, onChange: (e) => {
629
+ setInitialRange(
630
+ // InitialDateRangeOptions.find(
631
+ // (table) => table.value === e,
632
+ // ) ?? initialRange,
633
+ selectablePresetOptions.find((option) => option.value === e) ??
634
+ initialRange);
635
+ }, options: selectablePresetOptions, theme: defaultTheme, hideEmptyOption: true })] }) }), _jsx("div", { style: {
636
+ display: 'flex',
637
+ flexDirection: 'row',
638
+ gap: '10px',
639
+ width: '100%',
640
+ }, children: _jsx("div", { style: {
641
+ display: 'flex',
642
+ flexDirection: 'column',
643
+ width: '100%',
644
+ justifyContent: 'flex-end',
645
+ }, children: _jsxs("div", { style: {
646
+ display: 'flex',
647
+ flexDirection: 'row',
648
+ gap: 10,
649
+ width: '100%',
650
+ }, children: [_jsx("div", { style: {
651
+ display: 'flex',
652
+ flexDirection: 'column',
653
+ justifyContent: 'center',
654
+ height: '100%',
655
+ minWidth: 200,
656
+ maxWidth: 200,
657
+ width: 200,
658
+ } }), _jsx("div", { style: {
659
+ width: '100%',
660
+ display: 'flex',
661
+ justifyContent: 'flex-end',
662
+ }, children: _jsx("div", { onClick: () => handleDeleteDateFilter(), style: {
663
+ height: 38,
664
+ width: 38,
665
+ alignItems: 'center',
666
+ justifyContent: 'flex-end',
667
+ display: 'flex',
668
+ cursor: 'pointer',
669
+ }, children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#4C5462", width: "20", height: "20", children: _jsx("path", { fillRule: "evenodd", d: "M5.47 5.47a.75.75 0 011.06 0L12 10.94l5.47-5.47a.75.75 0 111.06 1.06L13.06 12l5.47 5.47a.75.75 0 11-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 01-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 010-1.06z", clipRule: "evenodd" }) }) }) })] }) }) })] }), _jsx(QuillPopover, { style: {
670
+ width: 230,
671
+ marginTop: -8,
672
+ display: 'none',
673
+ }, children: _jsxs("div", { style: {
214
674
  display: 'flex',
215
- flexDirection: 'row',
216
- alignItems: 'center',
217
- }, children: _jsx(TextInputComponent, { value: newDateFilter?.label || '', onChange: (e) => {
218
- setNewDateFilter({
219
- ...newDateFilter,
220
- label: e.target.value,
221
- });
222
- } }) })] }), _jsx("div", { style: {
223
- display: 'flex',
224
- flexDirection: 'row',
225
- gap: '10px',
226
- }, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(InputLabel, { children: "Initial Range" }), _jsx(SelectComponent, { value: initialRange.label, onChange: (e) => {
227
- setInitialRange(InitialDateRangeOptions.find((table) => table.label === e) ?? initialRange);
228
- }, options: InitialDateRangeOptions.map((table) => {
229
- return { label: table.label, value: table.label };
230
- }), theme: defaultTheme })] }) }), _jsx("div", { style: {
231
- display: 'flex',
675
+ flexDirection: 'column',
676
+ fontFamily: defaultTheme.fontFamily,
677
+ gap: 8,
678
+ }, children: [_jsx("h3", { style: {
679
+ fontSize: 14,
680
+ fontWeight: 600,
681
+ color: defaultTheme.primaryTextColor,
682
+ }, children: "Recurring" }), _jsxs("div", { style: {
683
+ display: 'flex',
684
+ flexDirection: 'row',
685
+ gap: 8,
686
+ alignItems: 'center',
687
+ // justifyContent: 'space-between',
688
+ marginTop: yearlyInterval ? -9.5 : 0,
689
+ marginBottom: yearlyInterval ? 0 : 9.5,
690
+ }, children: [_jsxs("div", { style: {
691
+ display: 'flex',
692
+ alignItems: 'center',
693
+ gap: 8,
694
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!yearlyInterval, onChange: (e) => {
695
+ assignDefaultInterval('Yearly', e.target.checked, new Date(new Date().getFullYear() - 1, 0, 1), new Date(new Date().getFullYear(), 11, 31));
696
+ } }), _jsx("div", { children: "Yearly (2023, 2024, 2025, ...)" })] }), !!yearlyInterval && (_jsxs("div", { style: {
697
+ display: 'flex',
698
+ flexDirection: 'row',
699
+ gap: 2,
700
+ alignItems: 'center',
701
+ marginLeft: 26,
702
+ }, children: [_jsx(TextInputComponent, { value: yearlyInterval?.loopStart
703
+ ?.getFullYear()
704
+ .toString() ?? '', placeholder: "Start Year", onChange: (e) => {
705
+ const year = parseInt(e.target.value);
706
+ assignDefaultInterval('Yearly', true, new Date(year, 0, 1), yearlyInterval?.loopEnd);
707
+ }, width: "78px", number: true, max: 9999, min: 0, step: 1 }), _jsx("div", { children: "-" }), _jsx(TextInputComponent, { value: yearlyInterval?.loopEnd
708
+ ?.getFullYear()
709
+ .toString() ?? '', placeholder: "End Year", onChange: (e) => {
710
+ const year = parseInt(e.target.value);
711
+ assignDefaultInterval('Yearly', true, yearlyInterval?.loopStart, new Date(year, 11, 31));
712
+ }, width: "78px", number: true, max: 9999, min: 0, step: 1 })] }))] }), _jsxs("div", { style: {
713
+ display: 'flex',
714
+ flexDirection: 'row',
715
+ gap: 8,
716
+ alignItems: 'center',
717
+ justifyContent: 'space-between',
718
+ marginTop: monthlyInterval ? -6.5 : 3,
719
+ marginBottom: monthlyInterval ? 0 : 9.5,
720
+ width: '100%',
721
+ }, children: [_jsxs("div", { style: {
722
+ display: 'flex',
723
+ alignItems: 'center',
724
+ gap: 8,
725
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!monthlyInterval, onChange: (e) => {
726
+ // Set date to current month - 12 months
727
+ assignDefaultInterval('Monthly', e.target.checked, new Date(new Date().getFullYear() - 1, new Date().getMonth(), 1), new Date(new Date().getFullYear(), new Date().getMonth(), 1));
728
+ } }), _jsx("div", { children: "Monthly (Jan 2025, Feb 2025, ...)" })] }), monthlyInterval && (_jsxs("div", { style: {
729
+ display: 'flex',
730
+ flexDirection: 'row',
731
+ gap: 2,
732
+ alignItems: 'center',
733
+ }, children: [_jsx(QuillSelectComponentWithCombo, { value: monthlyInterval?.loopStart
734
+ ?.getMonth()
735
+ .toString() ?? '', onChange: (e) => {
736
+ const month = parseInt(e.target.value);
737
+ assignDefaultInterval('Monthly', true, new Date(monthlyInterval?.loopStart?.getFullYear() ??
738
+ 2025, month, 1), monthlyInterval?.loopEnd);
739
+ }, options: Array.from({ length: 12 }, (_, i) => ({
740
+ label: months.current[i],
741
+ value: i.toString(),
742
+ })), width: 120, hideEmptyOption: true }), _jsx(TextInputPrimitive, { value: monthlyInterval?.loopStart
743
+ ?.getFullYear()
744
+ .toString() ?? '', placeholder: "Start Year", onChange: (e) => {
745
+ const year = parseInt(e.target.value);
746
+ assignDefaultInterval('Monthly', true, new Date(year, monthlyInterval?.loopStart?.getMonth() ??
747
+ 0, 1), monthlyInterval?.loopEnd);
748
+ }, width: "78px", number: true, max: 9999, min: 0, step: 1 }), _jsx("div", { children: "-" }), _jsx(QuillSelectComponentWithCombo, { value: monthlyInterval?.loopEnd
749
+ ?.getMonth()
750
+ .toString() ?? '', onChange: (e) => {
751
+ const month = parseInt(e.target.value);
752
+ assignDefaultInterval('Monthly', true, monthlyInterval?.loopStart, new Date(monthlyInterval?.loopEnd?.getFullYear() ??
753
+ 2025, month, 1));
754
+ }, options: Array.from({ length: 12 }, (_, i) => ({
755
+ label: months.current[i],
756
+ value: i.toString(),
757
+ })), width: 120, hideEmptyOption: true }), _jsx(TextInputPrimitive, { value: monthlyInterval?.loopEnd
758
+ ?.getFullYear()
759
+ .toString() ?? '', placeholder: "End Year", onChange: (e) => {
760
+ const year = parseInt(e.target.value);
761
+ assignDefaultInterval('Monthly', true, monthlyInterval?.loopStart, new Date(year, monthlyInterval?.loopEnd?.getMonth() ?? 0, 1));
762
+ }, width: "78px", number: true, max: 9999, min: 0, step: 1 })] }))] }), _jsx("h3", { style: {
763
+ fontSize: 14,
764
+ fontWeight: 600,
765
+ color: defaultTheme.primaryTextColor,
766
+ }, children: "Standard" }), _jsxs("div", { style: {
767
+ display: 'flex',
768
+ flexDirection: 'row',
769
+ gap: 8,
770
+ alignItems: 'center',
771
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!getDefaultInterval('This week'), onChange: (e) => {
772
+ assignDefaultInterval('This week', e.target.checked);
773
+ } }), "This week"] }), _jsxs("div", { style: {
774
+ display: 'flex',
775
+ flexDirection: 'row',
776
+ gap: 8,
777
+ alignItems: 'center',
778
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!getDefaultInterval('This month'), onChange: (e) => {
779
+ assignDefaultInterval('This month', e.target.checked);
780
+ } }), "This month"] }), _jsxs("div", { style: {
781
+ display: 'flex',
782
+ flexDirection: 'row',
783
+ gap: 8,
784
+ alignItems: 'center',
785
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!getDefaultInterval('This year'), onChange: (e) => {
786
+ assignDefaultInterval('This year', e.target.checked);
787
+ } }), "This year"] }), _jsxs("div", { style: {
788
+ display: 'flex',
789
+ flexDirection: 'row',
790
+ gap: 8,
791
+ alignItems: 'center',
792
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!getDefaultInterval('Last 7 days'), onChange: (e) => {
793
+ assignDefaultInterval('Last 7 days', e.target.checked);
794
+ } }), "Last 7 days"] }), _jsxs("div", { style: {
795
+ display: 'flex',
796
+ flexDirection: 'row',
797
+ gap: 8,
798
+ alignItems: 'center',
799
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!getDefaultInterval('Last 30 days'), onChange: (e) => {
800
+ assignDefaultInterval('Last 30 days', e.target.checked);
801
+ } }), "Last 30 days"] }), _jsxs("div", { style: {
802
+ display: 'flex',
803
+ flexDirection: 'row',
804
+ gap: 8,
805
+ alignItems: 'center',
806
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!getDefaultInterval('Last 90 days'), onChange: (e) => {
807
+ assignDefaultInterval('Last 90 days', e.target.checked);
808
+ } }), "Last 90 days"] }), _jsxs("div", { style: {
809
+ display: 'flex',
810
+ flexDirection: 'row',
811
+ gap: 8,
812
+ alignItems: 'center',
813
+ }, children: [_jsx("input", { type: "checkbox", style: { width: 16, height: 16 }, checked: !!getDefaultInterval('Last 6 months'), onChange: (e) => {
814
+ assignDefaultInterval('Last 6 months', e.target.checked);
815
+ } }), "Last 6 months"] })] }) })] })), !showDateFilter && (_jsx("div", { style: { maxWidth: 230 }, children: _jsx(SecondaryButtonComponent, { onClick: handleAddDateFilter, label: "Add date filter +" }) })), newDateFilter && (_jsx(_Fragment, { children: _jsxs("div", { style: {
816
+ // display: 'flex',
817
+ display: 'none',
232
818
  flexDirection: 'row',
233
- gap: '10px',
234
- width: '100%',
235
- }, children: _jsxs("div", { style: {
819
+ gap: '4px',
820
+ userSelect: 'none',
821
+ cursor: 'pointer',
822
+ width: 'fit-content',
823
+ }, onClick: () => setShowCustomIntervals(!showCustomIntervals), children: [_jsx(InputLabel, { children: "Custom Date Filter Presets" }), showCustomIntervals ? (_jsx(DownChevronIcon, { style: {
824
+ color: '#4C5462',
825
+ marginBottom: -2,
826
+ marginTop: 2,
827
+ } })) : (_jsx(RightChevronIcon, { style: {
828
+ color: '#4C5462',
829
+ marginBottom: -2,
830
+ marginTop: 2,
831
+ } }))] }) })), showCustomIntervals && newDateFilter && (_jsxs(_Fragment, { children: [newDateFilter?.presetOptions?.map((interval, index) => !interval ? null : (_jsxs("div", { style: {
236
832
  display: 'flex',
237
833
  flexDirection: 'column',
238
- width: '100%',
239
- }, children: [_jsx(InputLabel, { children: "Date Comparison" }), _jsxs("div", { style: {
834
+ gap: '10px',
835
+ }, children: [_jsxs("div", { style: {
240
836
  display: 'flex',
241
837
  flexDirection: 'row',
242
- gap: 10,
243
- width: '100%',
244
- }, children: [_jsx("div", { style: {
838
+ gap: '10px',
839
+ }, children: [_jsxs("div", { style: {
840
+ display: 'flex',
841
+ flexDirection: 'column',
842
+ }, children: [index === 0 && _jsx(InputLabel, { children: "Label" }), _jsx(TextInputComponent, { value: interval.label ?? '', placeholder: interval.type === 'week'
843
+ ? 'Week'
844
+ : interval.type === 'relative'
845
+ ? 'Last ' +
846
+ (interval.value === 1
847
+ ? ''
848
+ : interval.value + ' ') +
849
+ (interval.value === 1
850
+ ? interval.unit.substring(0, interval.unit.length - 1)
851
+ : interval.unit)
852
+ : 'Label', width: "230px", onChange: (e) => {
853
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => {
854
+ return index === i
855
+ ? { ...o, label: e.target.value }
856
+ : o;
857
+ }) ?? [];
858
+ setNewDateFilter({
859
+ ...newDateFilter,
860
+ presetOptions: updatedOptions,
861
+ });
862
+ } })] }), _jsxs("div", { style: {
863
+ display: 'flex',
864
+ flexDirection: 'column',
865
+ }, children: [index === 0 && _jsx(InputLabel, { children: "Type" }), _jsx(SelectComponent, { value: interval.type, options: intervalTypeOptions, onChange: (e) => {
866
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => {
867
+ return index === i
868
+ ? emptyInterval[e]
869
+ : o;
870
+ }) ?? [];
871
+ setNewDateFilter({
872
+ ...newDateFilter,
873
+ presetOptions: updatedOptions,
874
+ });
875
+ }, theme: defaultTheme, hideEmptyOption: true })] }), _jsxs("div", { style: {
876
+ display: 'flex',
877
+ flexDirection: 'column',
878
+ }, children: [index === 0 && _jsx(InputLabel, { children: "Value" }), interval.type === 'week' && (_jsx("div", { style: { width: 200, visibility: 'hidden' } })), interval.type === 'relative' && (_jsxs("div", { style: {
879
+ display: 'flex',
880
+ flexDirection: 'row',
881
+ gap: 10,
882
+ }, children: [_jsx(TextInputComponent, { value: interval.value?.toString() ?? '0', width: "70px", onChange: (e) => {
883
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => {
884
+ return index === i
885
+ ? { ...o, value: e.target.value }
886
+ : o;
887
+ }) ?? [];
888
+ setNewDateFilter({
889
+ ...newDateFilter,
890
+ presetOptions: updatedOptions,
891
+ });
892
+ }, style: {
893
+ zIndex: 1,
894
+ } }), _jsx(SelectComponent, { value: interval.unit ?? 'days', options: [
895
+ {
896
+ label: interval.value?.toString() === '1'
897
+ ? 'day'
898
+ : 'days',
899
+ value: 'days',
900
+ },
901
+ {
902
+ label: interval.value?.toString() === '1'
903
+ ? 'week'
904
+ : 'weeks',
905
+ value: 'weeks',
906
+ },
907
+ {
908
+ label: interval.value?.toString() === '1'
909
+ ? 'month'
910
+ : 'months',
911
+ value: 'months',
912
+ },
913
+ {
914
+ label: interval.value?.toString() === '1'
915
+ ? 'year'
916
+ : 'years',
917
+ value: 'years',
918
+ },
919
+ ], onChange: (e) => {
920
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => {
921
+ return index === i
922
+ ? { ...o, unit: e }
923
+ : o;
924
+ }) ?? [];
925
+ setNewDateFilter({
926
+ ...newDateFilter,
927
+ presetOptions: updatedOptions,
928
+ });
929
+ }, theme: defaultTheme, hideEmptyOption: true, style: {
930
+ width: 120,
931
+ maxWidth: 120,
932
+ minWidth: 120,
933
+ } })] })), interval.type === 'repeating' && (_jsx(SingleDatePicker, { selectedDate: interval.loopDate
934
+ ? set(new Date(), {
935
+ date: interval.loopDate.day,
936
+ month: (interval.loopDate.month ?? 1) - 1,
937
+ year: 2024,
938
+ })
939
+ : undefined, onChangeDate: (date) => {
940
+ if (!date)
941
+ return;
942
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => {
943
+ return index === i
944
+ ? {
945
+ ...o,
946
+ loopDate: {
947
+ day: date.getDate(),
948
+ month: date.getMonth() + 1,
949
+ },
950
+ }
951
+ : o;
952
+ }) ?? [];
953
+ setNewDateFilter({
954
+ ...newDateFilter,
955
+ presetOptions: updatedOptions,
956
+ });
957
+ }, disabled: false, style: {
958
+ width: 200,
959
+ minWidth: 200,
960
+ } })), interval.type === 'static' && (_jsx(QuillYearlessDateRangePicker, { dateRange: {
961
+ startDate: interval.startDate
962
+ ? set(new Date(), {
963
+ date: interval.startDate.day,
964
+ month: (interval.startDate.month ?? 1) - 1,
965
+ year: 2024,
966
+ })
967
+ : undefined,
968
+ endDate: interval.endDate
969
+ ? set(new Date(), {
970
+ date: interval.endDate.day,
971
+ month: (interval.endDate.month ?? 1) - 1,
972
+ year: 2024,
973
+ })
974
+ : undefined,
975
+ }, onChangeDateRange: (value) => {
976
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => {
977
+ return index === i
978
+ ? {
979
+ ...o,
980
+ startDate: value.startDate
981
+ ? {
982
+ day: value.startDate.getDate(),
983
+ month: value.startDate.getMonth() +
984
+ 1,
985
+ }
986
+ : undefined,
987
+ endDate: value.endDate
988
+ ? {
989
+ day: value.endDate.getDate(),
990
+ month: value.endDate.getMonth() +
991
+ 1,
992
+ }
993
+ : undefined,
994
+ }
995
+ : o;
996
+ }) ?? [];
997
+ setNewDateFilter({
998
+ ...newDateFilter,
999
+ presetOptions: updatedOptions,
1000
+ });
1001
+ } }))] }), _jsxs("div", { style: {
245
1002
  display: 'flex',
246
1003
  flexDirection: 'column',
247
- justifyContent: 'center',
248
1004
  height: '100%',
249
- minWidth: 200,
250
- maxWidth: 200,
251
- width: 200,
252
- }, children: _jsx(TogglePrimitive, { value: isDateComparison, onClick: () => {
253
- setIsDateComparison((isDateComparison) => !isDateComparison);
254
- } }) }), _jsx("div", { style: {
1005
+ }, children: [index === 0 && (_jsx("div", { style: { visibility: 'hidden' }, children: _jsx(InputLabel, { children: "Inter" }) })), interval.type !==
1006
+ 'repeating' ? null : displaySubIntervals[index] ? (_jsx(DownChevronIcon, { style: {
1007
+ color: '#4C5462',
1008
+ // center vertically
1009
+ alignItems: 'center',
1010
+ display: 'flex',
1011
+ marginTop: 10,
1012
+ }, onClick: () => {
1013
+ const updatedDisplay = displaySubIntervals.map((d, i) => index === i ? !d : d);
1014
+ setDisplaySubIntervals(updatedDisplay);
1015
+ } })) : (_jsx(RightChevronIcon, { style: {
1016
+ color: '#4C5462',
1017
+ // center vertically
1018
+ alignItems: 'center',
1019
+ display: 'flex',
1020
+ marginTop: 10,
1021
+ }, onClick: () => {
1022
+ const updatedDisplay = displaySubIntervals.map((d, i) => index === i ? !d : d);
1023
+ setDisplaySubIntervals(updatedDisplay);
1024
+ } }))] }), _jsxs("div", { style: {
1025
+ flexGrow: 1,
1026
+ display: 'flex',
1027
+ flexDirection: 'row',
1028
+ justifyContent: 'flex-end',
1029
+ }, children: [_jsxs("div", { style: {
1030
+ display: 'flex',
1031
+ flexDirection: 'column',
1032
+ marginLeft: 'auto',
1033
+ justifySelf: 'flex-end',
1034
+ }, children: [index === 0 && (_jsx("div", { style: { visibility: 'hidden' }, children: _jsx(InputLabel, { children: "Inter" }) })), _jsx(QuillToolTipPortal, { containerStyle: {
1035
+ visibility: intervalIssues?.[index]
1036
+ ? 'visible'
1037
+ : 'hidden',
1038
+ }, text: intervalIssues?.[index], children: _jsx(ExclamationFilledIcon, { height: 28, width: 28, style: {
1039
+ color: '#dc143c',
1040
+ marginTop: 6,
1041
+ marginLeft: 'auto',
1042
+ // Push to end of row
1043
+ display: 'flex',
1044
+ } }) })] }), _jsx("div", { style: {
1045
+ display: 'flex',
1046
+ justifyContent: 'flex-end',
1047
+ }, children: _jsx("div", { onClick: () => handleDeleteInterval(index), style: {
1048
+ height: 38,
1049
+ width: 38,
1050
+ alignItems: 'center',
1051
+ justifyContent: 'flex-end',
1052
+ display: 'flex',
1053
+ cursor: 'pointer',
1054
+ marginTop: index === 0 ? 25 : 2,
1055
+ }, children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#4C5462", width: "20", height: "20", children: _jsx("path", { fillRule: "evenodd", d: "M5.47 5.47a.75.75 0 011.06 0L12 10.94l5.47-5.47a.75.75 0 111.06 1.06L13.06 12l5.47 5.47a.75.75 0 11-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 01-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 010-1.06z", clipRule: "evenodd" }) }) }) })] })] }), displaySubIntervals[index] &&
1056
+ interval.type === 'repeating' && (_jsxs("div", { style: {
1057
+ display: 'flex',
1058
+ flexDirection: 'column',
1059
+ gap: '10px',
1060
+ marginLeft: 30,
1061
+ width: 'calc(100% - 30px)',
1062
+ }, children: [interval.subIntervals?.map((subInterval, subIndex) => !subInterval ? null : (_jsxs("div", { style: {
1063
+ display: 'flex',
1064
+ flexDirection: 'row',
1065
+ gap: '10px',
255
1066
  width: '100%',
1067
+ }, children: [_jsx(QuillYearlessDateRangePicker, { dateRange: {
1068
+ startDate: subInterval.startDate
1069
+ ? set(new Date(), {
1070
+ date: subInterval.startDate
1071
+ .day,
1072
+ month: (subInterval.startDate
1073
+ .month ?? 1) - 1,
1074
+ year: 2024,
1075
+ })
1076
+ : undefined,
1077
+ endDate: subInterval.endDate
1078
+ ? set(new Date(), {
1079
+ date: subInterval.endDate.day,
1080
+ month: (subInterval.endDate
1081
+ .month ?? 1) - 1,
1082
+ year: 2024,
1083
+ })
1084
+ : undefined,
1085
+ }, onChangeDateRange: (value) => {
1086
+ const updatedOptions = newDateFilter?.presetOptions?.map((o, i) => {
1087
+ return index === i
1088
+ ? {
1089
+ ...o,
1090
+ subIntervals: o.subIntervals?.map((s, j) => subIndex === j
1091
+ ? {
1092
+ ...s,
1093
+ startDate: value.startDate
1094
+ ? {
1095
+ day: value.startDate.getDate(),
1096
+ month: value.startDate.getMonth() +
1097
+ 1,
1098
+ }
1099
+ : undefined,
1100
+ endDate: value.endDate
1101
+ ? {
1102
+ day: value.endDate.getDate(),
1103
+ month: value.endDate.getMonth() +
1104
+ 1,
1105
+ }
1106
+ : undefined,
1107
+ }
1108
+ : s),
1109
+ }
1110
+ : o;
1111
+ }) ?? [];
1112
+ setNewDateFilter({
1113
+ ...newDateFilter,
1114
+ presetOptions: updatedOptions,
1115
+ });
1116
+ }, style: {
1117
+ marginLeft: 420,
1118
+ } }), _jsxs("div", { style: {
1119
+ flexGrow: 1,
1120
+ display: 'flex',
1121
+ flexDirection: 'row',
1122
+ justifyContent: 'flex-end',
1123
+ }, children: [_jsx("div", { style: {
1124
+ display: 'flex',
1125
+ flexDirection: 'column',
1126
+ height: '100%',
1127
+ marginLeft: 'auto',
1128
+ justifySelf: 'flex-end',
1129
+ }, children: _jsx(QuillToolTipPortal, { containerStyle: {
1130
+ visibility: intervalIssues?.[index]
1131
+ ? 'visible'
1132
+ : 'hidden',
1133
+ }, text: subIntervalIssues[index]?.[subIndex], children: _jsx(ExclamationFilledIcon, { height: 28, width: 28, style: {
1134
+ color: '#dc143c',
1135
+ marginTop: 6,
1136
+ marginLeft: 'auto',
1137
+ // Push to end of row
1138
+ display: 'flex',
1139
+ visibility: subIntervalIssues[index]?.[subIndex]
1140
+ ? 'visible'
1141
+ : 'hidden',
1142
+ } }) }) }), _jsx("div", { style: {
1143
+ display: 'flex',
1144
+ justifyContent: 'flex-end',
1145
+ }, children: _jsx("div", { onClick: () => handleDeleteSubInterval(index, subIndex), style: {
1146
+ height: 38,
1147
+ width: 38,
1148
+ alignItems: 'center',
1149
+ justifyContent: 'flex-end',
1150
+ display: 'flex',
1151
+ cursor: 'pointer',
1152
+ marginTop: 2,
1153
+ }, children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#4C5462", width: "20", height: "20", children: _jsx("path", { fillRule: "evenodd", d: "M5.47 5.47a.75.75 0 011.06 0L12 10.94l5.47-5.47a.75.75 0 111.06 1.06L13.06 12l5.47 5.47a.75.75 0 11-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 01-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 010-1.06z", clipRule: "evenodd" }) }) }) })] })] }, `sub-interval-${subIndex}`))), _jsx("div", { style: {
256
1154
  display: 'flex',
1155
+ flexDirection: 'row',
1156
+ gap: '10px',
257
1157
  justifyContent: 'flex-end',
258
- }, children: _jsx("div", { onClick: () => handleDeleteDateFilter(), style: {
259
- height: 38,
260
- width: 38,
261
- alignItems: 'center',
262
- justifyContent: 'flex-end',
1158
+ width: 620,
1159
+ borderTop: '1px solid #d7d7d7',
1160
+ paddingTop: 10,
1161
+ }, children: _jsx("div", { style: {
263
1162
  display: 'flex',
264
- cursor: 'pointer',
265
- }, children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#4C5462", width: "20", height: "20", children: _jsx("path", { fillRule: "evenodd", d: "M5.47 5.47a.75.75 0 011.06 0L12 10.94l5.47-5.47a.75.75 0 111.06 1.06L13.06 12l5.47 5.47a.75.75 0 11-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 01-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 010-1.06z", clipRule: "evenodd" }) }) }) })] })] }) })] }) })), !showDateFilter && (_jsx("div", { style: { maxWidth: 230 }, children: _jsx(SecondaryButtonComponent, { onClick: handleAddDateFilter, label: "Add date filter +" }) }))] }), _jsx("div", { style: {
266
- display: 'flex',
267
- flexDirection: 'row',
268
- alignItems: 'center',
269
- justifyContent: 'space-between',
270
- marginTop: 20,
271
- }, children: _jsx(CardSection, { children: "Filters" }) }), newFilters.length > 0 && (_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '6px' }, children: newFilters.map((filter, index) => {
272
- return (_jsxs("div", { style: {
1163
+ flexDirection: 'column',
1164
+ }, children: _jsx(SecondaryButtonComponent, { onClick: () => handleAddSubInterval(index), label: "Add Sub-Interval +", style: {
1165
+ width: 200,
1166
+ } }) }) })] }))] }, `preset-option-${index}`))), _jsx("div", { style: {
1167
+ display: 'flex',
1168
+ flexDirection: 'row',
1169
+ gap: '10px',
1170
+ justifyContent: 'flex-end',
1171
+ width: '100%',
1172
+ }, children: _jsx("div", { style: {
1173
+ display: 'flex',
1174
+ flexDirection: 'column',
1175
+ }, children: _jsx(SecondaryButtonComponent, { onClick: handleAddInterval, label: "Add Interval +" }) }) })] }))] }), _jsxs("div", { style: {
273
1176
  display: 'flex',
274
- flexDirection: 'row',
1177
+ flexDirection: 'column',
275
1178
  gap: '10px',
276
- }, children: [_jsxs("div", { style: {
277
- display: 'flex',
278
- flexDirection: 'column',
279
- // maxWidth: 300,
280
- }, children: [index === 0 && _jsx(InputLabel, { children: "Label" }), _jsx(TextInputComponent, { value: filter?.label || '', onChange: (e) => {
281
- const updatedFilters = newFilters.map((otherFilter, i) => index === i
282
- ? { ...otherFilter, label: e.target.value }
283
- : otherFilter);
284
- setNewFilters(updatedFilters);
285
- } })] }), _jsxs("div", { style: {
286
- display: 'flex',
287
- flexDirection: 'column',
288
- maxWidth: 300,
289
- }, children: [index === 0 && _jsx(InputLabel, { children: "Table" }), _jsx(SelectComponent, { value: filter.table || '', onChange: (e) => {
290
- const updatedFilters = newFilters.map((otherFilter, i) => index === i
291
- ? { ...otherFilter, table: e }
292
- : otherFilter);
293
- setNewFilters(updatedFilters);
294
- }, options: state.tables.map((table) => {
295
- return { label: table.name, value: table.name };
296
- }), theme: defaultTheme })] }), _jsxs("div", { style: {
1179
+ }, children: [_jsx("div", { style: {
297
1180
  display: 'flex',
298
- flexDirection: 'column',
299
- maxWidth: 300,
300
- }, children: [index === 0 && _jsx(InputLabel, { children: "Field" }), _jsx(SelectComponent, { defaultValue: "", value: filter && filter.field ? filter.field : '', options: filter.table
301
- ? state.tables
302
- .find((table) => table.name === filter.table)
303
- ?.columns.filter((column) => {
304
- return (convertFieldTypeToJSType(column.fieldType) === 'string');
305
- })
306
- .map((column) => {
307
- return {
308
- label: column.name,
309
- value: column.name,
310
- };
311
- })
312
- : [], onChange: (e) => {
313
- const updatedFilters = newFilters.map((otherFilter, i) => index === i
314
- ? { ...otherFilter, field: e }
315
- : otherFilter);
316
- setNewFilters(updatedFilters);
317
- } })] }), _jsxs("div", { style: {
1181
+ flexDirection: 'row',
1182
+ alignItems: 'center',
1183
+ justifyContent: 'space-between',
1184
+ marginTop: 20,
1185
+ }, children: _jsx(CardSection, { children: "Filters" }) }), newFilters.length > 0 && (_jsx("div", { style: {
318
1186
  display: 'flex',
319
1187
  flexDirection: 'column',
320
- width: '100%',
321
- }, children: [index === 0 && _jsx(InputLabel, { children: "Filter Type" }), _jsx("div", { style: {
322
- display: 'flex',
323
- flexDirection: 'column',
324
- alignItems: 'center',
325
- width: '100%',
326
- }, children: _jsxs("div", { style: {
1188
+ gap: '6px',
1189
+ }, children: newFilters.map((filter, index) => (_jsxs("div", { style: {
1190
+ display: 'flex',
1191
+ flexDirection: 'row',
1192
+ gap: '10px',
1193
+ }, children: [_jsxs("div", { style: {
327
1194
  display: 'flex',
328
- flexDirection: 'row',
329
- alignItems: 'center',
330
- width: '100%',
331
- gap: 10,
332
- }, children: [_jsx(SegmentedControl, { theme: defaultTheme, value: filter && filter.stringFilterType
333
- ? filter.stringFilterType
334
- : 'default', onChange: (e) => {
1195
+ flexDirection: 'column',
1196
+ // maxWidth: 300,
1197
+ }, children: [index === 0 && _jsx(InputLabel, { children: "Label" }), _jsx(TextInputComponent, { value: filter?.label || '', width: "230px", onChange: (e) => {
1198
+ const currentLabel = filter.label;
1199
+ const updatedFilters = newFilters.map((otherFilter, i) => index === i
1200
+ ? {
1201
+ ...otherFilter,
1202
+ label: e.target.value,
1203
+ }
1204
+ : otherFilter);
1205
+ setNewFilters(updatedFilters);
1206
+ // Find the value in the map that matches the current label
1207
+ const oldLabel = Object.entries(filterNameMap).find(([, newLabel]) => newLabel === currentLabel)?.[0];
1208
+ if (oldLabel) {
1209
+ // Update the map to reflect the new label
1210
+ setFilterNameMap({
1211
+ ...filterNameMap,
1212
+ [oldLabel]: e.target.value,
1213
+ });
1214
+ }
1215
+ } })] }), _jsxs("div", { style: {
1216
+ display: 'flex',
1217
+ flexDirection: 'column',
1218
+ // maxWidth: 250,
1219
+ }, children: [index === 0 && _jsx(InputLabel, { children: "Table" }), _jsx(QuillSelectComponentWithCombo, { width: 200, value: filter.table || '', onChange: (event) => {
1220
+ const e = event.target.value;
1221
+ const updatedFilters = newFilters.map((otherFilter, i) => index === i
1222
+ ? { ...otherFilter, table: e }
1223
+ : otherFilter);
1224
+ setNewFilters(updatedFilters);
1225
+ }, options: filteredTables.map((table) => {
1226
+ return { label: table.name, value: table.name };
1227
+ }), hideEmptyOption: true })] }), _jsxs("div", { style: {
1228
+ display: 'flex',
1229
+ flexDirection: 'column',
1230
+ maxWidth: 300,
1231
+ }, children: [index === 0 && _jsx(InputLabel, { children: "Field" }), _jsx(QuillSelectComponentWithCombo, { width: 200, value: filter && filter.field ? filter.field : '', options: filter.table
1232
+ ? filteredTables
1233
+ .find((table) => table.name === filter.table)
1234
+ ?.columns.filter((column) => {
1235
+ return (convertFieldTypeToJSType(column.fieldType) === 'string');
1236
+ })
1237
+ .map((column) => {
1238
+ return {
1239
+ label: column.name,
1240
+ value: column.name,
1241
+ };
1242
+ })
1243
+ : [], onChange: (event) => {
1244
+ // Capitalize the label
1245
+ const e = event.target.value;
335
1246
  const updatedFilters = newFilters.map((otherFilter, i) => index === i
336
- ? { ...otherFilter, stringFilterType: e }
1247
+ ? {
1248
+ ...otherFilter,
1249
+ field: e,
1250
+ label: filter.label === '' ||
1251
+ filter.label ===
1252
+ normalizeFieldName(filter.field)
1253
+ ? normalizeFieldName(e)
1254
+ : filter.label,
1255
+ }
337
1256
  : otherFilter);
338
1257
  setNewFilters(updatedFilters);
339
- } }), _jsx("div", { onClick: () => handleDeleteFilter(filter), style: {
1258
+ }, hideEmptyOption: true, disabled: !filter.table })] }), _jsxs("div", { style: {
1259
+ display: 'flex',
1260
+ flexDirection: 'column',
1261
+ width: '100%',
1262
+ }, children: [index === 0 && (_jsx(InputLabel, { children: "Filter Type" })), _jsx("div", { style: {
1263
+ display: 'flex',
1264
+ flexDirection: 'column',
1265
+ alignItems: 'center',
1266
+ width: '100%',
1267
+ }, children: _jsx("div", { style: {
1268
+ display: 'flex',
1269
+ flexDirection: 'row',
1270
+ alignItems: 'center',
1271
+ width: '100%',
1272
+ gap: 10,
1273
+ }, children: _jsx(SegmentedControl, { theme: defaultTheme, value: filter && filter.stringFilterType
1274
+ ? filter.stringFilterType
1275
+ : 'default', onChange: (e) => {
1276
+ const updatedFilters = newFilters.map((otherFilter, i) => index === i
1277
+ ? {
1278
+ ...otherFilter,
1279
+ stringFilterType: e,
1280
+ }
1281
+ : otherFilter);
1282
+ setNewFilters(updatedFilters);
1283
+ } }) }) })] }), _jsxs("div", { style: {
1284
+ display: 'flex',
1285
+ flexDirection: 'column',
1286
+ width: '100%',
1287
+ justifyContent: 'flex-end',
1288
+ }, children: [index === 0 && _jsx(InputLabel, {}), _jsx("div", { onClick: () => handleDeleteFilter(filter), style: {
340
1289
  height: 38,
341
1290
  alignItems: 'center',
342
- justifyContent: 'flex-end',
343
1291
  display: 'flex',
344
1292
  cursor: 'pointer',
345
1293
  width: '100%',
346
- }, children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#4C5462", width: "20", height: "20", children: _jsx("path", { fillRule: "evenodd", d: "M5.47 5.47a.75.75 0 011.06 0L12 10.94l5.47-5.47a.75.75 0 111.06 1.06L13.06 12l5.47 5.47a.75.75 0 11-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 01-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 010-1.06z", clipRule: "evenodd" }) }) })] }) })] })] }, index));
347
- }) })), _jsx("div", { style: { height: 12 } }), _jsx(SecondaryButtonComponent, { onClick: handleAddFilter, label: "Add filter +" })] }), _jsx(CardSection, { children: "Chart order" }), _jsx("div", { style: { maxWidth: 230 }, children: _jsx(SecondaryButtonComponent, { onClick: () => openEditOrderModal(selectedDashboardName), label: "Edit chart order" }) }), _jsx(CardSection, { children: "Danger Zone" }), _jsx("div", { style: { maxWidth: 230 }, children: _jsx(SecondaryButtonComponent, { onClick: handleDeleteDashboard, label: "Delete Dashboard" }) }), _jsx("div", { style: { height: 18 } }), _jsx("div", { style: { maxWidth: 230 }, children: _jsx(ButtonComponent, { onClick: handleSubmitDashboardChanges, label: "Save changes" }) })] }) }));
1294
+ }, children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#4C5462", width: "20", height: "20", children: _jsx("path", { fillRule: "evenodd", d: "M5.47 5.47a.75.75 0 011.06 0L12 10.94l5.47-5.47a.75.75 0 111.06 1.06L13.06 12l5.47 5.47a.75.75 0 11-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 01-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 010-1.06z", clipRule: "evenodd" }) }) })] })] }, index))) })), _jsx("div", { children: _jsx(SecondaryButtonComponent, { onClick: handleAddFilter, label: "Add filter +" }) })] })] }), _jsx(CardSection, { children: "Promote Dashboard" }), _jsx("div", { style: {
1295
+ marginTop: -4,
1296
+ display: 'flex',
1297
+ flexDirection: 'row',
1298
+ marginRight: 'auto',
1299
+ }, children: _jsx(SecondaryButtonComponent, { onClick: () => {
1300
+ openPromoteModal();
1301
+ }, label: "Choose Destination", style: {
1302
+ width: 'fit-content',
1303
+ } }) }), _jsx(CardSection, { children: "Danger Zone" }), _jsx("div", { style: { maxWidth: 230 }, children: _jsx(SecondaryButtonComponent, { onClick: handleDeleteDashboard, label: "Delete Dashboard" }) }), _jsx("div", { style: { height: 18 } }), _jsxs("div", { style: {
1304
+ width: '100%',
1305
+ display: 'flex',
1306
+ flexDirection: 'row',
1307
+ justifyContent: 'space-between',
1308
+ alignItems: 'center',
1309
+ }, children: [_jsx(ButtonComponent, { onClick: handleSubmitDashboardChanges, label: "Save changes", disabled: !!dashboardValidationError, tooltipText: dashboardValidationError }), validationError.length !== 0 && (_jsx(ErrorComponent, { errorMessage: validationError && validationError[0] }))] })] }) }) }) }));
348
1310
  }