@quillsql/react 2.12.46 → 2.12.47
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 +16 -7
- package/dist/cjs/ChartBuilder.d.ts +10 -11
- package/dist/cjs/ChartBuilder.d.ts.map +1 -1
- package/dist/cjs/ChartBuilder.js +78 -81
- package/dist/cjs/ChartEditor.d.ts +3 -1
- package/dist/cjs/ChartEditor.d.ts.map +1 -1
- package/dist/cjs/ChartEditor.js +26 -10
- package/dist/cjs/Context.d.ts +2 -3
- package/dist/cjs/Context.d.ts.map +1 -1
- package/dist/cjs/Context.js +42 -28
- package/dist/cjs/Dashboard.d.ts +12 -12
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +61 -69
- package/dist/cjs/QuillProvider.d.ts +2 -0
- package/dist/cjs/QuillProvider.d.ts.map +1 -1
- package/dist/cjs/QuillProvider.js +1 -15
- package/dist/cjs/ReportBuilder.d.ts +9 -9
- package/dist/cjs/ReportBuilder.d.ts.map +1 -1
- package/dist/cjs/ReportBuilder.js +116 -179
- package/dist/cjs/SQLEditor.d.ts +20 -11
- package/dist/cjs/SQLEditor.d.ts.map +1 -1
- package/dist/cjs/SQLEditor.js +157 -90
- package/dist/cjs/Table.js +3 -3
- package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/BarChart.js +6 -25
- package/dist/cjs/components/Chart/BarList.js +1 -1
- package/dist/cjs/components/Chart/ChartError.d.ts +5 -2
- package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/cjs/components/Chart/ChartError.js +7 -10
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +16 -1
- package/dist/cjs/components/Chart/PieChart.js +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/ChartComponent.js +46 -47
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +2 -1
- package/dist/cjs/components/Dashboard/DataLoader.d.ts +2 -2
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +19 -13
- package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/MetricComponent.js +16 -26
- package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/TableComponent.js +16 -25
- package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/cjs/components/QuillMultiSelectWithCombo.js +31 -1
- package/dist/cjs/components/QuillSelect.js +1 -1
- package/dist/cjs/components/QuillTable.d.ts +1 -1
- package/dist/cjs/components/QuillTable.d.ts.map +1 -1
- package/dist/cjs/components/QuillTable.js +115 -105
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +3 -3
- package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddColumnModal.js +2 -2
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +2 -2
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +28 -9
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/FilterModal.js +178 -114
- package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/convert.js +1 -2
- package/dist/cjs/components/ReportBuilder/ui.d.ts +9 -1
- package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/ui.js +37 -3
- package/dist/cjs/components/ReportBuilder/util.d.ts +5 -1
- package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/cjs/components/ReportBuilder/util.js +26 -12
- package/dist/cjs/components/UiComponents.d.ts +17 -3
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +160 -29
- package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useAskQuill.js +7 -7
- package/dist/cjs/hooks/useAstToFilterTree.d.ts +4 -1
- package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -1
- package/dist/cjs/hooks/useAstToFilterTree.js +4 -1
- package/dist/cjs/hooks/useDashboard.d.ts +5 -1
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +28 -4
- package/dist/cjs/hooks/useOnClickOutside.js +2 -2
- package/dist/cjs/hooks/useQuill.js +4 -4
- package/dist/cjs/hooks/useVirtualTables.d.ts +10 -0
- package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -0
- package/dist/cjs/hooks/useVirtualTables.js +29 -0
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +4 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +45 -21
- package/dist/cjs/models/Client.d.ts +3 -0
- package/dist/cjs/models/Client.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/Schema.d.ts +7 -0
- package/dist/cjs/models/Schema.d.ts.map +1 -0
- package/dist/cjs/models/Schema.js +2 -0
- package/dist/cjs/models/Tables.d.ts +2 -0
- 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 +47 -44
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/astProcessing.js +8 -8
- package/dist/cjs/utils/client.d.ts.map +1 -1
- package/dist/cjs/utils/client.js +1 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/columnProcessing.js +88 -5
- package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
- package/dist/cjs/utils/dataFetcher.js +7 -3
- package/dist/cjs/utils/filterProcessing.d.ts +25 -0
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +121 -1
- package/dist/cjs/utils/paginationProcessing.js +2 -2
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +10 -6
- package/dist/cjs/utils/queryConstructor.d.ts +1 -0
- package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/queryConstructor.js +37 -11
- package/dist/cjs/utils/report.d.ts +5 -0
- package/dist/cjs/utils/report.d.ts.map +1 -1
- package/dist/cjs/utils/report.js +63 -9
- package/dist/cjs/utils/schema.js +22 -20
- package/dist/cjs/utils/tableProcessing.d.ts +1 -0
- package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/tableProcessing.js +22 -1
- package/dist/cjs/utils/validation.d.ts.map +1 -1
- package/dist/cjs/utils/validation.js +4 -0
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +17 -8
- package/dist/esm/ChartBuilder.d.ts +10 -11
- package/dist/esm/ChartBuilder.d.ts.map +1 -1
- package/dist/esm/ChartBuilder.js +81 -84
- package/dist/esm/ChartEditor.d.ts +3 -1
- package/dist/esm/ChartEditor.d.ts.map +1 -1
- package/dist/esm/ChartEditor.js +27 -11
- package/dist/esm/Context.d.ts +2 -3
- package/dist/esm/Context.d.ts.map +1 -1
- package/dist/esm/Context.js +42 -28
- package/dist/esm/Dashboard.d.ts +12 -12
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +63 -71
- package/dist/esm/QuillProvider.d.ts +2 -0
- package/dist/esm/QuillProvider.d.ts.map +1 -1
- package/dist/esm/QuillProvider.js +2 -16
- package/dist/esm/ReportBuilder.d.ts +9 -9
- package/dist/esm/ReportBuilder.d.ts.map +1 -1
- package/dist/esm/ReportBuilder.js +122 -185
- package/dist/esm/SQLEditor.d.ts +20 -11
- package/dist/esm/SQLEditor.d.ts.map +1 -1
- package/dist/esm/SQLEditor.js +160 -93
- package/dist/esm/Table.js +4 -4
- package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/BarChart.js +7 -26
- package/dist/esm/components/Chart/BarList.js +1 -1
- package/dist/esm/components/Chart/ChartError.d.ts +5 -2
- package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
- package/dist/esm/components/Chart/ChartError.js +7 -10
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +16 -1
- package/dist/esm/components/Chart/PieChart.js +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/ChartComponent.js +46 -47
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +2 -1
- package/dist/esm/components/Dashboard/DataLoader.d.ts +2 -2
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +20 -14
- package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/MetricComponent.js +16 -26
- package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/TableComponent.js +16 -25
- package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
- package/dist/esm/components/QuillMultiSelectWithCombo.js +31 -1
- package/dist/esm/components/QuillSelect.js +1 -1
- package/dist/esm/components/QuillTable.d.ts +1 -1
- package/dist/esm/components/QuillTable.d.ts.map +1 -1
- package/dist/esm/components/QuillTable.js +115 -105
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +3 -3
- package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddColumnModal.js +2 -2
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +2 -2
- package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/AddLimitPopover.js +28 -9
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/FilterModal.js +178 -114
- package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/convert.js +1 -2
- package/dist/esm/components/ReportBuilder/ui.d.ts +9 -1
- package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/ui.js +38 -4
- package/dist/esm/components/ReportBuilder/util.d.ts +5 -1
- package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
- package/dist/esm/components/ReportBuilder/util.js +26 -12
- package/dist/esm/components/UiComponents.d.ts +17 -3
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +158 -28
- package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useAskQuill.js +8 -8
- package/dist/esm/hooks/useAstToFilterTree.d.ts +4 -1
- package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -1
- package/dist/esm/hooks/useAstToFilterTree.js +4 -1
- package/dist/esm/hooks/useDashboard.d.ts +5 -1
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +28 -5
- package/dist/esm/hooks/useOnClickOutside.js +2 -2
- package/dist/esm/hooks/useQuill.js +5 -5
- package/dist/esm/hooks/useVirtualTables.d.ts +10 -0
- package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -0
- package/dist/esm/hooks/useVirtualTables.js +25 -0
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/esm/internals/ReportBuilder/PivotModal.js +44 -23
- package/dist/esm/models/Client.d.ts +3 -0
- package/dist/esm/models/Client.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/Schema.d.ts +7 -0
- package/dist/esm/models/Schema.d.ts.map +1 -0
- package/dist/esm/models/Schema.js +1 -0
- package/dist/esm/models/Tables.d.ts +2 -0
- 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 +45 -43
- package/dist/esm/utils/astProcessing.d.ts.map +1 -1
- package/dist/esm/utils/astProcessing.js +8 -8
- package/dist/esm/utils/client.d.ts.map +1 -1
- package/dist/esm/utils/client.js +1 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
- package/dist/esm/utils/columnProcessing.js +88 -5
- package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
- package/dist/esm/utils/dataFetcher.js +7 -3
- package/dist/esm/utils/filterProcessing.d.ts +25 -0
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +116 -0
- package/dist/esm/utils/paginationProcessing.js +2 -2
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +10 -6
- package/dist/esm/utils/queryConstructor.d.ts +1 -0
- package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
- package/dist/esm/utils/queryConstructor.js +35 -10
- package/dist/esm/utils/report.d.ts +5 -0
- package/dist/esm/utils/report.d.ts.map +1 -1
- package/dist/esm/utils/report.js +61 -8
- package/dist/esm/utils/schema.js +22 -20
- package/dist/esm/utils/tableProcessing.d.ts +1 -0
- package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
- package/dist/esm/utils/tableProcessing.js +21 -1
- package/dist/esm/utils/validation.d.ts.map +1 -1
- package/dist/esm/utils/validation.js +4 -0
- package/package.json +3 -1
|
@@ -11,32 +11,20 @@ import { getType } from '../../utils/filterProcessing';
|
|
|
11
11
|
* Modal for adding, editing, and deleting Filters
|
|
12
12
|
*/
|
|
13
13
|
export default function FilterModal({ schema, filter, fieldValuesMap, customOperatorOptions, onSubmitFilter, onDeleteFilter, ButtonComponent, SelectComponent, TextInputComponent, SecondaryButtonComponent, MultiSelectComponent, }) {
|
|
14
|
-
const [field, setField] = useState(
|
|
14
|
+
const [field, setField] = useState('');
|
|
15
15
|
const [fieldOptions, setFieldOptions] = useState([]);
|
|
16
16
|
const [fieldValues, setFieldValues] = useState([]);
|
|
17
|
-
const [type, setType] = useState(
|
|
18
|
-
const [value, setValue] = useState(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
: filter.value
|
|
22
|
-
: undefined);
|
|
23
|
-
const [selectedOptions, setSelectedOptions] = useState(filter && filter.filterType === 'string-in-filter'
|
|
24
|
-
? filter.value.map((val) => {
|
|
25
|
-
return { label: val, value: val };
|
|
26
|
-
})
|
|
27
|
-
: []);
|
|
28
|
-
const [operator, setOperator] = useState(filter ? filter.operator : '');
|
|
17
|
+
const [type, setType] = useState('');
|
|
18
|
+
const [value, setValue] = useState(undefined);
|
|
19
|
+
const [selectedOptions, setSelectedOptions] = useState([]);
|
|
20
|
+
const [operator, setOperator] = useState('');
|
|
29
21
|
const [operatorOptions, setOperatorOptions] = useState([]);
|
|
30
|
-
const [unit, setUnit] = useState(
|
|
22
|
+
const [unit, setUnit] = useState('');
|
|
31
23
|
const [unitOptions, setUnitOptions] = useState([]);
|
|
32
|
-
const [startDate, setStartDate] = useState(
|
|
33
|
-
|
|
34
|
-
: startOfToday().toISOString().substring(0, 10));
|
|
35
|
-
const [endDate, setEndDate] = useState(filter && filter.value?.endDate
|
|
36
|
-
? filter.value.endDate.substring(0, 10)
|
|
37
|
-
: startOfToday().toISOString().substring(0, 10));
|
|
24
|
+
const [startDate, setStartDate] = useState(startOfToday().toISOString().substring(0, 10));
|
|
25
|
+
const [endDate, setEndDate] = useState(startOfToday().toISOString().substring(0, 10));
|
|
38
26
|
const [filterInitialized, setFilterInitialized] = useState(false);
|
|
39
|
-
const [table, setTable] = useState(
|
|
27
|
+
const [table, setTable] = useState(undefined);
|
|
40
28
|
// Define all supported operator options for each field type
|
|
41
29
|
const allOperatorOptions = {
|
|
42
30
|
[FieldTypes.Number]: [
|
|
@@ -80,6 +68,20 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
80
68
|
// Effect hook to initialize or update fieldValues based on selected field
|
|
81
69
|
useEffect(() => {
|
|
82
70
|
if (filter) {
|
|
71
|
+
setField(filter.field);
|
|
72
|
+
onFieldChange(filter.field, fieldOptions);
|
|
73
|
+
setType(filter.filterType);
|
|
74
|
+
onTypeChange(filter.filterType);
|
|
75
|
+
setValue(filter.filterType === 'date-filter' ? filter.value.value : filter.value);
|
|
76
|
+
setOperator(filter.operator);
|
|
77
|
+
onOperatorChange(filter.operator);
|
|
78
|
+
setUnit(filter.filterType === 'date-filter' ? filter.value.unit : '');
|
|
79
|
+
setStartDate(filter.value?.startDate
|
|
80
|
+
? filter.value.startDate.substring(0, 10)
|
|
81
|
+
: startOfToday().toISOString().substring(0, 10));
|
|
82
|
+
setEndDate(filter.value?.endDate
|
|
83
|
+
? filter.value.endDate.substring(0, 10)
|
|
84
|
+
: startOfToday().toISOString().substring(0, 10));
|
|
83
85
|
if (filter.filterType === 'string-in-filter') {
|
|
84
86
|
setSelectedOptions(filter.value.map((val) => {
|
|
85
87
|
return { label: val, value: val };
|
|
@@ -100,33 +102,14 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
100
102
|
setFieldOptions(fo);
|
|
101
103
|
if (!filter && fo.length > 0 && fo[0]) {
|
|
102
104
|
setField(fo[0].name);
|
|
105
|
+
onFieldChange(fo[0].name, fo);
|
|
103
106
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// Effect hook to update UI when field selection changes
|
|
107
|
-
useEffect(() => {
|
|
108
|
-
if (field !== '') {
|
|
109
|
-
const selectedOption = fieldOptions.find((option) => option.name === field);
|
|
110
|
-
if (selectedOption) {
|
|
111
|
-
const fv = getFieldValues(selectedOption.name, selectedOption.table);
|
|
112
|
-
setFieldValues(fv);
|
|
113
|
-
if (!selectedOptions.every((item) => fv
|
|
114
|
-
.map((v) => v.toLowerCase())
|
|
115
|
-
.includes(item.value.toLowerCase()))) {
|
|
116
|
-
setSelectedOptions([]);
|
|
117
|
-
}
|
|
118
|
-
setType(getType(selectedOption.type));
|
|
119
|
-
setTable(selectedOption.table);
|
|
107
|
+
else {
|
|
108
|
+
onFieldChange(field !== '' ? field : filter?.field ?? '', fo);
|
|
120
109
|
}
|
|
121
110
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
setFieldValues([]);
|
|
125
|
-
setSelectedOptions([]);
|
|
126
|
-
}
|
|
127
|
-
}, [field, fieldOptions]);
|
|
128
|
-
// Effect hook to update operator options based on selected field type
|
|
129
|
-
useEffect(() => {
|
|
111
|
+
}, [schema]);
|
|
112
|
+
function onTypeChange(type) {
|
|
130
113
|
if (type) {
|
|
131
114
|
const options = customOperatorOptions?.[type] ?? allOperatorOptions[type];
|
|
132
115
|
if (options) {
|
|
@@ -135,18 +118,22 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
135
118
|
switch (type) {
|
|
136
119
|
case 'string':
|
|
137
120
|
setOperator(StringOperator.Is);
|
|
121
|
+
onOperatorChange(StringOperator.Is);
|
|
138
122
|
setValue('');
|
|
139
123
|
break;
|
|
140
124
|
case 'date':
|
|
141
125
|
setOperator(DateOperator.InTheLast);
|
|
126
|
+
onOperatorChange(DateOperator.InTheLast);
|
|
142
127
|
setValue('90');
|
|
143
128
|
break;
|
|
144
129
|
case 'number':
|
|
145
130
|
setOperator(NumberOperator.EqualTo);
|
|
131
|
+
onOperatorChange(NumberOperator.EqualTo);
|
|
146
132
|
setValue('0');
|
|
147
133
|
break;
|
|
148
134
|
case 'boolean':
|
|
149
135
|
setOperator(BoolOperator.EqualTo);
|
|
136
|
+
onOperatorChange(BoolOperator.EqualTo);
|
|
150
137
|
setValue(true);
|
|
151
138
|
break;
|
|
152
139
|
}
|
|
@@ -159,31 +146,94 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
159
146
|
else {
|
|
160
147
|
setOperatorOptions([]);
|
|
161
148
|
setOperator('');
|
|
162
|
-
|
|
149
|
+
onOperatorChange('');
|
|
163
150
|
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
useEffect(() => {
|
|
151
|
+
}
|
|
152
|
+
function onOperatorChange(operator) {
|
|
167
153
|
if (operator === '') {
|
|
168
154
|
setValue('');
|
|
169
155
|
}
|
|
170
156
|
if (typeof value !== 'string' &&
|
|
171
157
|
typeof value !== 'number' &&
|
|
172
158
|
typeof value !== 'boolean' &&
|
|
173
|
-
operator !== DateOperator.Custom
|
|
159
|
+
operator !== DateOperator.Custom &&
|
|
160
|
+
(filterInitialized || !filter)) {
|
|
174
161
|
setValue('');
|
|
175
162
|
}
|
|
163
|
+
else if (type === FieldTypes.Date &&
|
|
164
|
+
[
|
|
165
|
+
DateOperator.GreaterThan,
|
|
166
|
+
DateOperator.GreaterThanOrEqualTo,
|
|
167
|
+
DateOperator.EqualTo,
|
|
168
|
+
DateOperator.LessThan,
|
|
169
|
+
DateOperator.LessThanOrEqualTo,
|
|
170
|
+
DateOperator.NotEqualTo,
|
|
171
|
+
].includes(operator) &&
|
|
172
|
+
!isValid(parse(value, 'yyyy-mm-dd', new Date())) &&
|
|
173
|
+
(filterInitialized || !filter)) {
|
|
174
|
+
setValue(startOfToday().toISOString().substring(0, 10));
|
|
175
|
+
}
|
|
176
|
+
else if (type === FieldTypes.Date &&
|
|
177
|
+
[
|
|
178
|
+
DateOperator.InTheLast,
|
|
179
|
+
DateOperator.InTheCurrent,
|
|
180
|
+
DateOperator.InThePrevious,
|
|
181
|
+
].includes(operator) &&
|
|
182
|
+
(value === '' || (typeof value !== 'number' && isNaN(Number(value)))) &&
|
|
183
|
+
(filterInitialized || !filter)) {
|
|
184
|
+
setValue('90');
|
|
185
|
+
}
|
|
176
186
|
const options = getUnits(operator);
|
|
177
187
|
setUnitOptions(options);
|
|
178
|
-
if (
|
|
188
|
+
if (unit === '' && options.length > 0) {
|
|
189
|
+
setUnit(TimeUnit.Day);
|
|
190
|
+
}
|
|
191
|
+
else if (!options || !options.includes(unit)) {
|
|
179
192
|
setUnit('');
|
|
180
193
|
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (
|
|
184
|
-
|
|
194
|
+
}
|
|
195
|
+
function onFieldChange(field, fieldOptions) {
|
|
196
|
+
if (field !== '') {
|
|
197
|
+
const selectedOption = fieldOptions.find((option) => option.name === field);
|
|
198
|
+
if (selectedOption) {
|
|
199
|
+
const fieldValues = getFieldValues(selectedOption.name, selectedOption.table);
|
|
200
|
+
if (filterInitialized || !filter) {
|
|
201
|
+
if (!selectedOptions.every((item) => fieldValues
|
|
202
|
+
.map((v) => v.toLowerCase())
|
|
203
|
+
.includes(item.value.toLowerCase()))) {
|
|
204
|
+
setSelectedOptions([]);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
const preSelected = Array.isArray(filter.value)
|
|
209
|
+
? filter.value.map((val) => {
|
|
210
|
+
return { label: val, value: val };
|
|
211
|
+
})
|
|
212
|
+
: [];
|
|
213
|
+
// if a filter comes with invalid choices, include them anyway
|
|
214
|
+
const valuesSet = new Set(fieldValues.map((v) => v.toLowerCase()));
|
|
215
|
+
preSelected.forEach((option) => {
|
|
216
|
+
if (!valuesSet.has(option.value.toLowerCase())) {
|
|
217
|
+
valuesSet.add(option.value.toLowerCase());
|
|
218
|
+
fieldValues.push(option.value);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
setFieldValues(fieldValues);
|
|
223
|
+
setType(getType(selectedOption.type));
|
|
224
|
+
onTypeChange(getType(selectedOption.type));
|
|
225
|
+
if (selectedOption.table !== '') {
|
|
226
|
+
setTable(selectedOption.table);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
185
229
|
}
|
|
186
|
-
|
|
230
|
+
else {
|
|
231
|
+
setType('');
|
|
232
|
+
onTypeChange('');
|
|
233
|
+
setFieldValues([]);
|
|
234
|
+
setSelectedOptions([]);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
187
237
|
// Function that returns the list of units used for certain DateOperators
|
|
188
238
|
const getUnits = (operator) => {
|
|
189
239
|
switch (operator) {
|
|
@@ -228,7 +278,17 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
228
278
|
// Handler for operator selection change
|
|
229
279
|
const handleOperatorChange = (event) => {
|
|
230
280
|
const newOp = event.target.value;
|
|
231
|
-
|
|
281
|
+
if (typeof newOp === 'string') {
|
|
282
|
+
setOperator(newOp);
|
|
283
|
+
onOperatorChange(newOp);
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
const handleFieldChange = (event) => {
|
|
287
|
+
const newField = event.target.value;
|
|
288
|
+
if (typeof newField === 'string' && newField !== field) {
|
|
289
|
+
setField(newField);
|
|
290
|
+
onFieldChange(newField, fieldOptions);
|
|
291
|
+
}
|
|
232
292
|
};
|
|
233
293
|
// Handler for date range selection
|
|
234
294
|
const handleDateRangeSelect = (date) => {
|
|
@@ -241,6 +301,7 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
241
301
|
}
|
|
242
302
|
}
|
|
243
303
|
setOperator(DateOperator.Custom);
|
|
304
|
+
onOperatorChange(DateOperator.Custom);
|
|
244
305
|
};
|
|
245
306
|
// Handler for form submission
|
|
246
307
|
const handleSubmit = () => {
|
|
@@ -258,7 +319,9 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
258
319
|
switch (operator) {
|
|
259
320
|
case DateOperator.InTheLast:
|
|
260
321
|
case DateOperator.InThePrevious:
|
|
261
|
-
if (
|
|
322
|
+
if (value === undefined ||
|
|
323
|
+
value === '' ||
|
|
324
|
+
(typeof value !== 'number' && isNaN(Number(value)))) {
|
|
262
325
|
alert('Please specify a valid number');
|
|
263
326
|
return;
|
|
264
327
|
}
|
|
@@ -366,7 +429,7 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
366
429
|
});
|
|
367
430
|
break;
|
|
368
431
|
default:
|
|
369
|
-
if (typeof value !== 'string') {
|
|
432
|
+
if (typeof value !== 'string' || value === '') {
|
|
370
433
|
alert('Please specify a valid string');
|
|
371
434
|
return;
|
|
372
435
|
}
|
|
@@ -444,6 +507,9 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
444
507
|
const handleDelete = () => {
|
|
445
508
|
onDeleteFilter();
|
|
446
509
|
};
|
|
510
|
+
if (filter && !filterInitialized) {
|
|
511
|
+
return null; // prevent flashing
|
|
512
|
+
}
|
|
447
513
|
return (_jsxs("div", { style: {
|
|
448
514
|
display: 'flex',
|
|
449
515
|
flexDirection: 'column',
|
|
@@ -459,7 +525,7 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
459
525
|
gap: '20px',
|
|
460
526
|
flexDirection: 'row',
|
|
461
527
|
width: '100%',
|
|
462
|
-
}, children: [_jsx("div", { style: { display: 'flex', gap: 20 }, children: _jsx(SelectComponent, { value: field, width: 200, onChange:
|
|
528
|
+
}, children: [_jsx("div", { style: { display: 'flex', gap: 20 }, children: _jsx(SelectComponent, { value: field, width: 200, onChange: handleFieldChange, options: [
|
|
463
529
|
...fieldOptions.map((option) => ({
|
|
464
530
|
value: option.name,
|
|
465
531
|
label: option.table !== ''
|
|
@@ -474,33 +540,33 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
474
540
|
? `${operator} one of`
|
|
475
541
|
: operator,
|
|
476
542
|
})),
|
|
477
|
-
] }) })),
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
543
|
+
] }) })), (() => {
|
|
544
|
+
switch (operator) {
|
|
545
|
+
case BoolOperator.EqualTo:
|
|
546
|
+
case BoolOperator.NotEqualTo:
|
|
547
|
+
case StringOperator.IsExactly:
|
|
548
|
+
case StringOperator.IsNotExactly:
|
|
549
|
+
case StringOperator.Contains:
|
|
550
|
+
case NumberOperator.EqualTo:
|
|
551
|
+
case NumberOperator.NotEqualTo:
|
|
552
|
+
case NumberOperator.GreaterThan:
|
|
553
|
+
case NumberOperator.LessThan:
|
|
554
|
+
case NumberOperator.GreaterThanOrEqualTo:
|
|
555
|
+
case NumberOperator.LessThanOrEqualTo:
|
|
556
|
+
if (type === 'boolean') {
|
|
557
|
+
return (_jsx("div", { style: { display: 'flex', gap: 20 }, children: _jsx(SelectComponent, { value: value, width: 200, onChange: (event) => setValue(event.target.value), options: [
|
|
492
558
|
{ value: true, label: 'true' },
|
|
493
559
|
{ value: false, label: 'false' },
|
|
494
|
-
] }));
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
560
|
+
] }) }));
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
return (_jsx("div", { style: { display: 'flex', gap: 20 }, children: _jsx(TextInputComponent, { value: value, width: 120, onChange: (event) => {
|
|
498
564
|
setValue(event.target.value);
|
|
499
|
-
} }));
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
565
|
+
} }) }));
|
|
566
|
+
}
|
|
567
|
+
case StringOperator.Is:
|
|
568
|
+
case StringOperator.IsNot:
|
|
569
|
+
return (_jsx("div", { style: { display: 'flex', gap: 20 }, children: _jsx(MultiSelectComponent, { options: fieldValues.map((v) => {
|
|
504
570
|
return { value: v.toLowerCase(), label: v };
|
|
505
571
|
}), width: 200, value: selectedOptions.map((val) => val.value.toLowerCase()), onChange: (e) => {
|
|
506
572
|
if (e.target.value === '') {
|
|
@@ -518,9 +584,9 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
518
584
|
};
|
|
519
585
|
});
|
|
520
586
|
setSelectedOptions(jsonValue);
|
|
521
|
-
} }));
|
|
522
|
-
|
|
523
|
-
|
|
587
|
+
} }) }));
|
|
588
|
+
case DateOperator.Custom:
|
|
589
|
+
return (_jsx("div", { style: { display: 'flex', gap: 20 }, children: _jsx(QuillDateRangePicker, { dateRange: {
|
|
524
590
|
startDate: startDate
|
|
525
591
|
? new Date(startDate + 'T00:00:00')
|
|
526
592
|
: startOfToday(),
|
|
@@ -532,37 +598,35 @@ export default function FilterModal({ schema, filter, fieldValuesMap, customOper
|
|
|
532
598
|
from: value.startDate,
|
|
533
599
|
to: value.endDate,
|
|
534
600
|
});
|
|
535
|
-
} }));
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
// { value: 'Select', label: 'Select' },
|
|
542
|
-
...unitOptions.map((unit) => ({
|
|
543
|
-
value: unit,
|
|
544
|
-
label: `${unit}${value && value !== '1' && value !== 1
|
|
545
|
-
? 's'
|
|
546
|
-
: ''}`,
|
|
547
|
-
})),
|
|
548
|
-
] }) }))] }));
|
|
549
|
-
case DateOperator.InTheCurrent:
|
|
550
|
-
return (_jsx(_Fragment, { children: unitOptions.length > 0 && (_jsx("div", { style: { marginLeft: '10px', marginRight: '10px' }, children: _jsx(SelectComponent, { value: unit, width: 200, onChange: (event) => setUnit(event.target.value), options: [
|
|
601
|
+
} }) }));
|
|
602
|
+
case DateOperator.InTheLast:
|
|
603
|
+
case DateOperator.InThePrevious:
|
|
604
|
+
return (_jsxs("div", { style: { display: 'flex', flexDirection: 'row' }, children: [_jsx(TextInputComponent, { value: value, width: 120, onChange: (event) => {
|
|
605
|
+
setValue(event.target.value);
|
|
606
|
+
} }), unitOptions.length > 0 && (_jsx("div", { style: { marginLeft: '10px' }, children: _jsx(SelectComponent, { value: unit, width: 200, onChange: (event) => setUnit(event.target.value), options: [
|
|
551
607
|
// { value: 'Select', label: 'Select' },
|
|
552
608
|
...unitOptions.map((unit) => ({
|
|
553
609
|
value: unit,
|
|
554
|
-
label: `${unit}${
|
|
555
|
-
value &&
|
|
556
|
-
value !== '1' &&
|
|
557
|
-
value !== 1
|
|
558
|
-
? 's'
|
|
559
|
-
: ''}`,
|
|
610
|
+
label: `${unit}${value && value !== '1' && value !== 1 ? 's' : ''}`,
|
|
560
611
|
})),
|
|
561
|
-
] }) })) }));
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
612
|
+
] }) }))] }));
|
|
613
|
+
case DateOperator.InTheCurrent:
|
|
614
|
+
return (_jsx("div", { style: { display: 'flex', gap: 20 }, children: unitOptions.length > 0 && (_jsx(SelectComponent, { value: unit, width: 200, onChange: (event) => setUnit(event.target.value), options: [
|
|
615
|
+
// { value: 'Select', label: 'Select' },
|
|
616
|
+
...unitOptions.map((unit) => ({
|
|
617
|
+
value: unit,
|
|
618
|
+
label: `${unit}${operator !== DateOperator.InTheCurrent &&
|
|
619
|
+
value &&
|
|
620
|
+
value !== '1' &&
|
|
621
|
+
value !== 1
|
|
622
|
+
? 's'
|
|
623
|
+
: ''}`,
|
|
624
|
+
})),
|
|
625
|
+
] })) }));
|
|
626
|
+
default:
|
|
627
|
+
return _jsx(_Fragment, {});
|
|
628
|
+
}
|
|
629
|
+
})()] }) }), _jsx("div", { style: {
|
|
566
630
|
display: 'flex',
|
|
567
631
|
flexDirection: 'row',
|
|
568
632
|
justifyContent: 'flex-end',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/convert.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,IAAI,GAAG,EACpB,GAAG,EAOJ,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQ5C,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAuBlE;AAGD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,QAahB;AAGD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,QAalB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAoDpD;AAUD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,CAAC,MAAM,EACf,YAAY,EAAE,KAAK,EAAE,GACpB,GAAG,CAAC,MAAM,CA8BZ;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAkBrE;AAmID,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,GAAG,CAAC,MAAM,EACf,UAAU,EAAE,cAAc,EAAE,GAC3B,KAAK,GAAG,IAAI,CAmFd;AA+BD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,KAAK,EAAE,EACrB,SAAS,CAAC,EAAE,KAAK;;;;;;
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/convert.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,IAAI,GAAG,EACpB,GAAG,EAOJ,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQ5C,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAuBlE;AAGD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,QAahB;AAGD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,QAalB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAoDpD;AAUD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,CAAC,MAAM,EACf,YAAY,EAAE,KAAK,EAAE,GACpB,GAAG,CAAC,MAAM,CA8BZ;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAkBrE;AAmID,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,GAAG,CAAC,MAAM,EACf,UAAU,EAAE,cAAc,EAAE,GAC3B,KAAK,GAAG,IAAI,CAmFd;AA+BD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,KAAK,EAAE,EACrB,SAAS,CAAC,EAAE,KAAK;;;;;;EAuFlB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,OAyNtE;AAID,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAY1E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,OA+C5C"}
|
|
@@ -403,8 +403,7 @@ export function convertGroupBy(ast, schemaTables, prevPivot) {
|
|
|
403
403
|
const existingCol = columnAlreadyExists(prevPivot.columnField);
|
|
404
404
|
newColumns.push(existingCol ?? generateColumnExpr(prevPivot.columnField));
|
|
405
405
|
}
|
|
406
|
-
ast
|
|
407
|
-
return { pivot: prevPivot, ast };
|
|
406
|
+
return { pivot: prevPivot, ast: { ...ast, columns: newColumns } };
|
|
408
407
|
}
|
|
409
408
|
pivot = convertASTToPivotData(ast, columns);
|
|
410
409
|
if (pivot && Object.keys(pivot).length === 0) {
|
|
@@ -2,6 +2,8 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import { SidebarComponentProps, ContainerComponentProps } from '../UiComponents';
|
|
3
3
|
import { Filter } from '../../models/Filter';
|
|
4
4
|
import { ColumnInternal } from '../../models/Columns';
|
|
5
|
+
import { FilterTreeNode } from '../../utils/astFilterProcessing';
|
|
6
|
+
import { Client } from '../../models/Client';
|
|
5
7
|
/**
|
|
6
8
|
* This file is a collection of basic UI components that conform to the shape
|
|
7
9
|
* expected by the Report Builder. Where possible, we use our existing
|
|
@@ -108,6 +110,12 @@ export interface FilterPopoverWrapperProps {
|
|
|
108
110
|
FilterTagComponent: any;
|
|
109
111
|
FilterModal: any;
|
|
110
112
|
fieldValuesMap: any;
|
|
113
|
+
priorFilters?: FilterTreeNode[];
|
|
114
|
+
columns?: ColumnInternal[];
|
|
115
|
+
client?: Client;
|
|
116
|
+
customFields?: any;
|
|
117
|
+
baseAst?: any;
|
|
118
|
+
endpoint?: string;
|
|
111
119
|
customOperatorOptions?: any;
|
|
112
120
|
ButtonComponent: any;
|
|
113
121
|
SecondaryButtonComponent: any;
|
|
@@ -118,5 +126,5 @@ export interface FilterPopoverWrapperProps {
|
|
|
118
126
|
handleFilterSave: (filter: Filter) => void;
|
|
119
127
|
containerStyle?: any;
|
|
120
128
|
}
|
|
121
|
-
export declare const FilterPopoverWrapper: ({ schema, filter, filterLabel, index, FilterTagComponent, FilterModal, fieldValuesMap, customOperatorOptions, ButtonComponent, SecondaryButtonComponent, SelectComponent, TextInputComponent, MultiSelectComponent, handleFilterDelete, handleFilterSave, containerStyle, }: FilterPopoverWrapperProps) => import("react/jsx-runtime").JSX.Element;
|
|
129
|
+
export declare const FilterPopoverWrapper: ({ schema, filter, filterLabel, index, FilterTagComponent, FilterModal, fieldValuesMap, priorFilters, columns, client, customFields, baseAst, endpoint, customOperatorOptions, ButtonComponent, SecondaryButtonComponent, SelectComponent, TextInputComponent, MultiSelectComponent, handleFilterDelete, handleFilterSave, containerStyle, }: FilterPopoverWrapperProps) => import("react/jsx-runtime").JSX.Element;
|
|
122
130
|
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/ui.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/ui.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef, useContext, useEffect, useState } from 'react';
|
|
2
|
+
import { forwardRef, useContext, useEffect, useRef, useState, } from 'react';
|
|
3
3
|
import { MemoizedCheckbox, LoadingSpinner, MemoizedPopover, } from '../UiComponents';
|
|
4
4
|
import MemoizedQuillTable from '../QuillTable';
|
|
5
5
|
import { ThemeContext } from '../../Context';
|
|
6
6
|
import { isNodeEmptyCollection, allNumericNodesValidInTree } from './util';
|
|
7
7
|
import { downloadCSV } from '../../utils/csv';
|
|
8
|
+
import { DEFAULT_PAGINATION } from '../../utils/paginationProcessing';
|
|
9
|
+
import { buildQueryFromFilters, uniqueValuesToStringMap, } from '../../utils/filterProcessing';
|
|
10
|
+
import { getRelevantInfoFromQuery } from '../../utils/tableProcessing';
|
|
8
11
|
/**
|
|
9
12
|
* This file is a collection of basic UI components that conform to the shape
|
|
10
13
|
* expected by the Report Builder. Where possible, we use our existing
|
|
@@ -54,7 +57,7 @@ export const QuillSecondaryButton = ({ children, ...props }) => {
|
|
|
54
57
|
// TODO: remove this, I think it is unused.
|
|
55
58
|
export const QuillReportBuilderTable = ({ rows, columns, error, ...props }) => {
|
|
56
59
|
const reformattedColumns = columns.map((c) => ({ label: c, field: c }));
|
|
57
|
-
return (_jsx("div", { style: { height: '100%', overflow: 'auto' }, children: _jsx(MemoizedQuillTable, { rows: rows, columns: reformattedColumns, rowsPerPage:
|
|
60
|
+
return (_jsx("div", { style: { height: '100%', overflow: 'auto' }, children: _jsx(MemoizedQuillTable, { rows: rows, columns: reformattedColumns, rowsPerPage: DEFAULT_PAGINATION.rowsPerPage, hideCSVDownloadButton: rows?.length > 0, downloadCSV: () => downloadCSV({ rows, fields: reformattedColumns, name: 'my_report' }), emptyStateLabel: error || 'No results', ...props }) }));
|
|
58
61
|
};
|
|
59
62
|
export const QuillTag = forwardRef(({ label, onClick, children, onClickDelete, hideDelete = false }, forwardedRef) => {
|
|
60
63
|
const [theme] = useContext(ThemeContext);
|
|
@@ -369,12 +372,43 @@ export const AddFilterPopover = ({ onSave, Button, renderNode, activeEditItem, }
|
|
|
369
372
|
justifyContent: 'end',
|
|
370
373
|
}, children: _jsx(Button, { onClick: handleOnClick, label: 'Add filter' }) })] }));
|
|
371
374
|
};
|
|
372
|
-
export const FilterPopoverWrapper = ({ schema, filter, filterLabel, index, FilterTagComponent, FilterModal, fieldValuesMap, customOperatorOptions, ButtonComponent, SecondaryButtonComponent, SelectComponent, TextInputComponent, MultiSelectComponent, handleFilterDelete, handleFilterSave, containerStyle, }) => {
|
|
375
|
+
export const FilterPopoverWrapper = ({ schema, filter, filterLabel, index, FilterTagComponent, FilterModal, fieldValuesMap, priorFilters, columns, client, customFields, baseAst, endpoint, customOperatorOptions, ButtonComponent, SecondaryButtonComponent, SelectComponent, TextInputComponent, MultiSelectComponent, handleFilterDelete, handleFilterSave, containerStyle, }) => {
|
|
373
376
|
const [isOpen, setIsOpen] = useState(false);
|
|
377
|
+
const [uniqueValues, setUniqueValues] = useState(undefined);
|
|
378
|
+
// Use a ref to store the previous value of priorFilters
|
|
379
|
+
const prevFiltersRef = useRef('');
|
|
380
|
+
useEffect(() => {
|
|
381
|
+
const currentFiltersString = JSON.stringify(priorFilters);
|
|
382
|
+
if (currentFiltersString !== prevFiltersRef.current) {
|
|
383
|
+
prevFiltersRef.current = currentFiltersString;
|
|
384
|
+
if (priorFilters) {
|
|
385
|
+
getFieldValuesMapByFilters(priorFilters);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}, [priorFilters]);
|
|
389
|
+
// This function retrieves the appropriate unique values given a set of filters
|
|
390
|
+
async function getFieldValuesMapByFilters(filters) {
|
|
391
|
+
if (!columns || !client || !endpoint || !baseAst) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
const { query, success, error } = await buildQueryFromFilters(baseAst, filters, endpoint, client);
|
|
396
|
+
if (success && query) {
|
|
397
|
+
const { uniqueStrings } = await getRelevantInfoFromQuery(columns, client, query, customFields);
|
|
398
|
+
const fieldValues = uniqueStrings && Object.keys(uniqueStrings).length !== 0
|
|
399
|
+
? uniqueValuesToStringMap(uniqueStrings)
|
|
400
|
+
: fieldValuesMap; // Fallback in case Promise comes up empty
|
|
401
|
+
setUniqueValues(fieldValues);
|
|
402
|
+
}
|
|
403
|
+
else if (error) {
|
|
404
|
+
console.error(error);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
374
408
|
function handleClickDelete() {
|
|
375
409
|
handleFilterDelete(index);
|
|
376
410
|
}
|
|
377
|
-
return (_jsx("div", { style: containerStyle, children: _jsx(FilterTagComponent, { isOpen: isOpen, popoverTitle: "Edit Filter", filterLabel: filterLabel, onClickDelete: handleClickDelete, setIsOpen: setIsOpen, popoverChildren: _jsx(FilterModal, { schema: schema, filter: filter, fieldValuesMap: fieldValuesMap, customOperatorOptions: customOperatorOptions, onSubmitFilter: (filter) => {
|
|
411
|
+
return (_jsx("div", { style: containerStyle, children: _jsx(FilterTagComponent, { isOpen: isOpen, popoverTitle: "Edit Filter", filterLabel: filterLabel, onClickDelete: handleClickDelete, setIsOpen: setIsOpen, popoverChildren: _jsx(FilterModal, { schema: schema, filter: filter, fieldValuesMap: uniqueValues ?? fieldValuesMap, customOperatorOptions: customOperatorOptions, onSubmitFilter: (filter) => {
|
|
378
412
|
handleFilterSave(filter);
|
|
379
413
|
setIsOpen(false);
|
|
380
414
|
}, onDeleteFilter: handleClickDelete, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, SecondaryButtonComponent: SecondaryButtonComponent ?? undefined, MultiSelectComponent: MultiSelectComponent }) }) }));
|
|
@@ -69,7 +69,11 @@ export declare const getDateFilterInfo: (node: any) => {
|
|
|
69
69
|
intervalType: any;
|
|
70
70
|
intervalPaths: any;
|
|
71
71
|
};
|
|
72
|
-
export declare function removeNonSelectedTableReferences(ast: any, table: string, columns: string[]
|
|
72
|
+
export declare function removeNonSelectedTableReferences(ast: any, table: string, columns: string[], uniqueValues: {
|
|
73
|
+
[column: string]: {
|
|
74
|
+
[value: string]: boolean;
|
|
75
|
+
};
|
|
76
|
+
} | null): any;
|
|
73
77
|
export declare function allNumericNodesValidInTree(node: any): boolean;
|
|
74
78
|
export declare function isIdColumn(columnName?: string): boolean | "" | undefined;
|
|
75
79
|
export declare function getCustomSentence(node: any, databaseType: string): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/components/ReportBuilder/util.ts"],"names":[],"mappings":"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"}
|