@quillsql/react 2.11.16 → 2.11.18

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 (229) hide show
  1. package/dist/cjs/Chart.d.ts +109 -42
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +44 -18
  4. package/dist/cjs/ChartBuilder.d.ts +204 -30
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +124 -63
  7. package/dist/cjs/ChartEditor.d.ts +123 -19
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +47 -15
  10. package/dist/cjs/Dashboard.d.ts +148 -91
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +51 -159
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +21 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +5 -2
  16. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -1
  17. package/dist/cjs/QuillProvider.d.ts +105 -2
  18. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  19. package/dist/cjs/QuillProvider.js +59 -0
  20. package/dist/cjs/ReportBuilder.d.ts +194 -42
  21. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  22. package/dist/cjs/ReportBuilder.js +563 -416
  23. package/dist/cjs/SQLEditor.d.ts +160 -23
  24. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  25. package/dist/cjs/SQLEditor.js +36 -30
  26. package/dist/cjs/Table.d.ts +119 -15
  27. package/dist/cjs/Table.d.ts.map +1 -1
  28. package/dist/cjs/Table.js +37 -6
  29. package/dist/cjs/TableChart.d.ts.map +1 -1
  30. package/dist/cjs/TableChart.js +0 -194
  31. package/dist/cjs/{BarList.d.ts → components/Chart/BarList.d.ts} +1 -1
  32. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -0
  33. package/dist/cjs/{BarList.js → components/Chart/BarList.js} +1 -1
  34. package/dist/cjs/components/Chart/LineChart.d.ts +2 -3
  35. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  36. package/dist/cjs/components/Chart/LineChart.js +3 -3
  37. package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -0
  38. package/dist/cjs/{PieChart.js → components/Chart/PieChart.js} +1 -1
  39. package/dist/cjs/components/Dashboard/ChartComponent.d.ts +2 -1
  40. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/ChartComponent.js +6 -7
  42. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +22 -0
  43. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -0
  44. package/dist/cjs/components/Dashboard/DashboardFilter.js +75 -0
  45. package/dist/cjs/components/Dashboard/DataLoader.d.ts +1 -1
  46. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  47. package/dist/cjs/components/Dashboard/DataLoader.js +1 -1
  48. package/dist/cjs/components/Dashboard/MetricComponent.d.ts +2 -12
  49. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  50. package/dist/cjs/components/Dashboard/MetricComponent.js +39 -17
  51. package/dist/cjs/components/Dashboard/TableComponent.d.ts +2 -1
  52. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  53. package/dist/cjs/components/Dashboard/TableComponent.js +6 -9
  54. package/dist/cjs/components/QuillCard.d.ts +2 -7
  55. package/dist/cjs/components/QuillCard.d.ts.map +1 -1
  56. package/dist/cjs/components/QuillCard.js +15 -9
  57. package/dist/cjs/components/QuillSelect.d.ts +4 -1
  58. package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
  59. package/dist/cjs/components/QuillSelect.js +13 -8
  60. package/dist/cjs/components/QuillTable.d.ts +16 -2
  61. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  62. package/dist/cjs/components/QuillTable.js +4 -4
  63. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts +9 -3
  64. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
  65. package/dist/cjs/components/ReportBuilder/AddColumnPopover.js +10 -6
  66. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +13 -1
  67. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  68. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +5 -15
  69. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +21 -1
  70. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  71. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +15 -17
  72. package/dist/cjs/components/ReportBuilder/bigDateMap.js +1 -1
  73. package/dist/cjs/components/ReportBuilder/convert.d.ts +3 -1
  74. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  75. package/dist/cjs/components/ReportBuilder/convert.js +60 -21
  76. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -10
  77. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  78. package/dist/cjs/components/ReportBuilder/operators.js +23 -10
  79. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -1
  80. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  81. package/dist/cjs/components/ReportBuilder/ui.d.ts +82 -18
  82. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  83. package/dist/cjs/components/ReportBuilder/ui.js +55 -103
  84. package/dist/cjs/components/ReportBuilder/util.d.ts +10 -4
  85. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  86. package/dist/cjs/components/ReportBuilder/util.js +124 -71
  87. package/dist/cjs/components/UiComponents.d.ts +81 -87
  88. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  89. package/dist/cjs/components/UiComponents.js +76 -103
  90. package/dist/cjs/hooks/index.d.ts +1 -0
  91. package/dist/cjs/hooks/index.d.ts.map +1 -1
  92. package/dist/cjs/hooks/index.js +3 -1
  93. package/dist/cjs/hooks/useTheme.d.ts +7 -0
  94. package/dist/cjs/hooks/useTheme.d.ts.map +1 -0
  95. package/dist/cjs/hooks/useTheme.js +12 -0
  96. package/dist/cjs/index.d.ts +10 -2
  97. package/dist/cjs/index.d.ts.map +1 -1
  98. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +5 -2
  99. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  100. package/dist/cjs/internals/ReportBuilder/PivotList.js +21 -21
  101. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +30 -14
  102. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  103. package/dist/cjs/internals/ReportBuilder/PivotModal.js +77 -52
  104. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  105. package/dist/cjs/utils/dataFetcher.js +2 -0
  106. package/dist/cjs/utils/parserBigQuery.d.ts +6 -0
  107. package/dist/cjs/utils/parserBigQuery.d.ts.map +1 -0
  108. package/dist/cjs/utils/parserBigQuery.js +60 -0
  109. package/dist/cjs/utils/parserPostgres.d.ts +3 -0
  110. package/dist/cjs/utils/parserPostgres.d.ts.map +1 -0
  111. package/dist/cjs/utils/parserPostgres.js +42 -0
  112. package/dist/esm/Chart.d.ts +109 -42
  113. package/dist/esm/Chart.d.ts.map +1 -1
  114. package/dist/esm/Chart.js +45 -19
  115. package/dist/esm/ChartBuilder.d.ts +204 -30
  116. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  117. package/dist/esm/ChartBuilder.js +124 -63
  118. package/dist/esm/ChartEditor.d.ts +123 -19
  119. package/dist/esm/ChartEditor.d.ts.map +1 -1
  120. package/dist/esm/ChartEditor.js +51 -19
  121. package/dist/esm/Dashboard.d.ts +148 -91
  122. package/dist/esm/Dashboard.d.ts.map +1 -1
  123. package/dist/esm/Dashboard.js +54 -160
  124. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +21 -1
  125. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  126. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +6 -3
  127. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -1
  128. package/dist/esm/QuillProvider.d.ts +105 -2
  129. package/dist/esm/QuillProvider.d.ts.map +1 -1
  130. package/dist/esm/QuillProvider.js +59 -0
  131. package/dist/esm/ReportBuilder.d.ts +194 -42
  132. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  133. package/dist/esm/ReportBuilder.js +566 -419
  134. package/dist/esm/SQLEditor.d.ts +160 -23
  135. package/dist/esm/SQLEditor.d.ts.map +1 -1
  136. package/dist/esm/SQLEditor.js +36 -30
  137. package/dist/esm/Table.d.ts +119 -15
  138. package/dist/esm/Table.d.ts.map +1 -1
  139. package/dist/esm/Table.js +38 -7
  140. package/dist/esm/TableChart.d.ts.map +1 -1
  141. package/dist/esm/TableChart.js +0 -194
  142. package/dist/esm/{BarList.d.ts → components/Chart/BarList.d.ts} +1 -1
  143. package/dist/esm/components/Chart/BarList.d.ts.map +1 -0
  144. package/dist/esm/{BarList.js → components/Chart/BarList.js} +1 -1
  145. package/dist/esm/components/Chart/LineChart.d.ts +2 -3
  146. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  147. package/dist/esm/components/Chart/LineChart.js +3 -3
  148. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -0
  149. package/dist/esm/{PieChart.js → components/Chart/PieChart.js} +1 -1
  150. package/dist/esm/components/Dashboard/ChartComponent.d.ts +2 -1
  151. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  152. package/dist/esm/components/Dashboard/ChartComponent.js +5 -6
  153. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +22 -0
  154. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -0
  155. package/dist/esm/components/Dashboard/DashboardFilter.js +71 -0
  156. package/dist/esm/components/Dashboard/DataLoader.d.ts +1 -1
  157. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  158. package/dist/esm/components/Dashboard/DataLoader.js +1 -1
  159. package/dist/esm/components/Dashboard/MetricComponent.d.ts +2 -12
  160. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  161. package/dist/esm/components/Dashboard/MetricComponent.js +39 -17
  162. package/dist/esm/components/Dashboard/TableComponent.d.ts +2 -1
  163. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  164. package/dist/esm/components/Dashboard/TableComponent.js +6 -9
  165. package/dist/esm/components/QuillCard.d.ts +2 -7
  166. package/dist/esm/components/QuillCard.d.ts.map +1 -1
  167. package/dist/esm/components/QuillCard.js +15 -9
  168. package/dist/esm/components/QuillSelect.d.ts +4 -1
  169. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  170. package/dist/esm/components/QuillSelect.js +14 -9
  171. package/dist/esm/components/QuillTable.d.ts +16 -2
  172. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  173. package/dist/esm/components/QuillTable.js +4 -4
  174. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts +9 -3
  175. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
  176. package/dist/esm/components/ReportBuilder/AddColumnPopover.js +10 -6
  177. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +13 -1
  178. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  179. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +5 -15
  180. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +21 -1
  181. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  182. package/dist/esm/components/ReportBuilder/AddSortPopover.js +17 -19
  183. package/dist/esm/components/ReportBuilder/bigDateMap.js +1 -1
  184. package/dist/esm/components/ReportBuilder/convert.d.ts +3 -1
  185. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  186. package/dist/esm/components/ReportBuilder/convert.js +51 -13
  187. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -10
  188. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  189. package/dist/esm/components/ReportBuilder/operators.js +23 -10
  190. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -1
  191. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  192. package/dist/esm/components/ReportBuilder/ui.d.ts +82 -18
  193. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  194. package/dist/esm/components/ReportBuilder/ui.js +53 -101
  195. package/dist/esm/components/ReportBuilder/util.d.ts +10 -4
  196. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  197. package/dist/esm/components/ReportBuilder/util.js +114 -67
  198. package/dist/esm/components/UiComponents.d.ts +81 -87
  199. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  200. package/dist/esm/components/UiComponents.js +71 -102
  201. package/dist/esm/hooks/index.d.ts +1 -0
  202. package/dist/esm/hooks/index.d.ts.map +1 -1
  203. package/dist/esm/hooks/index.js +1 -0
  204. package/dist/esm/hooks/useTheme.d.ts +7 -0
  205. package/dist/esm/hooks/useTheme.d.ts.map +1 -0
  206. package/dist/esm/hooks/useTheme.js +10 -0
  207. package/dist/esm/index.d.ts +10 -2
  208. package/dist/esm/index.d.ts.map +1 -1
  209. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +5 -2
  210. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  211. package/dist/esm/internals/ReportBuilder/PivotList.js +21 -21
  212. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +30 -14
  213. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  214. package/dist/esm/internals/ReportBuilder/PivotModal.js +77 -52
  215. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  216. package/dist/esm/utils/dataFetcher.js +2 -0
  217. package/dist/esm/utils/parserBigQuery.d.ts +6 -0
  218. package/dist/esm/utils/parserBigQuery.d.ts.map +1 -0
  219. package/dist/esm/utils/parserBigQuery.js +52 -0
  220. package/dist/esm/utils/parserPostgres.d.ts +3 -0
  221. package/dist/esm/utils/parserPostgres.d.ts.map +1 -0
  222. package/dist/esm/utils/parserPostgres.js +37 -0
  223. package/package.json +1 -1
  224. package/dist/cjs/BarList.d.ts.map +0 -1
  225. package/dist/cjs/PieChart.d.ts.map +0 -1
  226. package/dist/esm/BarList.d.ts.map +0 -1
  227. package/dist/esm/PieChart.d.ts.map +0 -1
  228. /package/dist/cjs/{PieChart.d.ts → components/Chart/PieChart.d.ts} +0 -0
  229. /package/dist/esm/{PieChart.d.ts → components/Chart/PieChart.d.ts} +0 -0
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.AddFilterPopover = exports.TagWrapper = exports.QuillSortPopover = exports.QuillFilterPopover = exports.EditPopover = exports.QuillTabs = exports.DEFAULT_TAB_OPTIONS = exports.QuillTableLoadingState = exports.QuillButtonLoadingState = exports.QuillDraggableColumn = exports.QuillSelectColumn = exports.QuillHandleButton = exports.QuillPopover = exports.MemoizedPopover = exports.QuillSelect = exports.CustomContainer = exports.QuillSidebar = exports.QuillSidebarSubHeading = exports.QuillSidebarHeading = exports.QuillTag = exports.QuillReportBuilderTable = exports.QuillSecondaryButton = exports.QuillButton = void 0;
6
+ exports.AddFilterPopover = exports.TagWrapper = exports.QuillLimitPopover = exports.QuillSortPopover = exports.QuillFilterPopover = exports.EditPopover = exports.QuillTableLoadingState = exports.QuillButtonLoadingState = exports.QuillDraggableColumn = exports.QuillSelectColumn = exports.QuillHandleButton = exports.CustomContainer = exports.QuillSidebar = exports.QuillSidebarHeading = exports.QuillTag = exports.QuillReportBuilderTable = exports.QuillSecondaryButton = exports.QuillButton = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const react_1 = require("react");
9
9
  const UiComponents_1 = require("../UiComponents");
