@quillsql/admin 1.6.0 → 1.6.2

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 (686) 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 -443
  4. package/dist/cjs/AdminProvider.d.ts +108 -49
  5. package/dist/cjs/AdminProvider.d.ts.map +1 -1
  6. package/dist/cjs/AdminProvider.js +391 -220
  7. package/dist/cjs/api/ConnectionClient.d.ts +20 -30
  8. package/dist/cjs/api/ConnectionClient.d.ts.map +1 -1
  9. package/dist/cjs/api/ConnectionClient.js +314 -310
  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 -168
  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 +55 -59
  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 +14 -11
  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 +10 -2
  101. package/dist/cjs/components/SegmentedControl.d.ts.map +1 -1
  102. package/dist/cjs/components/SegmentedControl.js +27 -22
  103. package/dist/cjs/components/SqlTextEditor.d.ts +6 -1
  104. package/dist/cjs/components/SqlTextEditor.d.ts.map +1 -1
  105. package/dist/cjs/components/SqlTextEditor.js +62 -13
  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 +237 -30
  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 +2 -0
  121. package/dist/cjs/constants/dataTypes.d.ts.map +1 -0
  122. package/dist/cjs/constants/dataTypes.js +23 -0
  123. package/dist/cjs/forms/client_onboard/ConnectDatabase.d.ts +15 -6
  124. package/dist/cjs/forms/client_onboard/ConnectDatabase.d.ts.map +1 -1
  125. package/dist/cjs/forms/client_onboard/ConnectDatabase.js +214 -109
  126. package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts +13 -9
  127. package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
  128. package/dist/cjs/forms/client_onboard/ConnectSchema.js +158 -236
  129. package/dist/cjs/forms/client_onboard/CreateVirtualTables.d.ts +47 -0
  130. package/dist/cjs/forms/client_onboard/CreateVirtualTables.d.ts.map +1 -0
  131. package/dist/cjs/forms/client_onboard/CreateVirtualTables.js +396 -0
  132. package/dist/cjs/forms/client_onboard/__tests__/ConnectDatabase.test.d.ts +2 -0
  133. package/dist/cjs/forms/client_onboard/__tests__/ConnectDatabase.test.d.ts.map +1 -0
  134. package/dist/cjs/forms/client_onboard/__tests__/ConnectDatabase.test.js +571 -0
  135. package/dist/cjs/forms/client_onboard/__tests__/ConnectSchema.test.d.ts +2 -0
  136. package/dist/cjs/forms/client_onboard/__tests__/ConnectSchema.test.d.ts.map +1 -0
  137. package/dist/cjs/forms/client_onboard/__tests__/ConnectSchema.test.js +459 -0
  138. package/dist/cjs/forms/client_onboard/__tests__/CreateVirtualTables.test.d.ts +2 -0
  139. package/dist/cjs/forms/client_onboard/__tests__/CreateVirtualTables.test.d.ts.map +1 -0
  140. package/dist/cjs/forms/client_onboard/__tests__/CreateVirtualTables.test.js +385 -0
  141. package/dist/cjs/forms/virtual_tables/CreateEditVirtualTable.d.ts +20 -0
  142. package/dist/cjs/forms/virtual_tables/CreateEditVirtualTable.d.ts.map +1 -0
  143. package/dist/cjs/forms/virtual_tables/CreateEditVirtualTable.js +294 -0
  144. package/dist/cjs/hooks/useDashboardManager.d.ts +16 -0
  145. package/dist/cjs/hooks/useDashboardManager.d.ts.map +1 -0
  146. package/dist/cjs/hooks/useDashboardManager.js +113 -0
  147. package/dist/cjs/hooks/useDatabaseSchema.d.ts +5 -0
  148. package/dist/cjs/hooks/useDatabaseSchema.d.ts.map +1 -0
  149. package/dist/cjs/hooks/useDatabaseSchema.js +54 -0
  150. package/dist/cjs/hooks/useItemBeingEdited.d.ts +1 -2
  151. package/dist/cjs/hooks/useItemBeingEdited.d.ts.map +1 -1
  152. package/dist/cjs/hooks/useItemBeingEdited.js +2 -14
  153. package/dist/cjs/hooks/useOnClickOutside.d.ts +4 -1
  154. package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -1
  155. package/dist/cjs/hooks/useOnClickOutside.js +50 -7
  156. package/dist/cjs/hooks/useTenants.d.ts +13 -0
  157. package/dist/cjs/hooks/useTenants.d.ts.map +1 -0
  158. package/dist/cjs/hooks/useTenants.js +174 -0
  159. package/dist/cjs/hooks/useThrottle.d.ts +2 -0
  160. package/dist/cjs/hooks/useThrottle.d.ts.map +1 -0
  161. package/dist/cjs/hooks/useThrottle.js +14 -0
  162. package/dist/cjs/icons/CheckCircleIcon.d.ts +5 -0
  163. package/dist/cjs/icons/CheckCircleIcon.d.ts.map +1 -0
  164. package/dist/cjs/icons/CheckCircleIcon.js +5 -0
  165. package/dist/cjs/icons/DownChevronIcon.d.ts +2 -0
  166. package/dist/cjs/icons/DownChevronIcon.d.ts.map +1 -0
  167. package/dist/cjs/icons/DownChevronIcon.js +7 -0
  168. package/dist/cjs/icons/ExclamationFilledIcon.d.ts +5 -0
  169. package/dist/cjs/icons/ExclamationFilledIcon.d.ts.map +1 -0
  170. package/dist/cjs/icons/ExclamationFilledIcon.js +5 -0
  171. package/dist/cjs/icons/ExteriorLinkIcon.d.ts +5 -0
  172. package/dist/cjs/icons/ExteriorLinkIcon.d.ts.map +1 -0
  173. package/dist/cjs/icons/ExteriorLinkIcon.js +5 -0
  174. package/dist/cjs/icons/GlobeIcon.d.ts +5 -0
  175. package/dist/cjs/icons/GlobeIcon.d.ts.map +1 -0
  176. package/dist/cjs/icons/GlobeIcon.js +15 -0
  177. package/dist/cjs/icons/InformationCircleIcon.d.ts +4 -0
  178. package/dist/cjs/icons/InformationCircleIcon.d.ts.map +1 -0
  179. package/dist/cjs/icons/InformationCircleIcon.js +7 -0
  180. package/dist/cjs/icons/LeftChevronIcon.d.ts +2 -0
  181. package/dist/cjs/icons/LeftChevronIcon.d.ts.map +1 -0
  182. package/dist/cjs/icons/LeftChevronIcon.js +7 -0
  183. package/dist/cjs/icons/QuestionMarkCircleIcon.d.ts +5 -0
  184. package/dist/cjs/icons/QuestionMarkCircleIcon.d.ts.map +1 -0
  185. package/dist/cjs/icons/QuestionMarkCircleIcon.js +5 -0
  186. package/dist/cjs/icons/RightChevronIcon.d.ts +2 -0
  187. package/dist/cjs/icons/RightChevronIcon.d.ts.map +1 -0
  188. package/dist/cjs/icons/RightChevronIcon.js +7 -0
  189. package/dist/cjs/icons/XMarkIcon.d.ts +0 -1
  190. package/dist/cjs/icons/XMarkIcon.d.ts.map +1 -1
  191. package/dist/cjs/icons/XMarkIcon.js +1 -1
  192. package/dist/cjs/index.d.ts +2 -3
  193. package/dist/cjs/index.d.ts.map +1 -1
  194. package/dist/cjs/index.js +6 -7
  195. package/dist/cjs/modals/CodePreview.d.ts +6 -0
  196. package/dist/cjs/modals/CodePreview.d.ts.map +1 -0
  197. package/dist/cjs/modals/CodePreview.js +151 -0
  198. package/dist/cjs/modals/EditEnvironmentModal.d.ts +15 -0
  199. package/dist/cjs/modals/EditEnvironmentModal.d.ts.map +1 -0
  200. package/dist/cjs/modals/EditEnvironmentModal.js +551 -0
  201. package/dist/cjs/modals/EditFiltersModal.d.ts +14 -10
  202. package/dist/cjs/modals/EditFiltersModal.d.ts.map +1 -1
  203. package/dist/cjs/modals/EditFiltersModal.js +1220 -254
  204. package/dist/cjs/modals/NewDashboardModal.d.ts +6 -8
  205. package/dist/cjs/modals/NewDashboardModal.d.ts.map +1 -1
  206. package/dist/cjs/modals/NewDashboardModal.js +147 -146
  207. package/dist/cjs/modals/PromoteDashboardModal.d.ts +16 -0
  208. package/dist/cjs/modals/PromoteDashboardModal.d.ts.map +1 -0
  209. package/dist/cjs/modals/PromoteDashboardModal.js +56 -0
  210. package/dist/cjs/modals/PromoteReportModal.d.ts +15 -0
  211. package/dist/cjs/modals/PromoteReportModal.d.ts.map +1 -0
  212. package/dist/cjs/modals/PromoteReportModal.js +128 -0
  213. package/dist/cjs/modals/PromoteViewModal.d.ts +5 -4
  214. package/dist/cjs/modals/PromoteViewModal.d.ts.map +1 -1
  215. package/dist/cjs/modals/PromoteViewModal.js +65 -91
  216. package/dist/cjs/modals/ReorderDashboardModal.d.ts +1 -2
  217. package/dist/cjs/modals/ReorderDashboardModal.d.ts.map +1 -1
  218. package/dist/cjs/modals/ReorderDashboardModal.js +34 -20
  219. package/dist/cjs/modals/SavedQueriesModal.d.ts +7 -0
  220. package/dist/cjs/modals/SavedQueriesModal.d.ts.map +1 -0
  221. package/dist/cjs/modals/SavedQueriesModal.js +128 -0
  222. package/dist/cjs/modals/index.d.ts +0 -1
  223. package/dist/cjs/modals/index.d.ts.map +1 -1
  224. package/dist/cjs/modals/index.js +1 -3
  225. package/dist/cjs/primitives/ButtonPrimitive.d.ts +3 -1
  226. package/dist/cjs/primitives/ButtonPrimitive.d.ts.map +1 -1
  227. package/dist/cjs/primitives/ButtonPrimitive.js +24 -16
  228. package/dist/cjs/primitives/CheckboxPrimitive.d.ts +12 -0
  229. package/dist/cjs/primitives/CheckboxPrimitive.d.ts.map +1 -0
  230. package/dist/cjs/primitives/CheckboxPrimitive.js +29 -0
  231. package/dist/cjs/primitives/HeaderPrimitive.d.ts.map +1 -1
  232. package/dist/cjs/primitives/HeaderPrimitive.js +1 -1
  233. package/dist/cjs/primitives/MiniButtonPrimitive.d.ts +7 -0
  234. package/dist/cjs/primitives/MiniButtonPrimitive.d.ts.map +1 -0
  235. package/dist/cjs/primitives/MiniButtonPrimitive.js +56 -0
  236. package/dist/cjs/primitives/ModalPrimitive.d.ts +2 -10
  237. package/dist/cjs/primitives/ModalPrimitive.d.ts.map +1 -1
  238. package/dist/cjs/primitives/ModalPrimitive.js +6 -6
  239. package/dist/cjs/primitives/PlaceholderPrimitive.d.ts +5 -0
  240. package/dist/cjs/primitives/PlaceholderPrimitive.d.ts.map +1 -0
  241. package/dist/cjs/primitives/PlaceholderPrimitive.js +18 -0
  242. package/dist/cjs/primitives/PopoverPrimitive.d.ts +8 -0
  243. package/dist/cjs/primitives/PopoverPrimitive.d.ts.map +1 -0
  244. package/dist/cjs/primitives/PopoverPrimitive.js +53 -0
  245. package/dist/cjs/primitives/SecondaryButtonPrimitive.d.ts +3 -1
  246. package/dist/cjs/primitives/SecondaryButtonPrimitive.d.ts.map +1 -1
  247. package/dist/cjs/primitives/SecondaryButtonPrimitive.js +13 -10
  248. package/dist/cjs/primitives/TextInputPrimitive.d.ts +8 -2
  249. package/dist/cjs/primitives/TextInputPrimitive.d.ts.map +1 -1
  250. package/dist/cjs/primitives/TextInputPrimitive.js +131 -21
  251. package/dist/cjs/primitives/TogglePrimitive.d.ts +6 -3
  252. package/dist/cjs/primitives/TogglePrimitive.d.ts.map +1 -1
  253. package/dist/cjs/primitives/TogglePrimitive.js +10 -7
  254. package/dist/cjs/primitives/index.d.ts +1 -1
  255. package/dist/cjs/primitives/index.d.ts.map +1 -1
  256. package/dist/cjs/primitives/index.js +3 -3
  257. package/dist/cjs/public_components/ChartQueryBuilder.d.ts +9 -0
  258. package/dist/cjs/public_components/ChartQueryBuilder.d.ts.map +1 -0
  259. package/dist/cjs/public_components/ChartQueryBuilder.js +131 -0
  260. package/dist/cjs/public_components/CreateEnvironment.d.ts +2 -1
  261. package/dist/cjs/public_components/CreateEnvironment.d.ts.map +1 -1
  262. package/dist/cjs/public_components/CreateEnvironment.js +168 -78
  263. package/dist/cjs/public_components/DashboardManager.d.ts +2 -2
  264. package/dist/cjs/public_components/DashboardManager.d.ts.map +1 -1
  265. package/dist/cjs/public_components/DashboardManager.js +354 -196
  266. package/dist/cjs/public_components/EnvSelectPopover.d.ts +12 -0
  267. package/dist/cjs/public_components/EnvSelectPopover.d.ts.map +1 -0
  268. package/dist/cjs/public_components/EnvSelectPopover.js +144 -0
  269. package/dist/cjs/public_components/VirtualTableManager.d.ts +7 -0
  270. package/dist/cjs/public_components/VirtualTableManager.d.ts.map +1 -0
  271. package/dist/cjs/public_components/VirtualTableManager.js +731 -0
  272. package/dist/cjs/public_components/__tests__/CreateEnvironment.test.d.ts +2 -0
  273. package/dist/cjs/public_components/__tests__/CreateEnvironment.test.d.ts.map +1 -0
  274. package/dist/cjs/public_components/__tests__/CreateEnvironment.test.js +685 -0
  275. package/dist/cjs/utils/astProcessing.d.ts +15 -0
  276. package/dist/cjs/utils/astProcessing.d.ts.map +1 -0
  277. package/dist/cjs/utils/astProcessing.js +105 -0
  278. package/dist/cjs/utils/astProcessing.uspec.d.ts +2 -0
  279. package/dist/cjs/utils/astProcessing.uspec.d.ts.map +1 -0
  280. package/dist/cjs/utils/astProcessing.uspec.js +30 -0
  281. package/dist/cjs/utils/columnProcessing.d.ts +15 -0
  282. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -0
  283. package/dist/cjs/utils/columnProcessing.js +208 -0
  284. package/dist/cjs/utils/constants.d.ts +4 -21
  285. package/dist/cjs/utils/constants.d.ts.map +1 -1
  286. package/dist/cjs/utils/constants.js +20 -11
  287. package/dist/cjs/utils/dataEditor.d.ts +4 -3
  288. package/dist/cjs/utils/dataEditor.d.ts.map +1 -1
  289. package/dist/cjs/utils/dataEditor.js +69 -119
  290. package/dist/cjs/utils/dataFetcher.d.ts +20 -2
  291. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  292. package/dist/cjs/utils/dataFetcher.js +46 -56
  293. package/dist/cjs/utils/databases.d.ts +20 -9
  294. package/dist/cjs/utils/databases.d.ts.map +1 -1
  295. package/dist/cjs/utils/databases.js +66 -28
  296. package/dist/cjs/utils/filter.d.ts +222 -0
  297. package/dist/cjs/utils/filter.d.ts.map +1 -0
  298. package/dist/cjs/utils/filter.js +347 -0
  299. package/dist/cjs/utils/monacoAutocomplete.d.ts +22 -0
  300. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
  301. package/dist/cjs/utils/monacoAutocomplete.js +355 -0
  302. package/dist/cjs/utils/report.d.ts +120 -0
  303. package/dist/cjs/utils/report.d.ts.map +1 -0
  304. package/dist/cjs/utils/report.js +109 -0
  305. package/dist/cjs/utils/schema.d.ts +43 -26
  306. package/dist/cjs/utils/schema.d.ts.map +1 -1
  307. package/dist/cjs/utils/schema.js +175 -0
  308. package/dist/cjs/utils/table.d.ts +70 -4
  309. package/dist/cjs/utils/table.d.ts.map +1 -1
  310. package/dist/cjs/utils/tenants.d.ts +48 -0
  311. package/dist/cjs/utils/tenants.d.ts.map +1 -0
  312. package/dist/cjs/utils/tenants.js +37 -0
  313. package/dist/cjs/utils/textProcessing.js +1 -2
  314. package/dist/cjs/utils/ui.d.ts +2 -0
  315. package/dist/cjs/utils/ui.d.ts.map +1 -0
  316. package/dist/cjs/utils/ui.js +18 -0
  317. package/dist/cjs/utils/validation.d.ts +2 -0
  318. package/dist/cjs/utils/validation.d.ts.map +1 -0
  319. package/dist/cjs/utils/validation.js +77 -0
  320. package/dist/cjs/utils/validation.uspec.d.ts +2 -0
  321. package/dist/cjs/utils/validation.uspec.d.ts.map +1 -0
  322. package/dist/cjs/utils/validation.uspec.js +53 -0
  323. package/dist/esm/Admin.d.ts +41 -87
  324. package/dist/esm/Admin.d.ts.map +1 -1
  325. package/dist/esm/Admin.js +355 -409
  326. package/dist/esm/AdminProvider.d.ts +108 -49
  327. package/dist/esm/AdminProvider.d.ts.map +1 -1
  328. package/dist/esm/AdminProvider.js +391 -221
  329. package/dist/esm/api/ConnectionClient.d.ts +20 -30
  330. package/dist/esm/api/ConnectionClient.d.ts.map +1 -1
  331. package/dist/esm/api/ConnectionClient.js +303 -295
  332. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  333. package/dist/esm/components/Banner/index.d.ts +0 -1
  334. package/dist/esm/components/Banner/index.d.ts.map +1 -1
  335. package/dist/esm/components/ClipboardButton.d.ts +8 -0
  336. package/dist/esm/components/ClipboardButton.d.ts.map +1 -0
  337. package/dist/esm/components/ClipboardButton.js +69 -0
  338. package/dist/esm/components/DashboardSelectPopover.d.ts +8 -5
  339. package/dist/esm/components/DashboardSelectPopover.d.ts.map +1 -1
  340. package/dist/esm/components/DashboardSelectPopover.js +72 -169
  341. package/dist/esm/components/DatabaseMismatchCard.d.ts +3 -3
  342. package/dist/esm/components/DatabaseMismatchCard.d.ts.map +1 -1
  343. package/dist/esm/components/DatabaseMismatchCard.js +2 -2
  344. package/dist/esm/components/DatabaseSelector.d.ts.map +1 -1
  345. package/dist/esm/components/DatabaseSelector.js +9 -1
  346. package/dist/esm/components/DateRangePicker/SingleDatePicker.d.ts +10 -0
  347. package/dist/esm/components/DateRangePicker/SingleDatePicker.d.ts.map +1 -0
  348. package/dist/esm/components/DateRangePicker/SingleDatePicker.js +227 -0
  349. package/dist/esm/components/DateRangePicker/YearlessDateRangePicker.d.ts +18 -0
  350. package/dist/esm/components/DateRangePicker/YearlessDateRangePicker.d.ts.map +1 -0
  351. package/dist/esm/components/DateRangePicker/YearlessDateRangePicker.js +282 -0
  352. package/dist/esm/components/DateRangePicker/dateRangePickerUtils.d.ts +91 -0
  353. package/dist/esm/components/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -0
  354. package/dist/esm/components/DateRangePicker/dateRangePickerUtils.js +883 -0
  355. package/dist/esm/components/DeleteButton.d.ts +0 -1
  356. package/dist/esm/components/DeleteButton.d.ts.map +1 -1
  357. package/dist/esm/components/DropDownMenuWithLabel.d.ts +4 -3
  358. package/dist/esm/components/DropDownMenuWithLabel.d.ts.map +1 -1
  359. package/dist/esm/components/DropDownMenuWithLabel.js +36 -53
  360. package/dist/esm/components/DynamicBanner.d.ts +2 -5
  361. package/dist/esm/components/DynamicBanner.d.ts.map +1 -1
  362. package/dist/esm/components/DynamicBanner.js +2 -2
  363. package/dist/esm/components/EmptyDashboardComponent/index.d.ts +0 -1
  364. package/dist/esm/components/EmptyDashboardComponent/index.d.ts.map +1 -1
  365. package/dist/esm/components/EmptyDashboardComponent/index.js +13 -10
  366. package/dist/esm/components/EmptyVirtualTablesComponent.d.ts +4 -0
  367. package/dist/esm/components/EmptyVirtualTablesComponent.d.ts.map +1 -0
  368. package/dist/esm/components/EmptyVirtualTablesComponent.js +38 -0
  369. package/dist/esm/components/ExternalLink.d.ts +4 -0
  370. package/dist/esm/components/ExternalLink.d.ts.map +1 -0
  371. package/dist/esm/components/ExternalLink.js +9 -0
  372. package/dist/esm/components/FormTooltip.d.ts +8 -0
  373. package/dist/esm/components/FormTooltip.d.ts.map +1 -0
  374. package/dist/esm/components/FormTooltip.js +84 -0
  375. package/dist/esm/components/InputLabel.d.ts +4 -1
  376. package/dist/esm/components/InputLabel.d.ts.map +1 -1
  377. package/dist/esm/components/InputLabel.js +10 -8
  378. package/dist/esm/components/InternalDashboard/ChartSkeleton.d.ts +11 -0
  379. package/dist/esm/components/InternalDashboard/ChartSkeleton.d.ts.map +1 -0
  380. package/dist/esm/components/InternalDashboard/ChartSkeleton.js +16 -0
  381. package/dist/esm/components/InternalDashboard/DashboardFilter.d.ts +20 -0
  382. package/dist/esm/components/InternalDashboard/DashboardFilter.d.ts.map +1 -0
  383. package/dist/esm/components/InternalDashboard/DashboardFilter.js +101 -0
  384. package/dist/esm/components/InternalDashboard/DashboardLoadingComponent.d.ts +7 -0
  385. package/dist/esm/components/InternalDashboard/DashboardLoadingComponent.d.ts.map +1 -0
  386. package/dist/esm/components/InternalDashboard/DashboardLoadingComponent.js +15 -0
  387. package/dist/esm/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.d.ts +37 -0
  388. package/dist/esm/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
  389. package/dist/esm/components/InternalDashboard/DateRangePicker/QuillDateRangePicker.js +269 -0
  390. package/dist/esm/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.d.ts +85 -0
  391. package/dist/esm/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -0
  392. package/dist/esm/components/InternalDashboard/DateRangePicker/dateRangePickerUtils.js +520 -0
  393. package/dist/esm/components/InternalDashboard/InternalDashboard.d.ts +17 -0
  394. package/dist/esm/components/InternalDashboard/InternalDashboard.d.ts.map +1 -0
  395. package/dist/esm/components/InternalDashboard/InternalDashboard.js +1940 -0
  396. package/dist/esm/components/OrgSelect.d.ts +9 -13
  397. package/dist/esm/components/OrgSelect.d.ts.map +1 -1
  398. package/dist/esm/components/OrgSelect.js +134 -117
  399. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts +30 -0
  400. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -0
  401. package/dist/esm/components/QuillMultiSelectWithCombo.js +466 -0
  402. package/dist/esm/components/QuillPopover.d.ts +11 -0
  403. package/dist/esm/components/QuillPopover.d.ts.map +1 -0
  404. package/dist/esm/components/QuillPopover.js +144 -0
  405. package/dist/esm/components/QuillSelect.d.ts +1 -1
  406. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  407. package/dist/esm/components/QuillSelect.js +39 -16
  408. package/dist/esm/components/QuillSelectWithCombo.d.ts +22 -0
  409. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -0
  410. package/dist/esm/components/QuillSelectWithCombo.js +291 -0
  411. package/dist/esm/components/QuillTab.d.ts +12 -0
  412. package/dist/esm/components/QuillTab.d.ts.map +1 -0
  413. package/dist/esm/components/QuillTab.js +81 -0
  414. package/dist/esm/components/QuillToolTipPortal.d.ts +11 -0
  415. package/dist/esm/components/QuillToolTipPortal.d.ts.map +1 -0
  416. package/dist/esm/components/QuillToolTipPortal.js +104 -0
  417. package/dist/esm/components/SegmentedControl.d.ts +10 -2
  418. package/dist/esm/components/SegmentedControl.d.ts.map +1 -1
  419. package/dist/esm/components/SegmentedControl.js +26 -20
  420. package/dist/esm/components/SqlTextEditor.d.ts +6 -1
  421. package/dist/esm/components/SqlTextEditor.d.ts.map +1 -1
  422. package/dist/esm/components/SqlTextEditor.js +60 -11
  423. package/dist/esm/components/StepDisplay.d.ts.map +1 -1
  424. package/dist/esm/components/StepDisplay.js +1 -1
  425. package/dist/esm/components/Tenants/EditTenant.d.ts +41 -0
  426. package/dist/esm/components/Tenants/EditTenant.d.ts.map +1 -0
  427. package/dist/esm/components/Tenants/EditTenant.js +754 -0
  428. package/dist/esm/components/UiComponents.d.ts +35 -6
  429. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  430. package/dist/esm/components/UiComponents.js +231 -28
  431. package/dist/esm/components/VirtualTableTile.d.ts +7 -0
  432. package/dist/esm/components/VirtualTableTile.d.ts.map +1 -0
  433. package/dist/esm/components/VirtualTableTile.js +48 -0
  434. package/dist/esm/components/index.d.ts +5 -5
  435. package/dist/esm/components/index.d.ts.map +1 -1
  436. package/dist/esm/components/index.js +5 -5
  437. package/dist/esm/constants/dataTypes.d.ts +2 -0
  438. package/dist/esm/constants/dataTypes.d.ts.map +1 -0
  439. package/dist/esm/constants/dataTypes.js +20 -0
  440. package/dist/esm/forms/client_onboard/ConnectDatabase.d.ts +15 -6
  441. package/dist/esm/forms/client_onboard/ConnectDatabase.d.ts.map +1 -1
  442. package/dist/esm/forms/client_onboard/ConnectDatabase.js +216 -111
  443. package/dist/esm/forms/client_onboard/ConnectSchema.d.ts +13 -9
  444. package/dist/esm/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
  445. package/dist/esm/forms/client_onboard/ConnectSchema.js +160 -238
  446. package/dist/esm/forms/client_onboard/CreateVirtualTables.d.ts +47 -0
  447. package/dist/esm/forms/client_onboard/CreateVirtualTables.d.ts.map +1 -0
  448. package/dist/esm/forms/client_onboard/CreateVirtualTables.js +388 -0
  449. package/dist/esm/forms/client_onboard/__tests__/ConnectDatabase.test.d.ts +2 -0
  450. package/dist/esm/forms/client_onboard/__tests__/ConnectDatabase.test.d.ts.map +1 -0
  451. package/dist/esm/forms/client_onboard/__tests__/ConnectDatabase.test.js +566 -0
  452. package/dist/esm/forms/client_onboard/__tests__/ConnectSchema.test.d.ts +2 -0
  453. package/dist/esm/forms/client_onboard/__tests__/ConnectSchema.test.d.ts.map +1 -0
  454. package/dist/esm/forms/client_onboard/__tests__/ConnectSchema.test.js +454 -0
  455. package/dist/esm/forms/client_onboard/__tests__/CreateVirtualTables.test.d.ts +2 -0
  456. package/dist/esm/forms/client_onboard/__tests__/CreateVirtualTables.test.d.ts.map +1 -0
  457. package/dist/esm/forms/client_onboard/__tests__/CreateVirtualTables.test.js +380 -0
  458. package/dist/esm/forms/virtual_tables/CreateEditVirtualTable.d.ts +20 -0
  459. package/dist/esm/forms/virtual_tables/CreateEditVirtualTable.d.ts.map +1 -0
  460. package/dist/esm/forms/virtual_tables/CreateEditVirtualTable.js +288 -0
  461. package/dist/esm/hooks/useDashboardManager.d.ts +16 -0
  462. package/dist/esm/hooks/useDashboardManager.d.ts.map +1 -0
  463. package/dist/esm/hooks/useDashboardManager.js +109 -0
  464. package/dist/esm/hooks/useDatabaseSchema.d.ts +5 -0
  465. package/dist/esm/hooks/useDatabaseSchema.d.ts.map +1 -0
  466. package/dist/esm/hooks/useDatabaseSchema.js +50 -0
  467. package/dist/esm/hooks/useItemBeingEdited.d.ts +1 -2
  468. package/dist/esm/hooks/useItemBeingEdited.d.ts.map +1 -1
  469. package/dist/esm/hooks/useItemBeingEdited.js +3 -15
  470. package/dist/esm/hooks/useOnClickOutside.d.ts +4 -1
  471. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -1
  472. package/dist/esm/hooks/useOnClickOutside.js +49 -8
  473. package/dist/esm/hooks/useTenants.d.ts +13 -0
  474. package/dist/esm/hooks/useTenants.d.ts.map +1 -0
  475. package/dist/esm/hooks/useTenants.js +170 -0
  476. package/dist/esm/hooks/useThrottle.d.ts +2 -0
  477. package/dist/esm/hooks/useThrottle.d.ts.map +1 -0
  478. package/dist/esm/hooks/useThrottle.js +11 -0
  479. package/dist/esm/icons/CheckCircleIcon.d.ts +5 -0
  480. package/dist/esm/icons/CheckCircleIcon.d.ts.map +1 -0
  481. package/dist/esm/icons/CheckCircleIcon.js +3 -0
  482. package/dist/esm/icons/DownChevronIcon.d.ts +2 -0
  483. package/dist/esm/icons/DownChevronIcon.d.ts.map +1 -0
  484. package/dist/esm/icons/DownChevronIcon.js +4 -0
  485. package/dist/esm/icons/ExclamationFilledIcon.d.ts +5 -0
  486. package/dist/esm/icons/ExclamationFilledIcon.d.ts.map +1 -0
  487. package/dist/esm/icons/ExclamationFilledIcon.js +3 -0
  488. package/dist/esm/icons/ExteriorLinkIcon.d.ts +5 -0
  489. package/dist/esm/icons/ExteriorLinkIcon.d.ts.map +1 -0
  490. package/dist/esm/icons/ExteriorLinkIcon.js +3 -0
  491. package/dist/esm/icons/GlobeIcon.d.ts +5 -0
  492. package/dist/esm/icons/GlobeIcon.d.ts.map +1 -0
  493. package/dist/esm/icons/GlobeIcon.js +12 -0
  494. package/dist/esm/icons/InformationCircleIcon.d.ts +4 -0
  495. package/dist/esm/icons/InformationCircleIcon.d.ts.map +1 -0
  496. package/dist/esm/icons/InformationCircleIcon.js +4 -0
  497. package/dist/esm/icons/LeftChevronIcon.d.ts +2 -0
  498. package/dist/esm/icons/LeftChevronIcon.d.ts.map +1 -0
  499. package/dist/esm/icons/LeftChevronIcon.js +4 -0
  500. package/dist/esm/icons/QuestionMarkCircleIcon.d.ts +5 -0
  501. package/dist/esm/icons/QuestionMarkCircleIcon.d.ts.map +1 -0
  502. package/dist/esm/icons/QuestionMarkCircleIcon.js +3 -0
  503. package/dist/esm/icons/RightChevronIcon.d.ts +2 -0
  504. package/dist/esm/icons/RightChevronIcon.d.ts.map +1 -0
  505. package/dist/esm/icons/RightChevronIcon.js +4 -0
  506. package/dist/esm/icons/XMarkIcon.d.ts +0 -1
  507. package/dist/esm/icons/XMarkIcon.d.ts.map +1 -1
  508. package/dist/esm/index.d.ts +2 -3
  509. package/dist/esm/index.d.ts.map +1 -1
  510. package/dist/esm/index.js +3 -3
  511. package/dist/esm/modals/CodePreview.d.ts +6 -0
  512. package/dist/esm/modals/CodePreview.d.ts.map +1 -0
  513. package/dist/esm/modals/CodePreview.js +145 -0
  514. package/dist/esm/modals/EditEnvironmentModal.d.ts +15 -0
  515. package/dist/esm/modals/EditEnvironmentModal.d.ts.map +1 -0
  516. package/dist/esm/modals/EditEnvironmentModal.js +545 -0
  517. package/dist/esm/modals/EditFiltersModal.d.ts +14 -10
  518. package/dist/esm/modals/EditFiltersModal.d.ts.map +1 -1
  519. package/dist/esm/modals/EditFiltersModal.js +1227 -255
  520. package/dist/esm/modals/NewDashboardModal.d.ts +6 -8
  521. package/dist/esm/modals/NewDashboardModal.d.ts.map +1 -1
  522. package/dist/esm/modals/NewDashboardModal.js +148 -146
  523. package/dist/esm/modals/PromoteDashboardModal.d.ts +16 -0
  524. package/dist/esm/modals/PromoteDashboardModal.d.ts.map +1 -0
  525. package/dist/esm/modals/PromoteDashboardModal.js +53 -0
  526. package/dist/esm/modals/PromoteReportModal.d.ts +15 -0
  527. package/dist/esm/modals/PromoteReportModal.d.ts.map +1 -0
  528. package/dist/esm/modals/PromoteReportModal.js +125 -0
  529. package/dist/esm/modals/PromoteViewModal.d.ts +5 -4
  530. package/dist/esm/modals/PromoteViewModal.d.ts.map +1 -1
  531. package/dist/esm/modals/PromoteViewModal.js +65 -91
  532. package/dist/esm/modals/ReorderDashboardModal.d.ts +1 -2
  533. package/dist/esm/modals/ReorderDashboardModal.d.ts.map +1 -1
  534. package/dist/esm/modals/ReorderDashboardModal.js +34 -20
  535. package/dist/esm/modals/SavedQueriesModal.d.ts +7 -0
  536. package/dist/esm/modals/SavedQueriesModal.d.ts.map +1 -0
  537. package/dist/esm/modals/SavedQueriesModal.js +125 -0
  538. package/dist/esm/modals/index.d.ts +0 -1
  539. package/dist/esm/modals/index.d.ts.map +1 -1
  540. package/dist/esm/modals/index.js +0 -1
  541. package/dist/esm/primitives/ButtonPrimitive.d.ts +3 -1
  542. package/dist/esm/primitives/ButtonPrimitive.d.ts.map +1 -1
  543. package/dist/esm/primitives/ButtonPrimitive.js +25 -17
  544. package/dist/esm/primitives/CheckboxPrimitive.d.ts +12 -0
  545. package/dist/esm/primitives/CheckboxPrimitive.d.ts.map +1 -0
  546. package/dist/esm/primitives/CheckboxPrimitive.js +27 -0
  547. package/dist/esm/primitives/HeaderPrimitive.d.ts.map +1 -1
  548. package/dist/esm/primitives/HeaderPrimitive.js +1 -1
  549. package/dist/esm/primitives/MiniButtonPrimitive.d.ts +7 -0
  550. package/dist/esm/primitives/MiniButtonPrimitive.d.ts.map +1 -0
  551. package/dist/esm/primitives/MiniButtonPrimitive.js +54 -0
  552. package/dist/esm/primitives/ModalPrimitive.d.ts +2 -10
  553. package/dist/esm/primitives/ModalPrimitive.d.ts.map +1 -1
  554. package/dist/esm/primitives/ModalPrimitive.js +7 -7
  555. package/dist/esm/primitives/PlaceholderPrimitive.d.ts +5 -0
  556. package/dist/esm/primitives/PlaceholderPrimitive.d.ts.map +1 -0
  557. package/dist/esm/primitives/PlaceholderPrimitive.js +15 -0
  558. package/dist/esm/primitives/PopoverPrimitive.d.ts +8 -0
  559. package/dist/esm/primitives/PopoverPrimitive.d.ts.map +1 -0
  560. package/dist/esm/primitives/PopoverPrimitive.js +49 -0
  561. package/dist/esm/primitives/SecondaryButtonPrimitive.d.ts +3 -1
  562. package/dist/esm/primitives/SecondaryButtonPrimitive.d.ts.map +1 -1
  563. package/dist/esm/primitives/SecondaryButtonPrimitive.js +14 -11
  564. package/dist/esm/primitives/TextInputPrimitive.d.ts +8 -2
  565. package/dist/esm/primitives/TextInputPrimitive.d.ts.map +1 -1
  566. package/dist/esm/primitives/TextInputPrimitive.js +100 -23
  567. package/dist/esm/primitives/TogglePrimitive.d.ts +6 -3
  568. package/dist/esm/primitives/TogglePrimitive.d.ts.map +1 -1
  569. package/dist/esm/primitives/TogglePrimitive.js +10 -7
  570. package/dist/esm/primitives/index.d.ts +1 -1
  571. package/dist/esm/primitives/index.d.ts.map +1 -1
  572. package/dist/esm/primitives/index.js +1 -1
  573. package/dist/esm/public_components/ChartQueryBuilder.d.ts +9 -0
  574. package/dist/esm/public_components/ChartQueryBuilder.d.ts.map +1 -0
  575. package/dist/esm/public_components/ChartQueryBuilder.js +125 -0
  576. package/dist/esm/public_components/CreateEnvironment.d.ts +2 -1
  577. package/dist/esm/public_components/CreateEnvironment.d.ts.map +1 -1
  578. package/dist/esm/public_components/CreateEnvironment.js +152 -72
  579. package/dist/esm/public_components/DashboardManager.d.ts +2 -2
  580. package/dist/esm/public_components/DashboardManager.d.ts.map +1 -1
  581. package/dist/esm/public_components/DashboardManager.js +358 -200
  582. package/dist/esm/public_components/EnvSelectPopover.d.ts +12 -0
  583. package/dist/esm/public_components/EnvSelectPopover.d.ts.map +1 -0
  584. package/dist/esm/public_components/EnvSelectPopover.js +138 -0
  585. package/dist/esm/public_components/VirtualTableManager.d.ts +7 -0
  586. package/dist/esm/public_components/VirtualTableManager.d.ts.map +1 -0
  587. package/dist/esm/public_components/VirtualTableManager.js +723 -0
  588. package/dist/esm/public_components/__tests__/CreateEnvironment.test.d.ts +2 -0
  589. package/dist/esm/public_components/__tests__/CreateEnvironment.test.d.ts.map +1 -0
  590. package/dist/esm/public_components/__tests__/CreateEnvironment.test.js +680 -0
  591. package/dist/esm/utils/astProcessing.d.ts +15 -0
  592. package/dist/esm/utils/astProcessing.d.ts.map +1 -0
  593. package/dist/esm/utils/astProcessing.js +98 -0
  594. package/dist/esm/utils/astProcessing.uspec.d.ts +2 -0
  595. package/dist/esm/utils/astProcessing.uspec.d.ts.map +1 -0
  596. package/dist/esm/utils/astProcessing.uspec.js +28 -0
  597. package/dist/esm/utils/columnProcessing.d.ts +15 -0
  598. package/dist/esm/utils/columnProcessing.d.ts.map +1 -0
  599. package/dist/esm/utils/columnProcessing.js +200 -0
  600. package/dist/esm/utils/constants.d.ts +4 -21
  601. package/dist/esm/utils/constants.d.ts.map +1 -1
  602. package/dist/esm/utils/constants.js +18 -9
  603. package/dist/esm/utils/dataEditor.d.ts +4 -3
  604. package/dist/esm/utils/dataEditor.d.ts.map +1 -1
  605. package/dist/esm/utils/dataEditor.js +65 -115
  606. package/dist/esm/utils/dataFetcher.d.ts +20 -2
  607. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  608. package/dist/esm/utils/dataFetcher.js +44 -53
  609. package/dist/esm/utils/databases.d.ts +20 -9
  610. package/dist/esm/utils/databases.d.ts.map +1 -1
  611. package/dist/esm/utils/databases.js +63 -25
  612. package/dist/esm/utils/filter.d.ts +222 -0
  613. package/dist/esm/utils/filter.d.ts.map +1 -0
  614. package/dist/esm/utils/filter.js +343 -0
  615. package/dist/esm/utils/monacoAutocomplete.d.ts +22 -0
  616. package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
  617. package/dist/esm/utils/monacoAutocomplete.js +350 -0
  618. package/dist/esm/utils/report.d.ts +120 -0
  619. package/dist/esm/utils/report.d.ts.map +1 -0
  620. package/dist/esm/utils/report.js +106 -0
  621. package/dist/esm/utils/schema.d.ts +43 -26
  622. package/dist/esm/utils/schema.d.ts.map +1 -1
  623. package/dist/esm/utils/schema.js +171 -1
  624. package/dist/esm/utils/table.d.ts +70 -4
  625. package/dist/esm/utils/table.d.ts.map +1 -1
  626. package/dist/esm/utils/tenants.d.ts +48 -0
  627. package/dist/esm/utils/tenants.d.ts.map +1 -0
  628. package/dist/esm/utils/tenants.js +31 -0
  629. package/dist/esm/utils/ui.d.ts +2 -0
  630. package/dist/esm/utils/ui.d.ts.map +1 -0
  631. package/dist/esm/utils/ui.js +14 -0
  632. package/dist/esm/utils/validation.d.ts +2 -0
  633. package/dist/esm/utils/validation.d.ts.map +1 -0
  634. package/dist/esm/utils/validation.js +74 -0
  635. package/dist/esm/utils/validation.uspec.d.ts +2 -0
  636. package/dist/esm/utils/validation.uspec.d.ts.map +1 -0
  637. package/dist/esm/utils/validation.uspec.js +51 -0
  638. package/package.json +22 -8
  639. package/dist/cjs/components/EnvSelectPopover.d.ts +0 -13
  640. package/dist/cjs/components/EnvSelectPopover.d.ts.map +0 -1
  641. package/dist/cjs/components/EnvSelectPopover.js +0 -224
  642. package/dist/cjs/components/SqlViewTile.d.ts +0 -8
  643. package/dist/cjs/components/SqlViewTile.d.ts.map +0 -1
  644. package/dist/cjs/components/SqlViewTile.js +0 -69
  645. package/dist/cjs/forms/client_onboard/CreateSqlViews.d.ts +0 -24
  646. package/dist/cjs/forms/client_onboard/CreateSqlViews.d.ts.map +0 -1
  647. package/dist/cjs/forms/client_onboard/CreateSqlViews.js +0 -237
  648. package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts +0 -26
  649. package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts.map +0 -1
  650. package/dist/cjs/forms/sql_views/CreateEditSqlView.js +0 -177
  651. package/dist/cjs/modals/PromoteDashModal.d.ts +0 -17
  652. package/dist/cjs/modals/PromoteDashModal.d.ts.map +0 -1
  653. package/dist/cjs/modals/PromoteDashModal.js +0 -133
  654. package/dist/cjs/primitives/SelectPrimitive.d.ts +0 -16
  655. package/dist/cjs/primitives/SelectPrimitive.d.ts.map +0 -1
  656. package/dist/cjs/primitives/SelectPrimitive.js +0 -43
  657. package/dist/cjs/public_components/DashboardBuilder.d.ts +0 -7
  658. package/dist/cjs/public_components/DashboardBuilder.d.ts.map +0 -1
  659. package/dist/cjs/public_components/DashboardBuilder.js +0 -309
  660. package/dist/cjs/public_components/SQLViewManager.d.ts +0 -5
  661. package/dist/cjs/public_components/SQLViewManager.d.ts.map +0 -1
  662. package/dist/cjs/public_components/SQLViewManager.js +0 -387
  663. package/dist/esm/components/EnvSelectPopover.d.ts +0 -13
  664. package/dist/esm/components/EnvSelectPopover.d.ts.map +0 -1
  665. package/dist/esm/components/EnvSelectPopover.js +0 -221
  666. package/dist/esm/components/SqlViewTile.d.ts +0 -8
  667. package/dist/esm/components/SqlViewTile.d.ts.map +0 -1
  668. package/dist/esm/components/SqlViewTile.js +0 -40
  669. package/dist/esm/forms/client_onboard/CreateSqlViews.d.ts +0 -24
  670. package/dist/esm/forms/client_onboard/CreateSqlViews.d.ts.map +0 -1
  671. package/dist/esm/forms/client_onboard/CreateSqlViews.js +0 -229
  672. package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts +0 -26
  673. package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts.map +0 -1
  674. package/dist/esm/forms/sql_views/CreateEditSqlView.js +0 -171
  675. package/dist/esm/modals/PromoteDashModal.d.ts +0 -17
  676. package/dist/esm/modals/PromoteDashModal.d.ts.map +0 -1
  677. package/dist/esm/modals/PromoteDashModal.js +0 -130
  678. package/dist/esm/primitives/SelectPrimitive.d.ts +0 -16
  679. package/dist/esm/primitives/SelectPrimitive.d.ts.map +0 -1
  680. package/dist/esm/primitives/SelectPrimitive.js +0 -41
  681. package/dist/esm/public_components/DashboardBuilder.d.ts +0 -7
  682. package/dist/esm/public_components/DashboardBuilder.d.ts.map +0 -1
  683. package/dist/esm/public_components/DashboardBuilder.js +0 -303
  684. package/dist/esm/public_components/SQLViewManager.d.ts +0 -5
  685. package/dist/esm/public_components/SQLViewManager.d.ts.map +0 -1
  686. package/dist/esm/public_components/SQLViewManager.js +0 -381
