@quillsql/react 2.13.42 → 2.13.44
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.
- package/dist/cjs/Chart.d.ts.map +1 -1
- package/dist/cjs/Chart.js +2 -2
- package/dist/cjs/ChartBuilder.d.ts +1 -0
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +48 -14
- package/dist/cjs/ChartEditor.d.ts +1 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +2 -2
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +37 -26
- package/dist/cjs/Dashboard.d.ts +2 -2
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +115 -99
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +871 -1574
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +23 -4
- package/dist/cjs/Table.d.ts.map +1 -1
- package/dist/cjs/components/Chart/CustomReferenceLine.js +1 -1
- package/dist/cjs/components/Chart/GaugeChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/GaugeChart.js +64 -12
- package/dist/cjs/components/Chart/InternalChart.js +1 -1
- package/dist/cjs/components/Chart/MapChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/MapChart.js +65 -7
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +3 -3
- package/dist/cjs/components/Dashboard/DashboardSection.d.ts +1 -1
- package/dist/cjs/components/Dashboard/DashboardSection.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardSection.js +20 -19
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +1 -0
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +5 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +58 -8
- package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
- package/dist/cjs/components/QuillSelect.js +91 -14
- package/dist/cjs/components/QuillSelectWithCombo.js +6 -6
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +6 -16
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnModal.js +172 -75
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -5
- package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddSortPopover.js +2 -9
- package/dist/cjs/components/ReportBuilder/DraggableColumns.d.ts +17 -0
- package/dist/cjs/components/ReportBuilder/DraggableColumns.d.ts.map +1 -0
- package/dist/cjs/components/ReportBuilder/DraggableColumns.js +52 -0
- package/dist/cjs/components/ReportBuilder/DraggableItem.d.ts +17 -0
- package/dist/cjs/components/ReportBuilder/DraggableItem.d.ts.map +1 -0
- package/dist/cjs/components/ReportBuilder/DraggableItem.js +17 -0
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +6 -12
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.js +29 -20
- package/dist/cjs/components/ReportBuilder/FilterStack.d.ts +8 -17
- package/dist/cjs/components/ReportBuilder/FilterStack.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterStack.js +20 -86
- package/dist/cjs/components/ReportBuilder/convert.js +6 -6
- package/dist/cjs/components/ReportBuilder/ui.d.ts +8 -9
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +30 -8
- package/dist/cjs/components/ReportBuilder/util.d.ts +2 -5
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +1 -1
- package/dist/cjs/components/UiComponents.d.ts +3 -2
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +13 -13
- package/dist/cjs/hooks/useAskQuill.d.ts +1 -1
- package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useAskQuill.js +14 -12
- package/dist/cjs/hooks/useDashboard.d.ts +5 -3
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +8 -6
- package/dist/cjs/hooks/useOnClickOutside.d.ts +1 -0
- package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -1
- package/dist/cjs/hooks/useOnClickOutside.js +33 -0
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +2 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotForm.js +22 -15
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +7 -5
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +100 -48
- package/dist/cjs/models/Client.d.ts +4 -0
- package/dist/cjs/models/Client.d.ts.map +1 -1
- package/dist/cjs/models/Dashboard.d.ts +1 -0
- package/dist/cjs/models/Dashboard.d.ts.map +1 -1
- package/dist/cjs/models/Report.d.ts +2 -0
- package/dist/cjs/models/Report.d.ts.map +1 -1
- package/dist/cjs/models/ReportBuilder.d.ts +46 -0
- package/dist/cjs/models/ReportBuilder.d.ts.map +1 -0
- package/dist/cjs/models/ReportBuilder.js +19 -0
- package/dist/cjs/models/Tables.d.ts +5 -5
- package/dist/cjs/models/Tables.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.d.ts +4 -0
- package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astFilterProcessing.js +301 -97
- package/dist/cjs/utils/astProcessing.d.ts +14 -4
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +38 -4
- package/dist/cjs/utils/dashboard.d.ts.map +1 -1
- package/dist/cjs/utils/dashboard.js +18 -3
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +4 -3
- package/dist/cjs/utils/filterProcessing.d.ts +2 -11
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +4 -16
- package/dist/cjs/utils/pivotConstructor.d.ts +2 -1
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +4 -2
- package/dist/cjs/utils/pivotProcessing.d.ts +17 -7
- package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/pivotProcessing.js +60 -51
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +15 -2
- package/dist/cjs/utils/report.d.ts +12 -9
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +114 -47
- package/dist/cjs/utils/reportBuilder.d.ts +88 -0
- package/dist/cjs/utils/reportBuilder.d.ts.map +1 -0
- package/dist/cjs/utils/reportBuilder.js +395 -0
- package/dist/cjs/utils/schema.d.ts +7 -0
- package/dist/cjs/utils/schema.d.ts.map +1 -1
- package/dist/cjs/utils/schema.js +36 -2
- package/dist/cjs/utils/tableProcessing.d.ts +59 -29
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +75 -90
- package/dist/cjs/utils/ui.d.ts +2 -0
- package/dist/cjs/utils/ui.d.ts.map +1 -0
- package/dist/cjs/utils/ui.js +18 -0
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +2 -2
- package/dist/esm/ChartBuilder.d.ts +1 -0
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +49 -15
- package/dist/esm/ChartEditor.d.ts +1 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +2 -2
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +37 -26
- package/dist/esm/Dashboard.d.ts +2 -2
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +119 -103
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +878 -1581
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +23 -4
- package/dist/esm/Table.d.ts.map +1 -1
- package/dist/esm/components/Chart/CustomReferenceLine.js +1 -1
- package/dist/esm/components/Chart/GaugeChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/GaugeChart.js +27 -8
- package/dist/esm/components/Chart/InternalChart.js +1 -1
- package/dist/esm/components/Chart/MapChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/MapChart.js +30 -5
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +3 -3
- package/dist/esm/components/Dashboard/DashboardSection.d.ts +1 -1
- package/dist/esm/components/Dashboard/DashboardSection.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardSection.js +21 -20
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +1 -0
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +5 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +57 -7
- package/dist/esm/components/QuillSelect.d.ts.map +1 -1
- package/dist/esm/components/QuillSelect.js +58 -14
- package/dist/esm/components/QuillSelectWithCombo.js +6 -6
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +6 -16
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddColumnModal.js +173 -76
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -5
- package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddSortPopover.js +2 -9
- package/dist/esm/components/ReportBuilder/DraggableColumns.d.ts +17 -0
- package/dist/esm/components/ReportBuilder/DraggableColumns.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/DraggableColumns.js +46 -0
- package/dist/esm/components/ReportBuilder/DraggableItem.d.ts +17 -0
- package/dist/esm/components/ReportBuilder/DraggableItem.d.ts.map +1 -0
- package/dist/esm/components/ReportBuilder/DraggableItem.js +14 -0
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +6 -12
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.js +29 -20
- package/dist/esm/components/ReportBuilder/FilterStack.d.ts +8 -17
- package/dist/esm/components/ReportBuilder/FilterStack.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterStack.js +21 -87
- package/dist/esm/components/ReportBuilder/convert.js +6 -6
- package/dist/esm/components/ReportBuilder/ui.d.ts +8 -9
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +33 -11
- package/dist/esm/components/ReportBuilder/util.d.ts +2 -5
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +1 -1
- package/dist/esm/components/UiComponents.d.ts +3 -2
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +13 -13
- package/dist/esm/hooks/useAskQuill.d.ts +1 -1
- package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useAskQuill.js +14 -12
- package/dist/esm/hooks/useDashboard.d.ts +5 -3
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +8 -6
- package/dist/esm/hooks/useOnClickOutside.d.ts +1 -0
- package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -1
- package/dist/esm/hooks/useOnClickOutside.js +31 -0
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +2 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotForm.js +23 -16
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +7 -5
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +101 -49
- package/dist/esm/models/Client.d.ts +4 -0
- package/dist/esm/models/Client.d.ts.map +1 -1
- package/dist/esm/models/Dashboard.d.ts +1 -0
- package/dist/esm/models/Dashboard.d.ts.map +1 -1
- package/dist/esm/models/Report.d.ts +2 -0
- package/dist/esm/models/Report.d.ts.map +1 -1
- package/dist/esm/models/ReportBuilder.d.ts +46 -0
- package/dist/esm/models/ReportBuilder.d.ts.map +1 -0
- package/dist/esm/models/ReportBuilder.js +16 -0
- package/dist/esm/models/Tables.d.ts +5 -5
- package/dist/esm/models/Tables.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.d.ts +4 -0
- package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astFilterProcessing.js +300 -97
- package/dist/esm/utils/astProcessing.d.ts +14 -4
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +38 -5
- package/dist/esm/utils/dashboard.d.ts.map +1 -1
- package/dist/esm/utils/dashboard.js +18 -3
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +4 -3
- package/dist/esm/utils/filterProcessing.d.ts +2 -11
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +4 -15
- package/dist/esm/utils/pivotConstructor.d.ts +2 -1
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +4 -2
- package/dist/esm/utils/pivotProcessing.d.ts +17 -7
- package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
- package/dist/esm/utils/pivotProcessing.js +58 -49
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +15 -2
- package/dist/esm/utils/report.d.ts +12 -9
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +116 -46
- package/dist/esm/utils/reportBuilder.d.ts +88 -0
- package/dist/esm/utils/reportBuilder.d.ts.map +1 -0
- package/dist/esm/utils/reportBuilder.js +386 -0
- package/dist/esm/utils/schema.d.ts +7 -0
- package/dist/esm/utils/schema.d.ts.map +1 -1
- package/dist/esm/utils/schema.js +34 -1
- package/dist/esm/utils/tableProcessing.d.ts +59 -29
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +71 -86
- package/dist/esm/utils/ui.d.ts +2 -0
- package/dist/esm/utils/ui.d.ts.map +1 -0
- package/dist/esm/utils/ui.js +14 -0
- package/package.json +5 -2
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import useOnClickOutside, { getEffectiveZIndex } from '../hooks/useOnClickOutside';
|
|
3
3
|
import { LoadingSpinner } from './UiComponents';
|
|
4
|
-
import { useContext, useMemo, useRef, useState } from 'react';
|
|
4
|
+
import { useContext, useMemo, useRef, useState, useEffect } from 'react';
|
|
5
5
|
import { ThemeContext } from '../Context';
|
|
6
|
+
import { createPortal } from 'react-dom';
|
|
7
|
+
import { getScrollableParent } from '../utils/ui';
|
|
6
8
|
/**
|
|
7
9
|
* A robust select component that implements the new minimal Select interface.
|
|
8
10
|
*/
|
|
@@ -30,6 +32,48 @@ export function QuillSelectComponent({ options, value, width, onChange, label, i
|
|
|
30
32
|
const nullLabel = useMemo(() => {
|
|
31
33
|
return sortedItems.some((item) => item.value === '-') ? 'None' : '-';
|
|
32
34
|
}, [sortedItems]);
|
|
35
|
+
const [popoverPosition, setPopoverPosition] = useState(undefined);
|
|
36
|
+
const [z, setZ] = useState(10);
|
|
37
|
+
const scrollableParentRef = useRef(document.body);
|
|
38
|
+
const updatePosition = () => {
|
|
39
|
+
if (buttonRef.current) {
|
|
40
|
+
requestAnimationFrame(() => {
|
|
41
|
+
const rect = buttonRef?.current?.getBoundingClientRect();
|
|
42
|
+
if (rect) {
|
|
43
|
+
const viewportHeight = window.innerHeight;
|
|
44
|
+
const availableHeight = viewportHeight - rect.bottom - 64;
|
|
45
|
+
setPopoverPosition({
|
|
46
|
+
top: rect.bottom + window.scrollY,
|
|
47
|
+
left: rect.left + window.scrollX,
|
|
48
|
+
width: rect.width,
|
|
49
|
+
maxHeight: availableHeight,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
let resizeObserver;
|
|
57
|
+
let mutationObserver;
|
|
58
|
+
if (showModal && buttonRef.current) {
|
|
59
|
+
updatePosition();
|
|
60
|
+
setZ(getEffectiveZIndex(buttonRef.current));
|
|
61
|
+
resizeObserver = new ResizeObserver(() => updatePosition());
|
|
62
|
+
resizeObserver.observe(buttonRef.current);
|
|
63
|
+
mutationObserver = new MutationObserver(() => updatePosition());
|
|
64
|
+
mutationObserver.observe(buttonRef.current, { attributes: true, subtree: true });
|
|
65
|
+
scrollableParentRef.current = getScrollableParent(buttonRef.current);
|
|
66
|
+
scrollableParentRef.current.addEventListener('scroll', updatePosition, { passive: true });
|
|
67
|
+
const handleResize = () => requestAnimationFrame(updatePosition);
|
|
68
|
+
window.addEventListener('resize', handleResize, { passive: true });
|
|
69
|
+
return () => {
|
|
70
|
+
resizeObserver.disconnect();
|
|
71
|
+
mutationObserver.disconnect();
|
|
72
|
+
scrollableParentRef.current.removeEventListener('scroll', updatePosition);
|
|
73
|
+
window.removeEventListener('resize', handleResize);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}, [showModal]);
|
|
33
77
|
return (_jsxs("div", { style: {
|
|
34
78
|
position: 'relative',
|
|
35
79
|
borderRadius: '6px',
|
|
@@ -73,9 +117,14 @@ export function QuillSelectComponent({ options, value, width, onChange, label, i
|
|
|
73
117
|
textOverflow: 'ellipsis',
|
|
74
118
|
whiteSpace: 'nowrap',
|
|
75
119
|
overflow: 'hidden',
|
|
76
|
-
}, children: options.find((elem) => elem.value === value)?.label || 'Select' }), _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", "aria-hidden": "true", "data-slot": "icon", height: 20, width: 20, style: { minHeight: 20, minWidth: 20 }, children: _jsx("path", { fillRule: "evenodd", d: "M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z", clipRule: "evenodd" }) })] }), showModal && (_jsxs("div", { style: {
|
|
120
|
+
}, children: options.find((elem) => elem.value === value)?.label || 'Select' }), _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", "aria-hidden": "true", "data-slot": "icon", height: 20, width: 20, style: { minHeight: 20, minWidth: 20 }, children: _jsx("path", { fillRule: "evenodd", d: "M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z", clipRule: "evenodd" }) })] }), showModal && createPortal(_jsxs("div", { style: {
|
|
77
121
|
position: 'absolute',
|
|
78
|
-
|
|
122
|
+
top: `${popoverPosition?.top ?? 0}px`,
|
|
123
|
+
left: `${popoverPosition?.left ?? 0}px`,
|
|
124
|
+
width: `${popoverPosition?.width ?? 0}px`,
|
|
125
|
+
maxHeight: `${Math.max(popoverPosition?.maxHeight ?? 0, 100)}px`,
|
|
126
|
+
minHeight: options.length > 2 ? 120 : options.length * 40,
|
|
127
|
+
visibility: popoverPosition ? 'visible' : 'hidden',
|
|
79
128
|
display: 'flex',
|
|
80
129
|
flexDirection: 'column',
|
|
81
130
|
boxSizing: 'border-box',
|
|
@@ -85,15 +134,12 @@ export function QuillSelectComponent({ options, value, width, onChange, label, i
|
|
|
85
134
|
borderRadius: 6,
|
|
86
135
|
background: 'white',
|
|
87
136
|
marginTop: 12,
|
|
88
|
-
zIndex:
|
|
89
|
-
|
|
90
|
-
paddingBottom: 6,
|
|
91
|
-
paddingLeft: 6,
|
|
92
|
-
paddingRight: 6,
|
|
137
|
+
zIndex: z,
|
|
138
|
+
padding: 6,
|
|
93
139
|
fontFamily: theme?.fontFamily,
|
|
94
|
-
maxHeight: '50vh',
|
|
95
140
|
overflow: 'scroll',
|
|
96
|
-
|
|
141
|
+
fontSize: 14,
|
|
142
|
+
}, ref: modalRef, "data-portal-ignore": "true", children: [!isLoading && (!hideEmptyOption || !options.length) && (_jsxs("button", { style: {
|
|
97
143
|
display: 'flex',
|
|
98
144
|
alignItems: 'center',
|
|
99
145
|
justifyContent: 'space-between',
|
|
@@ -112,7 +158,6 @@ export function QuillSelectComponent({ options, value, width, onChange, label, i
|
|
|
112
158
|
height: 34,
|
|
113
159
|
minHeight: 34,
|
|
114
160
|
}, className: "quill-option", onClick: () => {
|
|
115
|
-
// Manually create a synthetic ChangeEvent and pass it to callback
|
|
116
161
|
const changeEvent = { target: { value: '' } };
|
|
117
162
|
onChange(changeEvent);
|
|
118
163
|
setShowModal(false);
|
|
@@ -142,7 +187,6 @@ export function QuillSelectComponent({ options, value, width, onChange, label, i
|
|
|
142
187
|
minHeight: 34,
|
|
143
188
|
overflow: 'hidden',
|
|
144
189
|
}, className: "quill-option", onClick: () => {
|
|
145
|
-
// Manually create a synthetic ChangeEvent and pass it to callback
|
|
146
190
|
const changeEvent = { target: { value: option.value } };
|
|
147
191
|
onChange(changeEvent);
|
|
148
192
|
setShowModal(false);
|
|
@@ -157,5 +201,5 @@ export function QuillSelectComponent({ options, value, width, onChange, label, i
|
|
|
157
201
|
textOverflow: 'ellipsis',
|
|
158
202
|
whiteSpace: 'nowrap',
|
|
159
203
|
overflow: 'hidden',
|
|
160
|
-
}, children: option.label ?? '-' })] }, option.label)))) : (_jsx(LoadingSpinner, {}))] }))] }));
|
|
204
|
+
}, children: option.label ?? '-' })] }, option.label)))) : (_jsx(LoadingSpinner, {}))] }), document.body)] }));
|
|
161
205
|
}
|
|
@@ -19,7 +19,7 @@ export function QuillSelectComponentWithCombo({ options, value, width, onChange,
|
|
|
19
19
|
// Sort null to top
|
|
20
20
|
if (searchQuery === '') {
|
|
21
21
|
return options
|
|
22
|
-
|
|
22
|
+
?.sort((a, b) => {
|
|
23
23
|
if (a.value === null) {
|
|
24
24
|
return -1;
|
|
25
25
|
}
|
|
@@ -28,13 +28,13 @@ export function QuillSelectComponentWithCombo({ options, value, width, onChange,
|
|
|
28
28
|
}
|
|
29
29
|
return 0;
|
|
30
30
|
})
|
|
31
|
-
|
|
31
|
+
?.slice(0, 20) ?? [];
|
|
32
32
|
}
|
|
33
33
|
const uuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;
|
|
34
34
|
const isUuid = options?.[0]?.value?.toString()?.match(uuidRegex);
|
|
35
35
|
const isNumber = typeof options?.[0]?.value === 'number';
|
|
36
36
|
return options
|
|
37
|
-
|
|
37
|
+
?.filter((option) => {
|
|
38
38
|
if (!option) {
|
|
39
39
|
return false;
|
|
40
40
|
}
|
|
@@ -48,7 +48,7 @@ export function QuillSelectComponentWithCombo({ options, value, width, onChange,
|
|
|
48
48
|
.replace(/\s+/g, '')
|
|
49
49
|
.includes(searchQuery.toLowerCase().replace(/\s+/g, '')) : false);
|
|
50
50
|
})
|
|
51
|
-
|
|
51
|
+
?.sort((a, b) => {
|
|
52
52
|
if (a.value === null) {
|
|
53
53
|
return -1;
|
|
54
54
|
}
|
|
@@ -57,13 +57,13 @@ export function QuillSelectComponentWithCombo({ options, value, width, onChange,
|
|
|
57
57
|
}
|
|
58
58
|
return 0;
|
|
59
59
|
})
|
|
60
|
-
|
|
60
|
+
?.slice(0, 20) ?? [];
|
|
61
61
|
}, [options, searchQuery]);
|
|
62
62
|
const nullLabel = useMemo(() => {
|
|
63
63
|
return filteredItems.some((item) => item.value === '-') ? 'None' : '-';
|
|
64
64
|
}, [filteredItems]);
|
|
65
65
|
const selectedLabel = useMemo(() => {
|
|
66
|
-
const selectedOption = options
|
|
66
|
+
const selectedOption = options?.find((elem) => elem.value === value);
|
|
67
67
|
return selectedOption && selectedOption.label == '-'
|
|
68
68
|
? nullLabel
|
|
69
69
|
: (selectedOption?.label ?? 'Select');
|
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { TextInputComponentProps } from '../UiComponents';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
selectedColumns:
|
|
8
|
-
|
|
9
|
-
isSelectedAllColumns: any;
|
|
10
|
-
clearAllState: any;
|
|
11
|
-
nameToColumn: any;
|
|
12
|
-
baseAst: any;
|
|
13
|
-
setBaseAst: any;
|
|
14
|
-
pivot: any;
|
|
15
|
-
initialTableName: any;
|
|
16
|
-
defaultAST: any;
|
|
17
|
-
defaultTable: any;
|
|
18
|
-
setPivot: any;
|
|
3
|
+
import { Table } from '../../models/Tables';
|
|
4
|
+
import { ReportBuilderColumn, ReportBuilderTable } from '../../models/ReportBuilder';
|
|
5
|
+
export default function AddColumnModal({ onSave, selectedColumns, schema, schemaLoading, TextInputComponent, SelectColumn, SecondaryButton, Button, ColumnSearchEmptyState, LoadingComponent, }: {
|
|
6
|
+
onSave: (newTables: ReportBuilderTable[], newColumns: ReportBuilderColumn[]) => void;
|
|
7
|
+
selectedColumns: ReportBuilderColumn[];
|
|
8
|
+
schema: Table[];
|
|
19
9
|
schemaLoading?: boolean;
|
|
20
10
|
TextInputComponent: ((props: TextInputComponentProps) => JSX.Element) | React.ForwardRefExoticComponent<TextInputComponentProps & React.RefAttributes<HTMLInputElement>>;
|
|
21
11
|
SelectColumn: (props: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddColumnModal.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/AddColumnModal.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"AddColumnModal.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/AddColumnModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAiBpE,OAAO,EAGL,uBAAuB,EACxB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAEL,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAGpC,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,MAAM,EAEN,eAAe,EACf,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,MAAM,EACN,sBAAoD,EACpD,gBAAwC,GACzC,EAAE;IACD,MAAM,EAAE,CACN,SAAS,EAAE,kBAAkB,EAAE,EAC/B,UAAU,EAAE,mBAAmB,EAAE,KAC9B,IAAI,CAAC;IAEV,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,EACd,CAAC,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC,GACjD,KAAK,CAAC,yBAAyB,CAC7B,uBAAuB,GAAG,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAChE,CAAC;IACN,YAAY,EAAE,CAAC,KAAK,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,MAAM,IAAI,CAAC;QACxB,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;YAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,OAAO,CAAA;SAAE,KAAK,GAAG,CAAC,OAAO,CAAC;KAC5E,KAAK,GAAG,CAAC,OAAO,CAAC;IAClB,eAAe,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC;IACZ,sBAAsB,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IAC1C,gBAAgB,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;CACrC,2CA0UA"}
|
|
@@ -1,14 +1,85 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useRef, useEffect } from 'react';
|
|
2
|
+
import { useState, useRef, useMemo, useEffect } from 'react';
|
|
3
3
|
import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
|
|
4
4
|
import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
|
|
5
5
|
import { CSS as DND_CSS } from '@dnd-kit/utilities';
|
|
6
6
|
import { QuillColumnSearchEmptyState, QuillLoadingComponent, } from '../UiComponents';
|
|
7
7
|
import { snakeAndCamelCaseToTitleCase } from '../../utils/textProcessing';
|
|
8
|
-
|
|
8
|
+
import { JoinType, } from '../../models/ReportBuilder';
|
|
9
|
+
import { getSchemaForeignKeyMapping } from '../../utils/schema';
|
|
10
|
+
export default function AddColumnModal({ onSave,
|
|
11
|
+
// selectedTables,
|
|
12
|
+
selectedColumns, schema, schemaLoading, TextInputComponent, SelectColumn, SecondaryButton, Button, ColumnSearchEmptyState = QuillColumnSearchEmptyState, LoadingComponent = QuillLoadingComponent, }) {
|
|
13
|
+
const [primaryTable, setPrimaryTable] = useState(undefined);
|
|
9
14
|
const [search, setSearch] = useState('');
|
|
10
|
-
const [searchResults, setSearchResults] = useState(orderedColumnNames);
|
|
11
15
|
const textInputContainerRef = useRef(null);
|
|
16
|
+
const [modalSelectedColumns, setModalSelectedColumns] = useState(selectedColumns.map((col) => `${col.table}.${col.field}`));
|
|
17
|
+
const foreignKeyMap = useMemo(() => {
|
|
18
|
+
return getSchemaForeignKeyMapping(schema);
|
|
19
|
+
}, [schema]);
|
|
20
|
+
const columnOptions = schema
|
|
21
|
+
.filter((table) => {
|
|
22
|
+
if (!primaryTable)
|
|
23
|
+
return true;
|
|
24
|
+
return (table.name === primaryTable ||
|
|
25
|
+
foreignKeyMap[primaryTable]?.some((tableInfo) => tableInfo.foreignTable === table.name) ||
|
|
26
|
+
foreignKeyMap[table.name]?.some((tableInfo) => tableInfo.foreignTable === primaryTable));
|
|
27
|
+
})
|
|
28
|
+
.sort((a, b) => {
|
|
29
|
+
// Ensure primaryTable is always first, this is essential for SELECT ALL
|
|
30
|
+
if (primaryTable) {
|
|
31
|
+
if (a.name === primaryTable)
|
|
32
|
+
return -1;
|
|
33
|
+
if (b.name === primaryTable)
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
return 0; // Keep original order otherwise
|
|
37
|
+
})
|
|
38
|
+
.flatMap((table) => table.columns
|
|
39
|
+
.map((col) => `${table.name}.${col.field}`)
|
|
40
|
+
.sort((a, b) => {
|
|
41
|
+
const aIsId = a.endsWith('.id') ||
|
|
42
|
+
a.endsWith('_id') ||
|
|
43
|
+
a.endsWith('Id') ||
|
|
44
|
+
a === 'id';
|
|
45
|
+
const bIsId = b.endsWith('.id') ||
|
|
46
|
+
b.endsWith('_id') ||
|
|
47
|
+
b.endsWith('Id') ||
|
|
48
|
+
b === 'id';
|
|
49
|
+
if (aIsId && !bIsId)
|
|
50
|
+
return 1;
|
|
51
|
+
if (bIsId && !aIsId)
|
|
52
|
+
return -1;
|
|
53
|
+
return 0;
|
|
54
|
+
}));
|
|
55
|
+
const [orderedColumnNames, setOrderedColumnNames] = useState(columnOptions);
|
|
56
|
+
const isSelectedAllColumns = columnOptions.length === modalSelectedColumns.length;
|
|
57
|
+
const duplicateColumnNames = useMemo(() => {
|
|
58
|
+
const columnNames = modalSelectedColumns.map((col) => {
|
|
59
|
+
const [, ...rest] = col.split('.');
|
|
60
|
+
return rest.join('.');
|
|
61
|
+
});
|
|
62
|
+
const duplicates = columnNames.filter((name, i) => columnNames.indexOf(name) !== i);
|
|
63
|
+
return duplicates;
|
|
64
|
+
}, [modalSelectedColumns, schema]);
|
|
65
|
+
const searchResults = useMemo(() => {
|
|
66
|
+
return orderedColumnNames.filter((column) => {
|
|
67
|
+
return (columnOptions.includes(column) &&
|
|
68
|
+
(search.length === 0 ||
|
|
69
|
+
column.toLowerCase().includes(search.toLowerCase()) ||
|
|
70
|
+
snakeAndCamelCaseToTitleCase(column)
|
|
71
|
+
.toLowerCase()
|
|
72
|
+
.includes(search.toLowerCase())));
|
|
73
|
+
});
|
|
74
|
+
}, [search, columnOptions, orderedColumnNames]);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
if (modalSelectedColumns.length === 0) {
|
|
77
|
+
setPrimaryTable(undefined);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
setPrimaryTable(modalSelectedColumns[0]?.split('.')[0]);
|
|
81
|
+
}
|
|
82
|
+
}, [modalSelectedColumns]);
|
|
12
83
|
const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor, {
|
|
13
84
|
coordinateGetter: sortableKeyboardCoordinates,
|
|
14
85
|
}));
|
|
@@ -25,25 +96,6 @@ export default function AddColumnModal({ onSave, orderedColumnNames, setOrderedC
|
|
|
25
96
|
});
|
|
26
97
|
}
|
|
27
98
|
}
|
|
28
|
-
const getColumnsInPivot = () => {
|
|
29
|
-
if (!pivot)
|
|
30
|
-
return [];
|
|
31
|
-
const { valueField, rowField, columnField } = pivot;
|
|
32
|
-
return [valueField, rowField, columnField].filter(Boolean);
|
|
33
|
-
};
|
|
34
|
-
useEffect(() => {
|
|
35
|
-
setSearchResults(orderedColumnNames
|
|
36
|
-
.filter((row) => {
|
|
37
|
-
const [table] = row.split('.');
|
|
38
|
-
const selectedTable = selectedColumns[0]?.split('.')[0];
|
|
39
|
-
return selectedColumns.length === 0 || selectedTable === table;
|
|
40
|
-
})
|
|
41
|
-
.filter((row) => search.length === 0 ||
|
|
42
|
-
row.includes(search) ||
|
|
43
|
-
snakeAndCamelCaseToTitleCase(row)
|
|
44
|
-
.toLowerCase()
|
|
45
|
-
.includes(search.toLowerCase())));
|
|
46
|
-
}, [search, orderedColumnNames, selectedColumns]);
|
|
47
99
|
return (_jsxs("div", { style: {
|
|
48
100
|
display: 'flex',
|
|
49
101
|
flexDirection: 'column',
|
|
@@ -66,11 +118,35 @@ export default function AddColumnModal({ onSave, orderedColumnNames, setOrderedC
|
|
|
66
118
|
gap: 8,
|
|
67
119
|
overflowY: 'auto',
|
|
68
120
|
maxWidth: '400px',
|
|
69
|
-
}, children: [searchResults.map((value) => {
|
|
70
|
-
return (_jsx(SortableItem, { selectedColumns:
|
|
121
|
+
}, children: [searchResults.map((value, index) => {
|
|
122
|
+
return (_jsx(SortableItem, { selectedColumns: modalSelectedColumns, setSelectedColumns: (newSelectedColumns) => {
|
|
123
|
+
if (!primaryTable) {
|
|
124
|
+
setModalSelectedColumns(newSelectedColumns);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// need to check if primary table is in selected columns
|
|
128
|
+
const columnTables = [
|
|
129
|
+
...new Set(newSelectedColumns.map((col) => {
|
|
130
|
+
const [table] = col.split('.');
|
|
131
|
+
return table || '';
|
|
132
|
+
})),
|
|
133
|
+
];
|
|
134
|
+
if (columnTables.includes(primaryTable)) {
|
|
135
|
+
setModalSelectedColumns(newSelectedColumns);
|
|
136
|
+
}
|
|
137
|
+
else if (columnTables.length === 1) {
|
|
138
|
+
setPrimaryTable(columnTables[0]);
|
|
139
|
+
setModalSelectedColumns(newSelectedColumns);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
setPrimaryTable(undefined);
|
|
143
|
+
setModalSelectedColumns([]);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}, id: value, label: value
|
|
71
147
|
.split('.')
|
|
72
148
|
.map((v) => snakeAndCamelCaseToTitleCase(v))
|
|
73
|
-
.join(' | '), SelectColumn: SelectColumn },
|
|
149
|
+
.join(' | '), SelectColumn: SelectColumn }, index));
|
|
74
150
|
}), search.length > 0 && searchResults.length === 0 && (_jsx(ColumnSearchEmptyState, {}))] }) }) })), _jsxs("div", { style: {
|
|
75
151
|
display: 'flex',
|
|
76
152
|
width: '100%',
|
|
@@ -78,50 +154,75 @@ export default function AddColumnModal({ onSave, orderedColumnNames, setOrderedC
|
|
|
78
154
|
gap: 8,
|
|
79
155
|
justifyContent: 'end',
|
|
80
156
|
marginTop: 12,
|
|
81
|
-
}, children: [
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
157
|
+
}, children: [modalSelectedColumns.length > 0 && (_jsx(SecondaryButton, { onClick: () => setModalSelectedColumns([]), label: "Clear" })), modalSelectedColumns.length > 0 && !isSelectedAllColumns && (_jsx(SecondaryButton, { onClick: () => setModalSelectedColumns(columnOptions), label: "Select all" })), _jsx(Button, { onClick: () => {
|
|
158
|
+
const newTableNames = [
|
|
159
|
+
...new Set(modalSelectedColumns
|
|
160
|
+
.map((col) => {
|
|
161
|
+
const [table] = col.split('.');
|
|
162
|
+
return table;
|
|
163
|
+
})
|
|
164
|
+
.filter((table) => table !== undefined)),
|
|
165
|
+
];
|
|
166
|
+
const newTables = newTableNames
|
|
167
|
+
.map((table) => {
|
|
168
|
+
if (primaryTable && primaryTable !== table) {
|
|
169
|
+
const asForeignTable = foreignKeyMap[primaryTable]?.find((tableInfo) => tableInfo.foreignTable === table);
|
|
170
|
+
const asPrimaryTable = foreignKeyMap[table]?.find((tableInfo) => tableInfo.foreignTable === primaryTable);
|
|
171
|
+
const foreignTable = asForeignTable || asPrimaryTable;
|
|
172
|
+
const primaryTableField = asForeignTable?.foreignKey ||
|
|
173
|
+
asPrimaryTable?.foreignTablePrimaryKey;
|
|
174
|
+
const foreignTableField = asForeignTable?.foreignTablePrimaryKey ||
|
|
175
|
+
asPrimaryTable?.foreignKey;
|
|
176
|
+
if (!foreignTable ||
|
|
177
|
+
!primaryTableField ||
|
|
178
|
+
!foreignTableField) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
name: table,
|
|
183
|
+
join: {
|
|
184
|
+
type: JoinType.JOIN,
|
|
185
|
+
condition: {
|
|
186
|
+
operator: '=',
|
|
187
|
+
left: {
|
|
188
|
+
table: primaryTable,
|
|
189
|
+
field: primaryTableField,
|
|
190
|
+
},
|
|
191
|
+
right: {
|
|
192
|
+
table,
|
|
193
|
+
field: foreignTableField,
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
return { name: table };
|
|
94
201
|
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
c.as === col);
|
|
120
|
-
if (pivot &&
|
|
121
|
-
!getColumnsInPivot().every((c) => columnInAST(c))) {
|
|
122
|
-
setPivot(null);
|
|
123
|
-
}
|
|
124
|
-
onSave();
|
|
202
|
+
})
|
|
203
|
+
.filter((table) => table !== null);
|
|
204
|
+
const sortedSelectedColumns = orderedColumnNames.filter((col) => modalSelectedColumns.includes(col));
|
|
205
|
+
const newColumns = sortedSelectedColumns
|
|
206
|
+
.map((col) => {
|
|
207
|
+
const [table, ...rest] = col.split('.');
|
|
208
|
+
const field = rest.join('.');
|
|
209
|
+
if (!table ||
|
|
210
|
+
!field ||
|
|
211
|
+
!newTables.some((t) => t.name === table)) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
return {
|
|
216
|
+
table: table || '',
|
|
217
|
+
field: field || '',
|
|
218
|
+
alias: duplicateColumnNames.includes(field)
|
|
219
|
+
? `${table}_${field}`
|
|
220
|
+
: undefined,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
})
|
|
224
|
+
.filter((col) => col !== null);
|
|
225
|
+
onSave(newTables, newColumns);
|
|
125
226
|
}, label: "Select columns" })] })] }));
|
|
126
227
|
}
|
|
127
228
|
const SortableItem = ({ id, label, setSelectedColumns, selectedColumns, SelectColumn, }) => {
|
|
@@ -131,14 +232,10 @@ const SortableItem = ({ id, label, setSelectedColumns, selectedColumns, SelectCo
|
|
|
131
232
|
transition,
|
|
132
233
|
};
|
|
133
234
|
const handleSelect = () => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
else {
|
|
139
|
-
return [...selectedColumns, id];
|
|
140
|
-
}
|
|
141
|
-
});
|
|
235
|
+
const newSelectedColumns = selectedColumns.includes(id)
|
|
236
|
+
? selectedColumns.filter((column) => column !== id)
|
|
237
|
+
: [...selectedColumns, id];
|
|
238
|
+
setSelectedColumns(newSelectedColumns);
|
|
142
239
|
};
|
|
143
240
|
return (_jsx("div", { style: { userSelect: 'none', ...style }, ref: setNodeRef, children: _jsx(SelectColumn, { isSelected: selectedColumns?.includes(id), setSelected: handleSelect, label: snakeAndCamelCaseToTitleCase(label), DragHandle: (props) => (_jsx("div", { style: {
|
|
144
241
|
cursor: 'grab',
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { ButtonComponentProps, SelectComponentProps } from '../UiComponents';
|
|
2
2
|
import { SortPopoverComponentProps } from './ui';
|
|
3
3
|
import { ColumnInternal } from '../../models/Columns';
|
|
4
|
-
export declare const SortSentence: ({ sortField, sortDirection,
|
|
4
|
+
export declare const SortSentence: ({ sortField, sortDirection, columns, handleDelete, setOpenPopover, onSave, popoverTitle, SortPopover, EditPopover, Select, Button, SecondaryButton, disabled, }: {
|
|
5
5
|
sortField: string;
|
|
6
6
|
sortDirection: string;
|
|
7
7
|
columns: ColumnInternal[];
|
|
8
|
-
setIsPending: any;
|
|
9
|
-
setEditPopoverKey: any;
|
|
10
|
-
setActiveEditItem: any;
|
|
11
8
|
setOpenPopover: any;
|
|
12
|
-
keyPrefix?: any;
|
|
13
9
|
handleDelete: any;
|
|
14
10
|
onSave: any;
|
|
15
11
|
popoverTitle?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddSortPopover.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/AddSortPopover.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EAGpB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAStD,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"AddSortPopover.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/AddSortPopover.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EAGpB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAStD,eAAO,MAAM,YAAY,oKActB;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC;IACpB,YAAY,EAAE,GAAG,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC/D,WAAW,EAAE,GAAG,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IACtD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,mDA6CA,CAAC;AAEF,eAAO,MAAM,cAAc,+FAUxB;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IACtD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;CAChE,4CAmEA,CAAC"}
|
|
@@ -9,22 +9,15 @@ const SORT_VALUE_TO_LABEL = {
|
|
|
9
9
|
asc: 'ascending',
|
|
10
10
|
desc: 'descending',
|
|
11
11
|
};
|
|
12
|
-
export const SortSentence = ({ sortField, sortDirection,
|
|
12
|
+
export const SortSentence = ({ sortField, sortDirection, columns, handleDelete, setOpenPopover, onSave, popoverTitle = 'Edit Sort', SortPopover, EditPopover, Select = QuillSelectComponent, Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, disabled = false, }) => {
|
|
13
13
|
const [isOpen, setIsOpen] = useState(false);
|
|
14
14
|
const handleSetIsOpen = (isOpen) => {
|
|
15
15
|
setIsOpen(isOpen);
|
|
16
|
-
if (!isOpen) {
|
|
17
|
-
setIsPending(false);
|
|
18
|
-
setActiveEditItem(null);
|
|
19
|
-
}
|
|
20
16
|
};
|
|
21
17
|
const handleClickDelete = (e) => {
|
|
22
18
|
e.stopPropagation(); // don't call onClick handler
|
|
23
|
-
setIsPending(false);
|
|
24
|
-
handleDelete(keyPrefix);
|
|
25
|
-
setActiveEditItem(null);
|
|
26
19
|
setOpenPopover(null);
|
|
27
|
-
|
|
20
|
+
handleDelete();
|
|
28
21
|
};
|
|
29
22
|
if (!sortField) {
|
|
30
23
|
return null;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReportBuilderColumn } from '../../models/ReportBuilder';
|
|
2
|
+
interface DraggableColumnsProps {
|
|
3
|
+
columns: ReportBuilderColumn[];
|
|
4
|
+
onColumnOrderChange: (newOrder: ReportBuilderColumn[]) => void;
|
|
5
|
+
DraggableColumnComponent: (props: {
|
|
6
|
+
label: string;
|
|
7
|
+
onDelete: () => void;
|
|
8
|
+
DragHandle: ({ dragIcon }: {
|
|
9
|
+
dragIcon: () => JSX.Element;
|
|
10
|
+
}) => JSX.Element;
|
|
11
|
+
deleteDisabled?: boolean;
|
|
12
|
+
}) => JSX.Element;
|
|
13
|
+
loading: boolean;
|
|
14
|
+
}
|
|
15
|
+
export default function DraggableColumns({ columns, onColumnOrderChange, DraggableColumnComponent, loading, }: DraggableColumnsProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=DraggableColumns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DraggableColumns.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/DraggableColumns.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,UAAU,qBAAqB;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,mBAAmB,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAC/D,wBAAwB,EAAE,CAAC,KAAK,EAAE;QAChC,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,IAAI,CAAC;QACrB,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;YAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,OAAO,CAAA;SAAE,KAAK,GAAG,CAAC,OAAO,CAAC;QAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,KAAK,GAAG,CAAC,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,OAAO,EACP,mBAAmB,EACnB,wBAAwB,EACxB,OAAO,GACR,EAAE,qBAAqB,2CAmFvB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { closestCenter, DndContext, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
|
|
3
|
+
import DraggableItem from './DraggableItem';
|
|
4
|
+
import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, } from '@dnd-kit/sortable';
|
|
5
|
+
import { useMemo } from 'react';
|
|
6
|
+
import { snakeAndCamelCaseToTitleCase } from '../../utils/textProcessing';
|
|
7
|
+
export default function DraggableColumns({ columns, onColumnOrderChange, DraggableColumnComponent, loading, }) {
|
|
8
|
+
const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor, {
|
|
9
|
+
coordinateGetter: sortableKeyboardCoordinates,
|
|
10
|
+
}));
|
|
11
|
+
const columnNames = useMemo(() => {
|
|
12
|
+
return columns.map((col) => `${col.table}.${col.alias ?? col.field}`);
|
|
13
|
+
}, [columns]);
|
|
14
|
+
// const [orderedColumnNames, setOrderedColumnNames] = useState<string[]>([]);
|
|
15
|
+
const columnNameToLabel = (columnName) => {
|
|
16
|
+
return snakeAndCamelCaseToTitleCase(columnName.split('.').pop() ?? '');
|
|
17
|
+
};
|
|
18
|
+
// When a drag event ends, switch the item order.
|
|
19
|
+
function handleDragEnd(event) {
|
|
20
|
+
const { active, over } = event;
|
|
21
|
+
if (!active || !over)
|
|
22
|
+
return;
|
|
23
|
+
if (active.id !== over.id) {
|
|
24
|
+
const oldIndex = columnNames.findIndex((c) => c.endsWith(active.id));
|
|
25
|
+
const newIndex = columnNames.findIndex((c) => c.endsWith(over.id));
|
|
26
|
+
const newOrder = arrayMove(columnNames, oldIndex, newIndex);
|
|
27
|
+
const orderToColumns = newOrder
|
|
28
|
+
.map((name) => {
|
|
29
|
+
const [table, field] = name.split('.');
|
|
30
|
+
return columns.find((col) => col.table === table &&
|
|
31
|
+
(col.alias ? col.alias === field : col.field === field));
|
|
32
|
+
})
|
|
33
|
+
.filter((col) => col !== undefined);
|
|
34
|
+
onColumnOrderChange(orderToColumns);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function onDeleteColumn(columnName) {
|
|
38
|
+
const newColumns = columns.filter((col) => `${col.table}.${col.alias ?? col.field}` !== columnName);
|
|
39
|
+
onColumnOrderChange(newColumns);
|
|
40
|
+
}
|
|
41
|
+
return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: columnNames, strategy: verticalListSortingStrategy, children: _jsxs("div", { style: {
|
|
42
|
+
display: 'flex',
|
|
43
|
+
flexDirection: 'column',
|
|
44
|
+
gap: 8,
|
|
45
|
+
}, children: [columnNames.map((name) => (_jsx(DraggableItem, { id: name, label: columnNameToLabel(name), onDelete: () => !loading && onDeleteColumn(name), loading: loading, DraggableColumnComponent: DraggableColumnComponent }, name))), columnNames.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
|
|
46
|
+
}
|