@@ -60,6 +60,7 @@ const QuillSecondaryButton = ({ children, ...props }) => {
60
60
  }, children: children }));
61
61
  };
62
62
  exports.QuillSecondaryButton = QuillSecondaryButton;
63
+ // TODO: remove this, I think it is unused.
63
64
  const QuillReportBuilderTable = ({ rows, columns, error, ...props }) => {
64
65
  const reformattedColumns = columns.map((c) => ({ label: c, field: c }));
65
66
  return ((0, jsx_runtime_1.jsx)("div", { style: { height: '100%', overflow: 'auto' }, children: (0, jsx_runtime_1.jsx)(QuillTable_1.default, { rows: rows, columns: reformattedColumns, rowsPerPage: 10, showDownloadCSVButton: rows?.length > 0, downloadCSV: () => (0, csv_1.downloadCSV)({ rows, fields: reformattedColumns, name: 'my_report' }), emptyStateLabel: error || 'No results', ...props }) }));
@@ -105,22 +106,20 @@ exports.QuillTag = (0, react_1.forwardRef)(({ label, onClick, children, onClickD
105
106
  }, children: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: theme?.secondaryButtonColor || 'currentColor', style: { width: 16, height: 16 }, children: (0, jsx_runtime_1.jsx)("path", { d: "M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z" }) }) }) }))] }));