@@ -1,338 +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
- export function EditFiltersModal({ isOpen, dashboardData, selectedDashboard, client, setIsOpen, onSave, ModalComponent, TextInputComponent, ButtonComponent, HeaderComponent, SelectComponent, dashNames, SecondaryButtonComponent, openEditOrderModal, }) {
12
- const { state, dispatch } = useAdmin();
13
- const [selectedDashboardName, setSelectedDashboardName] = useState('');
14
- const { data } = useDashboard(selectedDashboard.name);
15
+ import { convertFieldTypeToJSType } from '../utils/columnProcessing';
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);
15
51
  const [isDateComparison, setIsDateComparison] = useState(false);
52
+ const [currentDashboardName, setCurrentDashboardName] = useState(selectedDashboardName);
16
53
  const [newFilters, setNewFilters] = useState([]);
17
- const [initialRange, setInitialRange] = useState(defaultDateRange);
54
+ const [initialRange, setInitialRange] = useState(selectedDashboard?.dateFilter?.primaryRange ?? {
55
+ label: 'Last 30 days',
56
+ value: 'LAST_30_DAYS',
57
+ });
18
58
  const [showDateFilter, setShowDateFilter] = useState(false);
19
- 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]);
20
350
  useEffect(() => {
21
351
  if (!selectedDashboard) {
22
352
  return;
23
353
  }
24
- setSelectedDashboardName(selectedDashboard);
25
- setIsDateComparison(selectedDashboard.dateFilter?.comparison);
26
- setNewFilters(selectedDashboard.filters || []);
354
+ setValidationError([]);
355
+ setCurrentDashboardName(selectedDashboard.name);
356
+ setIsDateComparison(selectedDashboard?.dateFilter?.comparison ?? false);
357
+ setNewFilters(selectedDashboard?.filters ?? []);
27
358
  setNewDateFilter(selectedDashboard.dateFilter);
28
- setSelectedDashboardName(selectedDashboard.name);
359
+ setDisplaySubIntervals(selectedDashboard.dateFilter?.presetOptions?.map(() => false) ?? []);
29
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
+ }, {}));
30
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
+ ]);
31
415
  const handleAddFilter = async () => {
32
416
  setNewFilters([...newFilters, { label: '' }]);
33
417
  };