106
107
  });
107
108
  // A heading element in the sidebar (eg. "Filters")
108
- const QuillSidebarHeading = ({ label }) => ((0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedHeader, { children: label }));
109
+ const QuillSidebarHeading = ({ label, }) => (0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedHeader, { label: label });
109
110
  exports.QuillSidebarHeading = QuillSidebarHeading;
110
- // A sub-heading element in the sidebar (eg. "Filters")
111
- const QuillSidebarSubHeading = ({ label }) => ((0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedLabel, { children: label }));
112
- exports.QuillSidebarSubHeading = QuillSidebarSubHeading;
113
111
  // The gray thing on the left.
114
- exports.QuillSidebar = (0, react_1.forwardRef)(({ children, ...props }, forwardedRef) => ((0, jsx_runtime_1.jsx)("div", { style: {
112
+ const QuillSidebar = ({ children }) => ((0, jsx_runtime_1.jsx)("div", { style: {
115
113
  overflowX: 'visible',
116
114
  padding: '12px',
117
115
  width: '25%',
118
116
  height: '100%',
119
117
  maxWidth: '300px',
120
118
  boxSizing: 'border-box',
121
- }, ref: forwardedRef, ...props, children: children })));
119
+ }, children: children }));
120
+ exports.QuillSidebar = QuillSidebar;
122
121
  // A big wrapper around the main content (ie. Input, Button, and Table)
123
- exports.CustomContainer = (0, react_1.forwardRef)(({ children, ...props }, forwardedRef) => ((0, jsx_runtime_1.jsx)("div", { style: {
122
+ const CustomContainer = ({ children }) => ((0, jsx_runtime_1.jsx)("div", { style: {
124
123
  position: 'sticky',
125
124
  top: 0,
126
125
  display: 'flex',
@@ -133,61 +132,8 @@ exports.CustomContainer = (0, react_1.forwardRef)(({ children, ...props }, forwa
133
132
  width: '75%',
134
133
  height: '100%',
135
134
  boxSizing: 'border-box',
136
- }, ref: forwardedRef, ...props, children: children })));
137
- const QuillSelect = ({ onChange, ...props }) => {
138
- const handleOnChange = (value) => {
139
- if (!onChange)
140
- return;
141
- const option = props.options.find((opt) => opt.value === value);
142
- if (option) {
143
- onChange(option.value);
144
- }
145
- };
146
- return (0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedSelect, { ...props, onChange: handleOnChange });
147
- };
148
- exports.QuillSelect = QuillSelect;
149
- function MemoizedPopover({ onClose, children, style = {}, trigger, isOpen, }) {
150
- const modalRef = (0, react_1.useRef)(null);
151
- const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
152
- (0, react_1.useEffect)(() => {
153
- const listener = (event) => {
154
- if (modalRef?.current && !modalRef?.current?.contains(event.target)) {
155
- onClose(event);
156
- }
157
- };
158
- document.addEventListener('mousedown', listener);
159
- return () => {
160
- document.removeEventListener('mousedown', listener);
161
- };
162
- }, [modalRef, onClose]);
163
- return ((0, jsx_runtime_1.jsxs)("div", { children: [trigger, isOpen && ((0, jsx_runtime_1.jsx)("div", { id: "quill-popover-modal", ref: modalRef, style: { position: 'relative' }, children: (0, jsx_runtime_1.jsx)("div", { style: {
164
- background: theme?.backgroundColor || 'white',
165
- position: 'absolute',
166
- boxShadow: '0px 1px 12px 0px rgba(56, 65, 81, 0.1)',
167
- border: theme
168
- ? `${theme.borderWidth || 1}px solid ${theme.borderColor || '#e7e7e7'}`
169
- : '1px solid #e7e7e7',
170
- boxSizing: 'content-box',
171
- zIndex: 999,
172
- top: 12,
173
- borderRadius: 6,
174
- padding: 20,
175
- ...style,
176
- }, children: children }) }))] }));
177
- }
178
- exports.MemoizedPopover = MemoizedPopover;
179
- exports.QuillPopover = (0, react_1.forwardRef)(({ children, trigger, isOpen, onClose = () => { }, title = undefined }, ref) => {
180
- const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
181
- return ((0, jsx_runtime_1.jsxs)(MemoizedPopover, { isOpen: isOpen, onClose: onClose, trigger: trigger, parentRef: ref, ref: ref, children: [title && ((0, jsx_runtime_1.jsx)("h1", { style: {
182
- fontWeight: '600',
183
- fontSize: 18,
184
- margin: 0,
185
- textAlign: 'left',
186
- marginBottom: 5,
187
- color: theme?.primaryTextColor,
188
- fontFamily: theme?.fontFamily,
189
- }, children: title })), children] }));
190
- });
135
+ }, children: children }));
136
+ exports.CustomContainer = CustomContainer;
191
137
  // The six-dot grab-handle icon.
192
138
  const QuillHandleButton = () => {
193
139
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
@@ -233,7 +179,7 @@ const QuillHandleButton = () => {
233
179
  } })] })] }));
234
180
  };
235
181
  exports.QuillHandleButton = QuillHandleButton;