418
+ const normalizeFieldName = (fieldName) => {
419
+ return (fieldName
420
+ ?.split('_')
421
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
422
+ .join(' ') ?? '');
423
+ };
34
424
  const handleSubmitDashboardChanges = async () => {
35
- if (!selectedDashboardName ||
36
- newFilters.some((filter) => !filter.label) ||
37
- (newDateFilter &&
38
- Object.keys(newDateFilter).length &&
39
- !newDateFilter.label)) {
40
- alert('Empty fields');
41
- return;
42
- }
43
- if (newFilters.filter((elem) => !elem.field).length) {
44
- 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);
45
428
  return;
46
429
  }
47
430
  const updatedFilters = newFilters.map((filter) => {
48
- const table = state.tables.find((table) => table.name === filter.table);
49
- 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));
50
433
  return {
51
434
  table: filter.table,
52
435
  field: filter.field,
53
436
  labelField: filter.field,
54
437
  label: filter.label,
438
+ oldLabel: Object.entries(filterNameMap).find(([oldLabel, newLabel]) => newLabel === filter.label && oldLabel !== filter.label)?.[0],
55
439
  filterType,
56
440
  stringFilterType: filter.stringFilterType,
57
441
  };
58
442
  });
59
- if (dashNames &&
60
- dashNames.length > 0 &&
61
- dashNames.some((dashName) => dashName.name === selectedDashboardName &&
62
- selectedDashboardName !== selectedDashboard.name)) {
63
- alert('Dashboard name already taken!');
64
- return;
65
- }
66
- const fieldsSet = new Set();
67
- const hasDuplicateField = updatedFilters.some((filter) => {
68
- if (fieldsSet.has(filter.field)) {
69
- return true;
70
- }
71
- else {
72
- fieldsSet.add(filter.field);
73
- return false;
74
- }
75
- });
76
- if (hasDuplicateField ||
77
- (newDateFilter &&
78
- Object.keys(newDateFilter).length > 0 &&
79
- updatedFilters.some((filter) => filter.filterType === 'date'))) {
80
- alert('Maximum of one filter per field');
81
- return;
82
- }
83
- let allValid = true;
84
- updatedFilters.forEach((filter) => {
85
- if (filter.filterType !== 'string' && filter.filterType !== 'date') {
86
- allValid = false;
87
- console.error(`Invalid filterType found: ${filter.filterType}`);
88
- }
89
- });
90
- if (!allValid) {
91
- alert('We only support string and date filters.');
92
- return;
93
- }
94
- const filterProblems = [];
95
- if (newDateFilter) {
96
- data.newQueries.forEach((chart) => {
97
- if (!chart.dateField ||
98
- !chart.dateField.table ||
99
- !chart.dateField.field) {
100
- filterProblems.push({
101
- chart: chart.name,
102
- filter: `${newDateFilter.label} (Date filter)`,
103
- });
104
- }
105
- });
106
- }
107
- updatedFilters.forEach((filter) => {
108
- data.newQueries.forEach((chart) => {
109
- const chartTable = chart.referencedTables.find((table) => table === filter.table);
110
- if (!chartTable) {
111
- filterProblems.push({ chart: chart.name, filter: filter.label });
112
- }
113
- });
114
- });
115
- if (filterProblems.length > 0) {
116
- 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.`);
117
- return;
118
- }
119
- const url = `${QUILL_SERVER}/dashfilter/${client._id}/`;
120
- const body = {
121
- newDashboardName: selectedDashboardName,
122
- 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
+ }),
123
453
  dateFilter: newDateFilter
124
454
  ? {
125
455
  ...newDateFilter,
126
456
  comparison: isDateComparison,
127
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),
128
494
  }
129
- : null,
130
- name: selectedDashboard.name,
131
- databaseType: state.client.databaseType,
132
- };
133
- const headers = {
134
- 'Content-Type': 'application/json',
135
- Authorization: `Bearer `,
136
- };
137
- try {
138
- const response = await fetch(url, {
139
- method: 'POST',
140
- headers: headers,
141
- body: JSON.stringify(body),
142
- });
143
- await onSave(selectedDashboardName);
144
- setIsOpen(false);
145
- }
146
- catch (e) {
147
- console.log('error');
148
- }
495
+ : undefined,
496
+ // sectionOrder,
497
+ });
498
+ await onSave(currentDashboardName);
499
+ setIsOpen(false);
149
500
  };
150
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];
151
505
  setNewFilters(newFilters.filter((f) => f !== filter));
152
506
  };
153
- const handleDeleteDateFilter = async () => {
507
+ const handleDeleteDateFilter = () => {
154
508
  setShowDateFilter(false);
155
- setNewDateFilter(null);
509
+ setNewDateFilter(undefined);
156
510
  };
157
- const handleAddDateFilter = async () => {
511
+ const handleAddDateFilter = () => {
158
512
  setShowDateFilter(true);
159
- 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
+ });
160
570
  };
161
571
  const handleDeleteDashboard = async () => {
162
572
  if (confirm('Are you sure? This action cannot be undone.')) {
163
- const URL = `${QUILL_SERVER}/dashboard/${selectedDashboard.name}`;
164
- await fetch(URL, {
165
- method: 'DELETE',
166
- headers: { 'Content-Type': 'application/json' },
167
- body: JSON.stringify({
168
- clientId: client._id,
169
- databaseType: state.client.databaseType,
170
- }),
171
- });
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);
172
580
  setIsOpen(false);
173
581
  setNewFilters([]);
174
- await onSave();
175
582
  }
176
583
  };
177
- return (_jsx(ModalComponent, { isOpen: isOpen, close: () => {
584
+ return (_jsx(ModalComponent, { isOpen: isOpen, onClose: () => {
585
+ setValidationError([]);
178
586
  setIsOpen(false);
179
- setSelectedDashboardName(selectedDashboard);
180
- setIsDateComparison(selectedDashboard.dateFilter?.comparison);
181
- setNewFilters(selectedDashboard.filters || []);
182
- setNewDateFilter(selectedDashboard.dateFilter);
183
- setSelectedDashboardName(selectedDashboard.name);
184
- 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);
185
592
  }, style: {
186
593
  minWidth: '814px',
187
- }, children: _jsxs("div", { style: {
188
- display: 'flex',
189
- gap: 16,
190
- flexDirection: 'column',
191
- width: '100%',
192
- height: '100%',
193
- maxHeight: '100%',
194
- overflowY: 'auto',
195
- }, 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: {
196
- display: 'flex',
197
- flexDirection: 'column',
198
- gap: '10px',
199
- }, children: [_jsx(CardSection, { children: "Date Filter" }), showDateFilter && (_jsx(_Fragment, { children: _jsxs("div", { style: {
200
- display: 'flex',
201
- flexDirection: 'row',
202
- gap: '10px',
203
- }, 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: {
204
674
  display: 'flex',
205
- flexDirection: 'row',
206
- alignItems: 'center',
207
- }, children: _jsx(TextInputComponent, { value: newDateFilter?.label || '', onChange: (e) => {
208
- setNewDateFilter({
209
- ...newDateFilter,
210
- label: e.target.value,
211
- });
212
- } }) })] }), _jsx("div", { style: {
213
- display: 'flex',
214
- flexDirection: 'row',
215
- gap: '10px',
216
- }, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsx(InputLabel, { children: "Initial Range" }), _jsx(SelectComponent, { value: initialRange.label, onChange: (e) => {
217
- setInitialRange(InitialDateRangeOptions.find((table) => table.label === e) ?? initialRange);
218
- }, options: InitialDateRangeOptions.map((table) => {
219
- return { label: table.label, value: table.label };
220
- }), theme: defaultTheme })] }) }), _jsx("div", { style: {
221
- 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',
222
818
  flexDirection: 'row',
223
- gap: '10px',
224
- width: '100%',
225
- }, 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: {
226
832
  display: 'flex',
227
833
  flexDirection: 'column',
228
- width: '100%',
229
- }, children: [_jsx(InputLabel, { children: "Date Comparison" }), _jsxs("div", { style: {
834
+ gap: '10px',
835
+ }, children: [_jsxs("div", { style: {
230
836
  display: 'flex',
231
837
  flexDirection: 'row',
232
- gap: 10,
233
- width: '100%',
234
- }, 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: {
235
1002
  display: 'flex',
236
1003
  flexDirection: 'column',
237
- justifyContent: 'center',
238
1004
  height: '100%',
239
- minWidth: 200,
240
- maxWidth: 200,
241
- width: 200,
242
- }, children: _jsx(TogglePrimitive, { value: isDateComparison, onClick: () => {
243
- setIsDateComparison((isDateComparison) => !isDateComparison);
244
- } }) }), _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',
245
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: {
246
1154
  display: 'flex',
1155
+ flexDirection: 'row',
1156
+ gap: '10px',
247
1157
  justifyContent: 'flex-end',
248
- }, children: _jsx("div", { onClick: () => handleDeleteDateFilter(), style: {
249
- height: 38,
250
- width: 38,
251
- alignItems: 'center',
252
- justifyContent: 'flex-end',
1158
+ width: 620,
1159
+ borderTop: '1px solid #d7d7d7',
1160
+ paddingTop: 10,
1161
+ }, children: _jsx("div", { style: {
253
1162
  display: 'flex',
254
- cursor: 'pointer',
255
- }, 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: {
256
- display: 'flex',
257
- flexDirection: 'row',
258
- alignItems: 'center',
259
- justifyContent: 'space-between',
260
- marginTop: 20,
261
- }, children: _jsx(CardSection, { children: "Filters" }) }), newFilters.length > 0 && (_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '6px' }, children: newFilters.map((filter, index) => {
262
- 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: {
263
1176
  display: 'flex',
264
- flexDirection: 'row',
1177
+ flexDirection: 'column',
265
1178
  gap: '10px',
266
- }, children: [_jsxs("div", { style: {
267
- display: 'flex',
268
- flexDirection: 'column',
269
- // maxWidth: 300,
270
- }, children: [index === 0 && _jsx(InputLabel, { children: "Label" }), _jsx(TextInputComponent, { value: filter?.label || '', onChange: (e) => {
271
- const updatedFilters = newFilters.map((otherFilter, i) => index === i
272
- ? { ...otherFilter, label: e.target.value }
273
- : otherFilter);
274
- setNewFilters(updatedFilters);
275
- } })] }), _jsxs("div", { style: {
276
- display: 'flex',
277
- flexDirection: 'column',
278
- maxWidth: 300,
279
- }, children: [index === 0 && _jsx(InputLabel, { children: "Table" }), _jsx(SelectComponent, { value: filter.table || '', onChange: (e) => {
280
- const updatedFilters = newFilters.map((otherFilter, i) => index === i
281
- ? { ...otherFilter, table: e }
282
- : otherFilter);
283
- setNewFilters(updatedFilters);
284
- }, options: state.tables.map((table) => {
285
- return { label: table.name, value: table.name };
286
- }), theme: defaultTheme })] }), _jsxs("div", { style: {
1179
+ }, children: [_jsx("div", { style: {
287
1180
  display: 'flex',
288
- flexDirection: 'column',
289
- maxWidth: 300,
290
- }, children: [index === 0 && _jsx(InputLabel, { children: "Field" }), _jsx(SelectComponent, { defaultValue: "", value: filter && filter.field ? filter.field : '', options: filter.table
291
- ? state.tables
292
- .find((table) => table.name === filter.table)
293
- ?.columns.filter((column) => {
294
- return column.fieldType === 'varchar';
295
- })
296
- .map((column) => {
297
- return {
298
- label: column.name,
299
- value: column.name,
300
- };
301
- })
302
- : [], onChange: (e) => {
303
- const updatedFilters = newFilters.map((otherFilter, i) => index === i
304
- ? { ...otherFilter, field: e }
305
- : otherFilter);
306
- setNewFilters(updatedFilters);
307
- } })] }), _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: {
308
1186
  display: 'flex',
309
1187
  flexDirection: 'column',
310
- width: '100%',
311
- }, children: [index === 0 && _jsx(InputLabel, { children: "Filter Type" }), _jsx("div", { style: {
312
- display: 'flex',
313
- flexDirection: 'column',
314
- alignItems: 'center',
315
- width: '100%',
316
- }, 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: {
317
1194
  display: 'flex',
318
- flexDirection: 'row',
319
- alignItems: 'center',
320
- width: '100%',
321
- gap: 10,
322
- }, children: [_jsx(SegmentedControl, { theme: defaultTheme, value: filter && filter.stringFilterType
323
- ? filter.stringFilterType
324
- : '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;
325
1246
  const updatedFilters = newFilters.map((otherFilter, i) => index === i
326
- ? { ...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
+ }
327
1256
  : otherFilter);
328
1257
  setNewFilters(updatedFilters);
329
- } }), _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: {
330
1289
  height: 38,
331
1290
  alignItems: 'center',
332
- justifyContent: 'flex-end',
333
1291
  display: 'flex',
334
1292
  cursor: 'pointer',
335
1293
  width: '100%',
336
- }, 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));
337
- }) })), _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] }))] })] }) }) }) }));
338
1310
  }