236
- const QuillSelectColumn = ({ label, selected, setSelected, children, }) => {
182
+ const QuillSelectColumn = ({ label, isSelected, setSelected, DragHandle, }) => {
237
183
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
238
184
  return ((0, jsx_runtime_1.jsxs)("div", { title: label, style: {
239
185
  boxShadow: '0px 1px 4px #e2e8f005',
@@ -245,13 +191,13 @@ const QuillSelectColumn = ({ label, selected, setSelected, children, }) => {
245
191
  display: 'flex',
246
192
  alignItems: 'center',
247
193
  backgroundColor: theme?.backgroundColor || 'white',
248
- }, children: [(0, jsx_runtime_1.jsx)("div", { children: children }), (0, jsx_runtime_1.jsxs)("label", { style: {
194
+ }, children: [(0, jsx_runtime_1.jsx)(DragHandle, { dragIcon: exports.QuillHandleButton }), (0, jsx_runtime_1.jsxs)("label", { style: {
249
195
  display: 'flex',
250
196
  gap: 2,
251
197
  whiteSpace: 'nowrap',
252
198
  textOverflow: 'ellipsis',
253
199
  overflow: 'hidden',
254
- }, children: [(0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedCheckbox, { checked: selected, onChange: () => setSelected() }), (0, jsx_runtime_1.jsx)("span", { style: {
200
+ }, children: [(0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedCheckbox, { isChecked: isSelected, onChange: () => setSelected() }), (0, jsx_runtime_1.jsx)("span", { style: {
255
201
  marginLeft: 6,
256
202
  display: 'block',
257
203
  whiteSpace: 'nowrap',
@@ -262,8 +208,10 @@ const QuillSelectColumn = ({ label, selected, setSelected, children, }) => {
262
208
  }, children: (0, textProcessing_1.snakeCaseToTitleCase)(label) })] })] }));
263
209
  };
264
210
  exports.QuillSelectColumn = QuillSelectColumn;
265
- // A draggable card with a grab-handle and a column name
266
- const QuillDraggableColumn = ({ label, children, onDelete }) => {
211
+ /**
212
+ * A draggable card with a grab-handle and a column name
213
+ */
214
+ const QuillDraggableColumn = ({ label, onDelete, DragHandle, }) => {
267
215
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
268
216
  return ((0, jsx_runtime_1.jsxs)("div", { style: {
269
217
  boxShadow: '0px 1px 4px #e2e8f005',
@@ -272,13 +220,14 @@ const QuillDraggableColumn = ({ label, children, onDelete }) => {
272
220
  display: 'flex',
273
221
  alignItems: 'center',
274
222
  backgroundColor: theme?.backgroundColor || 'white',
275
- }, children: [(0, jsx_runtime_1.jsx)("div", { children: children }), (0, jsx_runtime_1.jsx)("div", { style: {
223
+ }, children: [(0, jsx_runtime_1.jsx)(DragHandle, { dragIcon: exports.QuillHandleButton }), (0, jsx_runtime_1.jsx)("div", { style: {
276
224
  marginLeft: 2,
277
225
  marginRight: 'auto',
278
226
  fontSize: 14,
279
227
  display: 'block',
280
228
  whiteSpace: 'nowrap',
281
229
  textOverflow: 'ellipsis',
230
+ overflow: 'hidden',
282
231
  fontFamily: theme?.fontFamily,
283
232
  }, children: label }), (0, jsx_runtime_1.jsx)("button", { onClick: onDelete, style: {
284
233
  paddingRight: 4,
@@ -299,11 +248,6 @@ const QuillTableLoadingState = () => {
299
248
  return ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'column', margin: 'auto' }, children: (0, jsx_runtime_1.jsx)(UiComponents_1.LoadingSpinner, {}) }));
300
249
  };
301
250
  exports.QuillTableLoadingState = QuillTableLoadingState;
302
- exports.DEFAULT_TAB_OPTIONS = [
303
- { label: 'or', value: 'OR' },
304
- { label: 'and', value: 'AND' },
305
- ];
306
- exports.QuillTabs = (0, react_1.forwardRef)(({ options = exports.DEFAULT_TAB_OPTIONS, ...props }, ref) => ((0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedTabs, { ref: ref, options: options, ...props })));
307
251
  const EditPopover = ({ onSave, onDelete, Button, renderNode, activeEditItem, }) => {
308
252
  const handleOnClick = () => {
309
253
  if (!(0, util_1.allNumericNodesValidInTree)(activeEditItem)) {
@@ -325,41 +269,48 @@ const EditPopover = ({ onSave, onDelete, Button, renderNode, activeEditItem, })
325
269
  }, children: [(0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedSecondaryButton, { onClick: onDelete, label: "Delete" }), (0, jsx_runtime_1.jsx)(Button, { onClick: handleOnClick, label: "Save" })] })] }));
326
270
  };
327
271
  exports.EditPopover = EditPopover;
328
- const QuillFilterPopover = ({ filterLabel, onClickDeleteFilter, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
329
- return ((0, jsx_runtime_1.jsx)(exports.QuillPopover, { isOpen: isOpen, title: popoverTitle, trigger: (0, jsx_runtime_1.jsx)(exports.QuillTag, { label: filterLabel, onClickDelete: onClickDeleteFilter, onClick: () => {
330
- setIsOpen((isOpen) => !isOpen);
331
- } }), onClose: () => {
332
- setIsOpen(false);
333
- }, children: popoverChildren }));
272
+ const QuillFilterPopover = ({ filterLabel, onClickDelete, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
273
+ const handleSetIsOpen = (isOpen) => {
274
+ setIsOpen(isOpen);
275
+ };
276
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(exports.QuillTag, { label: filterLabel, onClickDelete: onClickDelete, onClick: () => setIsOpen(!isOpen) }), (0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedPopover, { isOpen: isOpen, setIsOpen: handleSetIsOpen, popoverTitle: popoverTitle, popoverChildren: popoverChildren })] }));
334
277
  };
335
278
  exports.QuillFilterPopover = QuillFilterPopover;
336
- const QuillSortPopover = ({ filterLabel, onClickDelete, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
337
- return ((0, jsx_runtime_1.jsx)(exports.QuillPopover, { isOpen: isOpen, title: popoverTitle, trigger: (0, jsx_runtime_1.jsx)(exports.QuillTag, { label: filterLabel, onClickDelete: onClickDelete, onClick: () => {
338
- setIsOpen((isOpen) => !isOpen);
339
- } }), onClose: () => {
340
- setIsOpen(false);
341
- }, children: popoverChildren }));
279
+ const QuillSortPopover = ({ sortLabel, onClickDelete, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
280
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(exports.QuillTag, { label: sortLabel, onClickDelete: onClickDelete, onClick: () => {
281
+ setIsOpen(!isOpen);
282
+ } }), (0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedPopover, { isOpen: isOpen, popoverTitle: popoverTitle, setIsOpen: setIsOpen, popoverChildren: popoverChildren })] }));
342
283
  };
343
284
  exports.QuillSortPopover = QuillSortPopover;
344
- const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData, activeEditItem, setEditPopoverKey, setActiveEditItem, setActivePath, setOpenPopover, setIsPending, clearCheckboxes, fetchSqlQuery, handleDelete, setCheckboxes, handleReplaceSubtree, FilterPopover, getByKey, EditPopover, Button, renderNode, children, }) => {
285
+ const QuillLimitPopover = ({ limitLabel, onClickDelete, popoverTitle, popoverChildren, isOpen, setIsOpen, }) => {
286
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(exports.QuillTag, { label: limitLabel, onClickDelete: onClickDelete, onClick: () => {
287
+ setIsOpen(!isOpen);
288
+ } }), (0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedPopover, { isOpen: isOpen, popoverTitle: popoverTitle, setIsOpen: setIsOpen, popoverChildren: popoverChildren })] }));
289
+ };
290
+ exports.QuillLimitPopover = QuillLimitPopover;
291
+ const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData, activeEditItem, setEditPopoverKey, setActiveEditItem, setActivePath, setOpenPopover, setIsPending, clearCheckboxes, handleDelete, setCheckboxes, handleReplaceSubtree, FilterPopover, getByKey, EditPopover, Button, renderNode, children, }) => {
345
292
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
293
+ const onOpen = () => {
294
+ setActiveEditItem(getByKey(formData, keyPrefix));
295
+ setActivePath(keyPrefix);
296
+ setIsPending(true);
297
+ setEditPopoverKey(keyPrefix);
298
+ setCheckboxes(getByKey(formData, keyPrefix));
299
+ };
300
+ const onClose = () => {
301
+ setEditPopoverKey(null);
302
+ setIsPending(false);
303
+ setActiveEditItem(null);
304
+ setActivePath(null);
305
+ setOpenPopover(null);
306
+ clearCheckboxes();
307
+ };
346
308
  (0, react_1.useEffect)(() => {
347
309
  if (isOpen) {
348
- // open
349
- setActiveEditItem(getByKey(formData, keyPrefix));
350
- setActivePath(keyPrefix);
351
- setIsPending(true);
352
- setEditPopoverKey(keyPrefix);
353
- setCheckboxes(getByKey(formData, keyPrefix));
310
+ onOpen();
354
311
  }
355
312
  else {
356
- // closed
357
- setEditPopoverKey(null);
358
- setIsPending(false);
359
- setActiveEditItem(null);
360
- setActivePath(null);
361
- setOpenPopover(null);
362
- clearCheckboxes();
313
+ onClose();
363
314
  }
364
315
  }, [isOpen]);
365
316
  if (isCard && isRow) {
@@ -373,7 +324,7 @@ const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData, active
373
324
  setEditPopoverKey(null);
374
325
  clearCheckboxes();
375
326
  };
376
- return ((0, jsx_runtime_1.jsx)("div", { style: { width: '100%' }, children: (0, jsx_runtime_1.jsx)(FilterPopover, { isOpen: editPopoverKey === keyPrefix, popoverTitle: "Edit Filter", filterLabel: children, onClickDeleteFilter: handleClickDelete, setIsOpen: setIsOpen, popoverChildren: (0, jsx_runtime_1.jsx)(EditPopover, { Button: Button, renderNode: renderNode, activeEditItem: activeEditItem, onSave: () => {
327
+ return ((0, jsx_runtime_1.jsx)("div", { style: { width: '100%' }, children: (0, jsx_runtime_1.jsx)(FilterPopover, { isOpen: editPopoverKey === keyPrefix, popoverTitle: "Edit Filter", filterLabel: children, onClickDelete: handleClickDelete, setIsOpen: setIsOpen, popoverChildren: (0, jsx_runtime_1.jsx)(EditPopover, { Button: Button, renderNode: renderNode, activeEditItem: activeEditItem, onSave: () => {
377
328
  if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
378
329
  setIsPending(false);
379
330
  setActiveEditItem(null);
@@ -381,7 +332,7 @@ const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData, active
381
332
  setOpenPopover(null);
382
333
  setEditPopoverKey(null);
383
334
  handleDelete(keyPrefix);
384
- fetchSqlQuery();
335
+ setIsOpen(false);
385
336
  clearCheckboxes();
386
337
  }
387
338
  else {
@@ -391,6 +342,7 @@ const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData, active
391
342
  setActiveEditItem(null);
392
343
  setActivePath(null);
393
344
  setOpenPopover(null);
345
+ setIsOpen(false);
394
346
  clearCheckboxes();
395
347
  }
396
348
  }, onDelete: () => {
@@ -399,8 +351,8 @@ const TagWrapper = ({ isCard, isRow, editPopoverKey, keyPrefix, formData, active
399
351
  setActivePath(null);
400
352
  setOpenPopover(null);
401
353
  setEditPopoverKey(null);
354
+ setIsOpen(false);
402
355
  handleDelete(keyPrefix);
403
- fetchSqlQuery();
404
356
  clearCheckboxes();
405
357
  } }) }) })); // Make sure to close the <Tag> correctly
406
358
  }
@@ -21,11 +21,15 @@ export declare function formatDateComparisonNode(node: any): string | null;
21
21
  export declare function getInTheCurrentIntervalSentence(node: any, databaseType: string): string | null;
22
22
  export declare function getInTheLastIntervalSentence(node: any, databaseType: string): string | null;
23
23
  export declare function getInThePreviousIntervalSentence(node: any, databaseType: string): string | null;
24
+ export declare function getIsEqualsSentence(node: any, databaseType: string): string | null;
25
+ export declare function getIsAfterSentence(node: any, databaseType: string): string | null;
26
+ export declare function getIsBeforeSentence(node: any, databaseType: string): string | null;
24
27
  export declare const isInTheLastInterval: (node: any, databaseType: string) => boolean;
25
- export declare const isInTheLastIntervalBigQuery: (node: any) => boolean;
28
+ export declare const isAfter: (node: any, databaseType: string) => boolean | undefined;
29
+ export declare const isBefore: (node: any, databaseType: string) => boolean | undefined;
26
30
  export declare const isTheCurrentInterval: (node: any, databaseType: string) => boolean;
31
+ export declare const isEquals: (node: any, databaseType: string) => boolean;
27
32
  export declare const isThePreviousInterval: (node: any, databaseType: string) => any;
28
- export declare const isTheCurrentIntervalBigQuery: (node: any) => boolean;
29
33
  /**
30
34
  * Returns whether this node is the root of a binary expression
31
35
  * where the left child is a string but really should be
@@ -56,7 +60,7 @@ export declare function tryConvertDateEquality(node: any, databaseType?: string)
56
60
  * Returns whether this node is an equality of a date column with a
57
61
  * date trunc.
58
62
  */
59
- export declare const isDateTruncEquals: (node: any) => boolean;
63
+ export declare const isDateTruncEquals: (node: any, databaseType?: string) => boolean;
60
64
  /**
61
65
  * Returns whether this node is an equality of a date column with extract.
62
66
  */
@@ -73,6 +77,8 @@ export declare const getDateFilterInfo: (node: any) => {
73
77
  intervalType: any;
74
78
  intervalPaths: any;
75
79
  };
76
- export declare function removeNonSelectedTableReferences(ast: any, table: string): any;
80
+ export declare function removeNonSelectedTableReferences(ast: any, table: string, columns: string[]): any;
77
81
  export declare function allNumericNodesValidInTree(node: any): boolean;
82
+ export declare function isIdColumn(columnName?: string): boolean | "" | undefined;
83
+ export declare function getCustomSentence(node: any, databaseType: string): string | null;
78
84
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/util.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,eAAO,MAAM,qBAAqB,SAAU,GAAG,YAW9C,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,WAa1C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,WAK5C;AAGD,eAAO,MAAM,WAAW,SAAU,GAAG,YAuBpC,CAAC;AAKF,eAAO,MAAM,oBAAoB,SAAU,GAAG,QAE7C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG;;;;;;;;EAU3C;AAKD,eAAO,MAAM,eAAe,QAAS,GAAG,QAMvC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,WAiBvD;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,GAAG,iBAQjD;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,GAAG,EACT,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAOf;AAQD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,GAAG,EACT,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAWf;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,GAAG,EACT,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAOf;AAMD,eAAO,MAAM,mBAAmB,SAAU,GAAG,gBAAgB,MAAM,YA4BlE,CAAC;AAIF,eAAO,MAAM,2BAA2B,SAAU,GAAG,YAUpD,CAAC;AAIF,eAAO,MAAM,oBAAoB,SACzB,GAAG,gBACK,MAAM,KACnB,OAoBF,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,GAAG,gBAAgB,MAAM,QAYpE,CAAC;AAEF,eAAO,MAAM,4BAA4B,SAAU,GAAG,KAAG,OAUxD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,SAAU,GAAG,QA4B3C,CAAC;AAGF,eAAO,MAAM,UAAU,eAAgB,MAAM,SAe5C,CAAC;AAmBF;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,UAsBvE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,UAgB9C;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,sBAmBtE;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,SAAU,GAAG,YAU1C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,SAAU,GAAG,YAOxC,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,WAehD;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,GAAG,GACV,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAyB1C;AAED,eAAO,MAAM,QAAQ,QAAS,GAAG,QAAoC,CAAC;AAEtE,eAAO,MAAM,QAAQ,MAAO,MAAM,WAA2C,CAAC;AA4L9E,eAAO,MAAM,iBAAiB,SAAU,GAAG;;;;;;;CAc1C,CAAC;AAqCF,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,OAQvE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAe7D"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/util.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  // A collection of reusable, pure, utility functions for the Report Builder.
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.allNumericNodesValidInTree = exports.removeNonSelectedTableReferences = exports.getDateFilterInfo = exports.trimEndS = exports.deepCopy = exports.getPostgresBasicType = exports.showNodeAsRow = exports.isExtractEquals = exports.isDateTruncEquals = exports.tryConvertDateEquality = exports.extractSuffixToString = exports.dateTruncSuffixToString = exports.newUTCDate = exports.isColumnComparison = exports.isTheCurrentIntervalBigQuery = exports.isThePreviousInterval = exports.isTheCurrentInterval = exports.isInTheLastIntervalBigQuery = exports.isInTheLastInterval = exports.getInThePreviousIntervalSentence = exports.getInTheLastIntervalSentence = exports.getInTheCurrentIntervalSentence = exports.formatDateComparisonNode = exports.areObjectsEqualish = exports.isColumnDateish = exports.generateColumnExpr = exports.isColumnReferenceish = exports.isDateTrunc = exports.hasTopLevelOrBoolean = exports.isTopLevelBoolean = exports.isNodeEmptyCollection = void 0;
4
+ exports.getCustomSentence = exports.isIdColumn = exports.allNumericNodesValidInTree = exports.removeNonSelectedTableReferences = exports.getDateFilterInfo = exports.trimEndS = exports.deepCopy = exports.getPostgresBasicType = exports.showNodeAsRow = exports.isExtractEquals = exports.isDateTruncEquals = exports.tryConvertDateEquality = exports.extractSuffixToString = exports.dateTruncSuffixToString = exports.newUTCDate = exports.isColumnComparison = exports.isThePreviousInterval = exports.isEquals = exports.isTheCurrentInterval = exports.isBefore = exports.isAfter = exports.isInTheLastInterval = exports.getIsBeforeSentence = exports.getIsAfterSentence = exports.getIsEqualsSentence = exports.getInThePreviousIntervalSentence = exports.getInTheLastIntervalSentence = exports.getInTheCurrentIntervalSentence = exports.formatDateComparisonNode = exports.areObjectsEqualish = exports.isColumnDateish = exports.generateColumnExpr = exports.isColumnReferenceish = exports.isDateTrunc = exports.hasTopLevelOrBoolean = exports.isTopLevelBoolean = exports.isNodeEmptyCollection = void 0;
5
5
  const date_fns_1 = require("date-fns");
6
6
  const bigDateMap_1 = require("./bigDateMap");
7
7
  const textProcessing_1 = require("../../utils/textProcessing");
8
+ const parserBigQuery_1 = require("../../utils/parserBigQuery");
9
+ const parserPostgres_1 = require("../../utils/parserPostgres");
8
10
  /**
9
11
  * A node that is "in" or "not in" where none of the variants are selected.
10
12
  */
@@ -147,7 +149,7 @@ const BIG_QUERY_DAY_TO_INTERVAL_MAP = {
147
149
  };
148
150
  function getInTheLastIntervalSentence(node, databaseType) {
149
151
  if (databaseType === 'BigQuery') {
150
- const dateColumn = (0, textProcessing_1.snakeCaseToTitleCase)(node.left.column);
152
+ const dateColumn = (0, textProcessing_1.snakeCaseToTitleCase)(node.left.column || node.left.args.value[0].columns || '');
151
153
  const amount = node.right.args.value[1].expr.value;
152
154
  let unit = node.right.args.value[1].unit.toLowerCase();
153
155
  if (unit.includes('*')) {
@@ -167,70 +169,92 @@ function getInThePreviousIntervalSentence(node, databaseType) {
167
169
  return null;
168
170
  }
169
171
  exports.getInThePreviousIntervalSentence = getInThePreviousIntervalSentence;
172
+ function getIsEqualsSentence(node, databaseType) {
173
+ if (databaseType === 'BigQuery') {
174
+ const dateColumn = (0, textProcessing_1.snakeCaseToTitleCase)(node.left.args.value[1].column);
175
+ const type = node.right.args.value[1].column.toLowerCase();
176
+ const value = node.right.args.value[0].value;
177
+ // using date-fns can I parse the date to short month year
178
+ const date = new Date(value);
179
+ if (type === 'year') {
180
+ return `${dateColumn} is in ${(0, date_fns_1.format)((0, date_fns_1.addMinutes)(date, date.getTimezoneOffset()), 'yyyy')}`;
181
+ }
182
+ else if (type === 'month') {
183
+ return `${dateColumn} is in ${(0, date_fns_1.format)((0, date_fns_1.addMinutes)(date, date.getTimezoneOffset()), 'MMM yyyy')}`;
184
+ }
185
+ else if (type === 'quarter') {
186
+ return `${dateColumn} is in ${(0, date_fns_1.format)((0, date_fns_1.addMinutes)(date, date.getTimezoneOffset()), 'QQQ yyyy')}`;
187
+ }
188
+ return `${dateColumn} is in the ${type} of ${value}`;
189
+ }
190
+ return null;
191
+ }
192
+ exports.getIsEqualsSentence = getIsEqualsSentence;
193
+ function getIsAfterSentence(node, databaseType) {
194
+ if (databaseType === 'BigQuery') {
195
+ const dateColumn = (0, textProcessing_1.snakeCaseToTitleCase)(node.left?.column || node.left?.args?.value[0]?.columns || '');
196
+ const value = node.right?.value || node.right?.args?.value[0]?.value || '';
197
+ if (!dateColumn || !value) {
198
+ return null;
199
+ }
200
+ return `${dateColumn} is after ${value}`;
201
+ }
202
+ return null;
203
+ }
204
+ exports.getIsAfterSentence = getIsAfterSentence;
205
+ function getIsBeforeSentence(node, databaseType) {
206
+ if (databaseType === 'BigQuery') {
207
+ const dateColumn = (0, textProcessing_1.snakeCaseToTitleCase)(node.left?.column || node.left?.args?.value[0]?.columns || '');
208
+ const value = node.right?.value || node.right?.args?.value[0]?.value || '';
209
+ if (!dateColumn || !value) {
210
+ return null;
211
+ }
212
+ return `${dateColumn} is before ${value}`;
213
+ }
214
+ return null;
215
+ }
216
+ exports.getIsBeforeSentence = getIsBeforeSentence;
170
217
  // "created_at" >= date_trunc ('year', CURRENT_DATE) - INTERVAL '1 year'
171
218
  // or
172
219
  // "created_at" >= CURRENT_DATE - INTERVAL '1 year'
173
220
  // in the last year aka one interval from today
174
221
  const isInTheLastInterval = (node, databaseType) => {
175
222
  if (databaseType && databaseType.toLowerCase() === 'bigquery') {
176
- return (0, exports.isInTheLastIntervalBigQuery)(node);
223
+ return (0, parserBigQuery_1.isInTheLastIntervalBigQuery)(node);
177
224
  }
178
- const isOutsideOfDateTrunc = ['>=', '>'].includes(node.operator) &&
179
- node.left.type === 'column_ref' &&
180
- node.right.type === 'binary_expr' &&
181
- node.right.operator === '-' &&
182
- node.right.left.type === 'function' &&
183
- node.right.left.name.toLowerCase() === 'date_trunc' &&
184
- node.right.left.args.value[0].type === 'single_quote_string' &&
185
- node.right.left.args.value[1].type === 'function' &&
186
- ['current_date', 'now'].includes(node.right.left.args.value[1].name.toLowerCase()) &&
187
- node.right.right.type.toLowerCase() === 'interval' &&
188
- node.right.right.expr.type === 'single_quote_string';
189
- const noDateTrunc = ['>=', '>'].includes(node.operator) &&
190
- node.left.type === 'column_ref' &&
191
- node.right.type === 'binary_expr' &&
192
- node.right.operator === '-' &&
193
- node.right.left.type === 'function' &&
194
- ['current_date', 'now'].includes(node.right.left.name.toLowerCase()) &&
195
- node.right.right.type.toLowerCase() === 'interval' &&
196
- node.right.right.expr.type === 'single_quote_string';
197
- return isOutsideOfDateTrunc || noDateTrunc;
225
+ return (0, parserPostgres_1.isInTheLastIntervalPostgres)(node);
198
226
  };
199
227
  exports.isInTheLastInterval = isInTheLastInterval;
200
- // created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH)
201
- // in the last month aka one interval from today
202
- const isInTheLastIntervalBigQuery = (node) => {
203
- const isOutsideOfDateTrunc = ['>=', '>'].includes(node.operator) &&
204
- node.left.type === 'column_ref' &&
205
- node.right.type === 'function' &&
206
- node.right.name.toLowerCase() === 'timestamp_sub' &&
207
- node.right.args.value[0].type === 'function' &&
208
- node.right.args.value[1].type === 'interval' &&
209
- ['current_timestamp'].includes(node.right.args.value[0].name.toLowerCase());
210
- return isOutsideOfDateTrunc;
228
+ const isAfter = (node, databaseType) => {
229
+ if (databaseType && databaseType.toLowerCase() === 'bigquery') {
230
+ return (0, parserBigQuery_1.isAfterBigQuery)(node);
231
+ }
232
+ };
233
+ exports.isAfter = isAfter;
234
+ const isBefore = (node, databaseType) => {
235
+ if (databaseType && databaseType.toLowerCase() === 'bigquery') {
236
+ return (0, parserBigQuery_1.isBeforeBigQuery)(node);
237
+ }
211
238
  };
212
- exports.isInTheLastIntervalBigQuery = isInTheLastIntervalBigQuery;
239
+ exports.isBefore = isBefore;
213
240
  // "created_at" >= date_trunc ('year', CURRENT_DATE - INTERVAL '1 year')
214
241
  // this year
215
242
  const isTheCurrentInterval = (node, databaseType) => {
216
243
  if (databaseType && databaseType.toLowerCase() === 'bigquery') {
217
- return (0, exports.isTheCurrentIntervalBigQuery)(node);
244
+ return (0, parserBigQuery_1.isTheCurrentIntervalBigQuery)(node);
218
245
  }
219
- const isInsideOfDateTrunc = ['AND'].includes(node.operator) &&
220
- (node.left.operator === '=' || node.left.type === 'double_quote_string') &&
221
- node.right.operator === '=' &&
222
- node.right.name &&
223
- node.right.name.toLowerCase() === 'date_trunc' &&
224
- node.args.value[0].type === 'single_quote_string' &&
225
- node.args.value[1].type === 'binary_expr' &&
226
- node.args.value[1].operator === '-' &&
227
- node.args.value[1].left.type === 'function' &&
228
- ['now', 'current_date'].includes(node.args.value[1].left.name.toLowerCase()) &&
229
- node.args.value[1].right.type === 'interval' &&
230
- node.args.value[1].right.expr.type === 'single_quote_string';
231
- return isInsideOfDateTrunc;
246
+ return (0, parserPostgres_1.isTheCurrentIntervalPostgres)(node);
232
247
  };
233
248
  exports.isTheCurrentInterval = isTheCurrentInterval;
249
+ // "created_at" >= date_trunc ('year', CURRENT_DATE - INTERVAL '1 year')
250
+ // this year
251
+ const isEquals = (node, databaseType) => {
252
+ if (databaseType && databaseType.toLowerCase() === 'bigquery') {
253
+ return (0, parserBigQuery_1.isEqualsBigQuery)(node);
254
+ }
255
+ return false;
256
+ };
257
+ exports.isEquals = isEquals;
234
258
  const isThePreviousInterval = (node, databaseType) => {
235
259
  const isInsideOfDateTrunc = ['='].includes(node.operator) &&
236
260
  node.left.name &&
@@ -238,23 +262,12 @@ const isThePreviousInterval = (node, databaseType) => {
238
262
  node.left.type === 'function' &&
239
263
  node.right.name &&
240
264
  node.right.name.toLowerCase() === 'timestamp_trunc' &&
241
- node.right.args.value[0].name.toLowerCase() === 'timestamp_sub' &&
265
+ node.right.args.value[0]?.name?.toLowerCase() === 'timestamp_sub' &&
242
266
  node.right.args.value[0].args.value[0].name.toLowerCase() ===
243
267
  'current_timestamp';
244
268
  return isInsideOfDateTrunc;
245
269
  };
246
270
  exports.isThePreviousInterval = isThePreviousInterval;
247
- const isTheCurrentIntervalBigQuery = (node) => {
248
- const isInsideOfDateTrunc = ['='].includes(node.operator) &&
249
- node.left.type === 'function' &&
250
- node.left.name &&
251
- node.left.name.toLowerCase() === 'timestamp_trunc' &&
252
- node.right.type === 'function' &&
253
- node.right.name.toLowerCase() === 'timestamp_trunc' &&
254
- node.right.args.value[0].name.toLowerCase() === 'current_timestamp';
255
- return isInsideOfDateTrunc;
256
- };
257
- exports.isTheCurrentIntervalBigQuery = isTheCurrentIntervalBigQuery;
258
271
  /**
259
272
  * Returns whether this node is the root of a binary expression
260
273
  * where the left child is a string but really should be
@@ -379,7 +392,7 @@ function extractSuffixToString(node) {
379
392
  }
380
393
  exports.extractSuffixToString = extractSuffixToString;
381
394
  function tryConvertDateEquality(node, databaseType) {
382
- if ((0, exports.isDateTruncEquals)(node)) {
395
+ if ((0, exports.isDateTruncEquals)(node, databaseType)) {
383
396
  const columnNode = node.left.args.value[1];
384
397
  const columnName = columnNode.column ?? columnNode.value;
385
398
  const cleanColumnName = (0, textProcessing_1.snakeCaseToTitleCase)(columnName.replaceAll('_at', ''));
@@ -400,7 +413,7 @@ exports.tryConvertDateEquality = tryConvertDateEquality;
400
413
  * Returns whether this node is an equality of a date column with a
401
414
  * date trunc.
402
415
  */
403
- const isDateTruncEquals = (node) => {
416
+ const isDateTruncEquals = (node, databaseType) => {
404
417
  return (node.type === 'binary_expr' &&
405
418
  node.operator === '=' &&
406
419
  (0, exports.isDateTrunc)(node.left) &&
@@ -659,18 +672,29 @@ function getNodeTable(node) {
659
672
  return null;
660
673
  }
661
674
  // Recursively remove filters that don't apply to the given table
662
- function removeNonSelectedTableFilters(node, table) {
675
+ function removeNonSelectedTableFilters(node, table, columns) {
663
676
  if (node.left.type !== 'binary_expr') {
664
677
  const referencedTable = getNodeTable(node.left);
665
- if (referencedTable && referencedTable !== table) {
678
+ const referencedColumn = node.left.column ||
679
+ node.left.value ||
680
+ node.left.args?.value[0]?.column ||
681
+ node.left.args?.value[0]?.value;
682
+ if ((referencedTable && referencedTable !== table) ||
683
+ !columns.includes(referencedColumn)) {
666
684
  return null;
667
685
  }
668
686
  else {
687
+ if (node.left.value) {
688
+ node.left.column = node.left.value;
689
+ }
690
+ else if (node.left.args?.value[0].value) {
691
+ node.left.args.value[0].column = node.left.args.value[0].value;
692
+ }
669
693
  return node;
670
694
  }
671
695
  }
672
- node.left = removeNonSelectedTableFilters(node.left, table);
673
- node.right = removeNonSelectedTableFilters(node.right, table);
696
+ node.left = removeNonSelectedTableFilters(node.left, table, columns);
697
+ node.right = removeNonSelectedTableFilters(node.right, table, columns);
674
698
  if (node.left && node.right) {
675
699
  return node;
676
700
  }
@@ -684,14 +708,13 @@ function removeNonSelectedTableFilters(node, table) {
684
708
  return null;
685
709
  }
686
710
  }
687
- function removeNonSelectedTableReferences(ast, table) {
711
+ function removeNonSelectedTableReferences(ast, table, columns) {
688
712
  ast.columns = ast.columns.filter((col) => {
689
713
  return col.table === table || col.expr.table === table || !col.expr.table;
690
714
  });
691
715
  if (!ast.where)
692
716
  return ast;
693
- ast.where = removeNonSelectedTableFilters(ast.where, table);
694
- console.log(ast);
717
+ ast.where = removeNonSelectedTableFilters(ast.where, table, columns);
695
718
  return ast;
696
719
  }
697
720
  exports.removeNonSelectedTableReferences = removeNonSelectedTableReferences;
@@ -700,7 +723,6 @@ function allNumericNodesValidInTree(node) {
700
723
  return true;
701
724
  if (node.type === 'number') {
702
725
  const value = parseFloat(node.value);
703
- console.log(node.value, value);
704
726
  if (Number.isNaN(value)) {
705
727
  return false;
706
728
  }
@@ -714,3 +736,34 @@ function allNumericNodesValidInTree(node) {
714
736
  return isLeftValid && isRightValid;
715
737
  }
716
738
  exports.allNumericNodesValidInTree = allNumericNodesValidInTree;
739
+ function isIdColumn(columnName) {
740
+ return (columnName &&
741
+ (columnName.toLowerCase() === 'id' ||
742
+ columnName.toLowerCase().endsWith('_id') ||
743
+ columnName.endsWith('Id')));
744
+ }
745
+ exports.isIdColumn = isIdColumn;
746
+ // This function determines if a node is a custom node type.
747
+ // This will parse out date filters and some numeric filters that are unique (between).
748
+ function getCustomSentence(node, databaseType) {
749
+ if ((0, exports.isTheCurrentInterval)(node, databaseType)) {
750
+ return getInTheCurrentIntervalSentence(node, databaseType);
751
+ }
752
+ else if ((0, exports.isInTheLastInterval)(node, databaseType)) {
753
+ return getInTheLastIntervalSentence(node, databaseType);
754
+ }
755
+ else if ((0, exports.isAfter)(node, databaseType)) {
756
+ return getIsAfterSentence(node, databaseType);
757
+ }
758
+ else if ((0, exports.isBefore)(node, databaseType)) {
759
+ return getIsBeforeSentence(node, databaseType);
760
+ }
761
+ else if ((0, exports.isThePreviousInterval)(node, databaseType)) {
762
+ return getInThePreviousIntervalSentence(node, databaseType);
763
+ }
764
+ else if ((0, exports.isEquals)(node, databaseType)) {
765
+ return getIsEqualsSentence(node, databaseType);
766
+ }
767
+ return null;
768
+ }
769
+ exports.getCustomSentence = getCustomSentence;