@quillsql/react 2.13.21 → 2.13.23
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 +63 -43
- package/dist/cjs/Context.js +2 -2
- package/dist/cjs/Dashboard.d.ts.map +1 -1
- package/dist/cjs/Dashboard.js +58 -13
- package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/cjs/components/Chart/LineChart.js +12 -22
- package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DashboardFilter.js +6 -6
- package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/cjs/components/Dashboard/DataLoader.js +22 -10
- package/dist/cjs/hooks/useDashboard.d.ts +1 -4
- package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
- package/dist/cjs/hooks/useDashboard.js +1 -22
- package/dist/cjs/hooks/useExport.d.ts +1 -8
- package/dist/cjs/hooks/useExport.d.ts.map +1 -1
- package/dist/cjs/hooks/useExport.js +6 -4
- package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
- package/dist/cjs/hooks/useQuill.js +4 -2
- package/dist/cjs/hooks/useReport.d.ts +12 -0
- package/dist/cjs/hooks/useReport.d.ts.map +1 -0
- package/dist/cjs/hooks/useReport.js +56 -0
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
- package/dist/cjs/internals/ReportBuilder/PivotModal.js +1 -0
- package/dist/cjs/utils/constants.d.ts.map +1 -1
- package/dist/cjs/utils/constants.js +2 -2
- package/dist/cjs/utils/dataProcessing.js +2 -2
- package/dist/cjs/utils/filterProcessing.d.ts +2 -2
- package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
- package/dist/cjs/utils/filterProcessing.js +166 -36
- package/dist/cjs/utils/logging.js +1 -1
- package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/cjs/utils/pivotConstructor.js +47 -10
- package/dist/cjs/utils/queryConstructor.js +1 -1
- package/dist/cjs/utils/valueFormatter.d.ts +5 -1
- package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
- package/dist/cjs/utils/valueFormatter.js +32 -12
- package/dist/esm/Chart.d.ts.map +1 -1
- package/dist/esm/Chart.js +64 -44
- package/dist/esm/Context.js +2 -2
- package/dist/esm/Dashboard.d.ts.map +1 -1
- package/dist/esm/Dashboard.js +61 -16
- package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
- package/dist/esm/components/Chart/LineChart.js +15 -25
- package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DashboardFilter.js +7 -7
- package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
- package/dist/esm/components/Dashboard/DataLoader.js +22 -10
- package/dist/esm/hooks/useDashboard.d.ts +1 -4
- package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
- package/dist/esm/hooks/useDashboard.js +1 -21
- package/dist/esm/hooks/useExport.d.ts +1 -8
- package/dist/esm/hooks/useExport.d.ts.map +1 -1
- package/dist/esm/hooks/useExport.js +6 -4
- package/dist/esm/hooks/useQuill.d.ts.map +1 -1
- package/dist/esm/hooks/useQuill.js +4 -2
- package/dist/esm/hooks/useReport.d.ts +12 -0
- package/dist/esm/hooks/useReport.d.ts.map +1 -0
- package/dist/esm/hooks/useReport.js +51 -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 +1 -0
- package/dist/esm/utils/constants.d.ts.map +1 -1
- package/dist/esm/utils/constants.js +2 -2
- package/dist/esm/utils/dataProcessing.js +2 -2
- package/dist/esm/utils/filterProcessing.d.ts +2 -2
- package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
- package/dist/esm/utils/filterProcessing.js +166 -36
- package/dist/esm/utils/logging.js +1 -1
- package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
- package/dist/esm/utils/pivotConstructor.js +47 -10
- package/dist/esm/utils/queryConstructor.js +1 -1
- package/dist/esm/utils/valueFormatter.d.ts +5 -1
- package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
- package/dist/esm/utils/valueFormatter.js +33 -13
- package/package.json +1 -1
package/dist/esm/Dashboard.js
CHANGED
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useContext, useEffect, useState, useMemo, useRef, } from 'react';
|
|
3
3
|
import { ChartDisplay } from './Chart';
|
|
4
4
|
import { PRIMARY_RANGE, COMPARISON_RANGE, defaultOptionsV2, getRangeFromPresetOptions, } from './DateRangePicker/dateRangePickerUtils';
|
|
5
|
-
import { ClientContext, ThemeContext, SchemaDataContext } from './Context';
|
|
5
|
+
import { ClientContext, ThemeContext, SchemaDataContext, DashboardFiltersContext } from './Context';
|
|
6
6
|
import { useDashboard } from './hooks/useDashboard';
|
|
7
7
|
import DashboardSectionContainer from './components/Dashboard/DashboardSectionContainer';
|
|
8
8
|
import QuillMetricComponent from './components/Dashboard/MetricComponent';
|
|
@@ -15,11 +15,11 @@ import { QuillDateRangePicker } from './DateRangePicker/QuillDateRangePicker';
|
|
|
15
15
|
import DataLoader, { ChartDataLoader, } from './components/Dashboard/DataLoader';
|
|
16
16
|
import { QuillEmptyDashboardComponent, QuillFilterContainerComponent, QuillLoadingDashboardComponent, QuillModalComponent, MemoizedButton, MemoizedSecondaryButton, QuillTextInput, MemoizedPopover, QuillErrorMessageComponent, } from './components/UiComponents';
|
|
17
17
|
import { DashboardFilter } from './components/Dashboard/DashboardFilter';
|
|
18
|
-
import { BoolOperator, convertCustomFilter, FieldType, NullOperator, NumberOperator, StringOperator, } from './models/Filter';
|
|
18
|
+
import { BoolOperator, convertCustomFilter, FieldType, FilterType, NullOperator, NumberOperator, StringOperator, } from './models/Filter';
|
|
19
19
|
import { QuillMultiSelectComponentWithCombo } from './components/QuillMultiSelectWithCombo';
|
|
20
20
|
import { QuillSelectComponentWithCombo } from './components/QuillSelectWithCombo';
|
|
21
21
|
import { getUniqueStringValues } from './utils/tableProcessing';
|
|
22
|
-
import { filterSentence, getType } from './utils/filterProcessing';
|
|
22
|
+
import { applyCustomFilterToDashDateFilter, filterSentence, getType } from './utils/filterProcessing';
|
|
23
23
|
import { QuillChartErrorWithAction } from './components/Chart/ChartError';
|
|
24
24
|
import { FilterPopoverWrapper, QuillFilterPopover, } from './components/ReportBuilder/ui';
|
|
25
25
|
import FilterModal from './components/ReportBuilder/FilterModal';
|
|
@@ -28,6 +28,7 @@ import QuillTemplateTableComponent from './components/Dashboard/TemplateTableCom
|
|
|
28
28
|
import QuillDashboardTemplate from './components/Dashboard/DashboardTemplate';
|
|
29
29
|
import { DashboardFilterType, } from './models/Filter';
|
|
30
30
|
import { DEFAULT_PAGINATION } from './utils/paginationProcessing';
|
|
31
|
+
import equal from 'fast-deep-equal';
|
|
31
32
|
const defaultChartContainerStyles = {
|
|
32
33
|
display: 'flex',
|
|
33
34
|
width: '100%',
|
|
@@ -129,6 +130,7 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
|
|
|
129
130
|
const [client, isClientLoading] = useContext(ClientContext);
|
|
130
131
|
const [theme] = useContext(ThemeContext);
|
|
131
132
|
const [schemaData] = useContext(SchemaDataContext);
|
|
133
|
+
const { dispatch: dashboardFiltersDispatch } = useContext(DashboardFiltersContext);
|
|
132
134
|
const [fieldValuesMap, setFieldValuesMap] = useState({}); // Mapping of unique values per field, used in string filter 'in' and 'not in'
|
|
133
135
|
const [referencedTables, setReferencedTables] = useState([]); // Intersection of tables referenced in the dashboard
|
|
134
136
|
const [fieldValuesIsLoaded, setFieldValuesIsLoaded] = useState(false);
|
|
@@ -162,12 +164,63 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
|
|
|
162
164
|
const prevClientIdRef = useRef(undefined);
|
|
163
165
|
const addFilterPopoverButtonRef = useRef(null);
|
|
164
166
|
const viewFiltersPopoverButtonRef = useRef(null);
|
|
167
|
+
const previousFilters = useRef(undefined);
|
|
168
|
+
if (!equal(previousFilters.current, filters)) {
|
|
169
|
+
previousFilters.current = filters;
|
|
170
|
+
}
|
|
165
171
|
useEffect(() => {
|
|
166
|
-
setFilterValues({})
|
|
172
|
+
setFilterValues(Object.values(populatedDashboardFilters ?? {}).reduce((acc, f) => {
|
|
173
|
+
acc[f.label] =
|
|
174
|
+
f.filterType === 'string'
|
|
175
|
+
? f.stringFilterType === 'multiselect'
|
|
176
|
+
? { values: f.values, operator: 'IN' }
|
|
177
|
+
: { selectedValue: f.selectedValue }
|
|
178
|
+
: {
|
|
179
|
+
startDate: f.startDate,
|
|
180
|
+
endDate: f.endDate,
|
|
181
|
+
preset: f.preset,
|
|
182
|
+
comparisonRange: f.comparisonRange,
|
|
183
|
+
};
|
|
184
|
+
return acc;
|
|
185
|
+
}, {}));
|
|
167
186
|
const clientIdChanged = prevClientIdRef.current !== client?.organizationId;
|
|
168
187
|
reload(name, clientIdChanged);
|
|
169
188
|
prevClientIdRef.current = client?.organizationId;
|
|
170
189
|
}, [name, client?.organizationId]);
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
const dashboardDateFilter = populatedDashboardFilters?.find((f) => f.filterType === 'date_range');
|
|
192
|
+
if (dashboardDateFilter) {
|
|
193
|
+
// Filter for custom date filter that applies to the report's dateField
|
|
194
|
+
const customDateFilter = previousFilters.current?.find((f) => f.filterType === FilterType.DateCustomFilter
|
|
195
|
+
|| f.filterType === FilterType.DateFilter
|
|
196
|
+
|| f.filterType === FilterType.DateComparisonFilter
|
|
197
|
+
// FIXME: this is the correct way to do it but the demo has a hardcoded filter field
|
|
198
|
+
// && f.field === report?.dateField?.field && f.table === report?.dateField?.table,
|
|
199
|
+
);
|
|
200
|
+
if (!customDateFilter) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const newFilter = applyCustomFilterToDashDateFilter(customDateFilter, dashboardDateFilter);
|
|
204
|
+
setFilterValues((filterValues) => ({
|
|
205
|
+
...filterValues,
|
|
206
|
+
[dashboardDateFilter.label]: {
|
|
207
|
+
startDate: newFilter.startDate,
|
|
208
|
+
endDate: newFilter.endDate,
|
|
209
|
+
preset: newFilter.preset,
|
|
210
|
+
comparisonRange: newFilter.comparisonRange,
|
|
211
|
+
},
|
|
212
|
+
}));
|
|
213
|
+
dashboardFiltersDispatch({
|
|
214
|
+
type: 'UPDATE_DASHBOARD_FILTER',
|
|
215
|
+
dashboardName: name,
|
|
216
|
+
filterName: dashboardDateFilter.label,
|
|
217
|
+
data: {
|
|
218
|
+
filter: newFilter,
|
|
219
|
+
loading: false,
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}, [previousFilters.current]);
|
|
171
224
|
// Go through all columns in the referenced tables and get the unique values to use in fieldValuesMap
|
|
172
225
|
useEffect(() => {
|
|
173
226
|
const fetchData = async () => {
|
|
@@ -245,10 +298,6 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
|
|
|
245
298
|
else {
|
|
246
299
|
filterValue = { selectedValue: value };
|
|
247
300
|
}
|
|
248
|
-
setFilterValues((filterValues) => ({
|
|
249
|
-
...filterValues,
|
|
250
|
-
[filter.label]: filterValue,
|
|
251
|
-
}));
|
|
252
301
|
}
|
|
253
302
|
else if (filter.filterType === DashboardFilterType.Date) {
|
|
254
303
|
if (comparison ||
|
|
@@ -284,10 +333,6 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
|
|
|
284
333
|
value: key,
|
|
285
334
|
},
|
|
286
335
|
};
|
|
287
|
-
setFilterValues((filterValues) => ({
|
|
288
|
-
...filterValues,
|
|
289
|
-
[filter.label]: filterValue,
|
|
290
|
-
}));
|
|
291
336
|
}
|
|
292
337
|
else {
|
|
293
338
|
const primaryRange = value && value.preset
|
|
@@ -305,12 +350,12 @@ export default function Dashboard({ name, hidden = false, SelectComponent = Quil
|
|
|
305
350
|
value: preset,
|
|
306
351
|
},
|
|
307
352
|
};
|
|
308
|
-
setFilterValues((filterValues) => ({
|
|
309
|
-
...filterValues,
|
|
310
|
-
[filter.label]: filterValue,
|
|
311
|
-
}));
|
|
312
353
|
}
|
|
313
354
|
}
|
|
355
|
+
setFilterValues((filterValues) => ({
|
|
356
|
+
...filterValues,
|
|
357
|
+
[filter.label]: filterValue,
|
|
358
|
+
}));
|
|
314
359
|
reload(name, false, undefined, {
|
|
315
360
|
filters: populatedDashboardFilters.map((f) => filter.label === f.label ? { ...f, ...filterValue } : f),
|
|
316
361
|
editedFilterLabel: filter.label,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineChart.d.ts","sourceRoot":"","sources":["../../../../src/components/Chart/LineChart.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LineChart.d.ts","sourceRoot":"","sources":["../../../../src/components/Chart/LineChart.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAyB7C,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,MAAM,EACN,QAAa,EACb,WAAW,EACX,IAAI,EACJ,cAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,EACL,UAAU,EACV,iBAAwB,EACxB,SAAiB,EACjB,SAAiB,EACjB,iBAAyB,EACzB,2BAAmC,EACnC,yBAAgC,EAChC,wBAAgC,EAChC,sBAAgC,EAChC,mBAA6B,EAC7B,sBAAsB,EACtB,mBAA8B,EAC9B,UAAU,GACX,EAAE;IACD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,UAAU,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,GAAG,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,2BAA2B,EAAE,OAAO,CAAC;IACrC,yBAAyB,EAAE,OAAO,CAAC;IACnC,wBAAwB,EAAE,OAAO,CAAC;IAClC,sBAAsB,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC3C,mBAAmB,EAAE,OAAO,GAAG,QAAQ,CAAC;IACxC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB,2CAsRA"}
|
|
@@ -1,48 +1,38 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Area, CartesianGrid, ComposedChart
|
|
3
|
-
import { DATE_FORMAT_TYPES,
|
|
2
|
+
import { Area, CartesianGrid, ComposedChart, ResponsiveContainer, Tooltip, XAxis, YAxis, } from 'recharts';
|
|
3
|
+
import { DATE_FORMAT_TYPES, valueFormatter, } from '../../utils/valueFormatter';
|
|
4
4
|
import { axisFormatter } from '../../utils/axisFormatter';
|
|
5
5
|
import { selectColor } from '../../utils/color';
|
|
6
6
|
import ChartTooltip from '../../components/Chart/ChartTooltip';
|
|
7
7
|
import getDomain from '../../utils/getDomain';
|
|
8
|
-
import { useEffect, useState } from 'react';
|
|
9
8
|
import { hashCode } from '../../utils/crypto';
|
|
9
|
+
import { useMemo } from 'react';
|
|
10
10
|
function createLineForEmptyChart(yAxisFields, dateFilter, xAxisField, xAxisFormat) {
|
|
11
11
|
let lineChartData = [];
|
|
12
|
-
if (dateFilter &&
|
|
12
|
+
if (dateFilter && dateFilter.startDate && dateFilter.endDate &&
|
|
13
13
|
DATE_FORMAT_TYPES.includes(xAxisFormat || '') &&
|
|
14
14
|
(!lineChartData || lineChartData.length === 0)) {
|
|
15
15
|
const xAxis = xAxisField || '';
|
|
16
16
|
const yAxis = yAxisFields[0]?.field;
|
|
17
|
-
const startDate = quillFormat({
|
|
18
|
-
value: dateFilter?.startDate,
|
|
19
|
-
format: xAxisFormat,
|
|
20
|
-
});
|
|
21
|
-
const endDate = quillFormat({
|
|
22
|
-
value: dateFilter?.endDate,
|
|
23
|
-
format: xAxisFormat,
|
|
24
|
-
});
|
|
25
17
|
lineChartData = [
|
|
26
|
-
{ [xAxis]: startDate, [yAxis]: '0' },
|
|
27
|
-
{ [xAxis]: endDate, [yAxis]: '0' },
|
|
18
|
+
{ [xAxis]: dateFilter.startDate, [yAxis]: '0' },
|
|
19
|
+
{ [xAxis]: dateFilter.endDate, [yAxis]: '0' },
|
|
28
20
|
];
|
|
29
21
|
}
|
|
30
22
|
return lineChartData;
|
|
31
23
|
}
|
|
32
24
|
export default function LineChart({ colors, colorMap = {}, yAxisFields, data, containerStyle, className, xAxisField, xAxisFormat, theme, comparison, isAnimationActive = true, hideXAxis = false, hideYAxis = false, hideCartesianGrid = false, hideHorizontalCartesianGrid = false, hideVerticalCartesianGrid = true, hideSubsequentXAxisTicks = false, cartesianGridLineStyle = 'solid', comparisonLineStyle = 'solid', cartesianGridLineColor, onClickChartElement = () => { }, dateFilter, }) {
|
|
33
|
-
const
|
|
34
|
-
useEffect(() => {
|
|
25
|
+
const formattedData = useMemo(() => {
|
|
35
26
|
if (!data || data.length === 0) {
|
|
36
|
-
|
|
37
|
-
return;
|
|
27
|
+
return createLineForEmptyChart(yAxisFields, dateFilter, xAxisField, xAxisFormat);
|
|
38
28
|
}
|
|
39
29
|
const newData = [...data];
|
|
40
|
-
if (newData.length === 1) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
}, [data]);
|
|
30
|
+
// if (newData.length === 1) {
|
|
31
|
+
// const point = { ...newData[0] };
|
|
32
|
+
// newData.push(point);
|
|
33
|
+
// }
|
|
34
|
+
return newData;
|
|
35
|
+
}, [data, yAxisFields, dateFilter, xAxisField, xAxisFormat]);
|
|
46
36
|
if (!formattedData || formattedData.length === 0) {
|
|
47
37
|
return (_jsx("div", { style: {
|
|
48
38
|
display: 'flex',
|
|
@@ -79,7 +69,7 @@ export default function LineChart({ colors, colorMap = {}, yAxisFields, data, co
|
|
|
79
69
|
return sum + 1;
|
|
80
70
|
return sum;
|
|
81
71
|
}, 0);
|
|
82
|
-
return (_jsx("div", { style: { ...containerStyle }, className: className, children: _jsx(ResponsiveContainer, { width: "100%", height: '100%', children: _jsxs(
|
|
72
|
+
return (_jsx("div", { style: { ...containerStyle }, className: className, children: _jsx(ResponsiveContainer, { width: "100%", height: '100%', children: _jsxs(ComposedChart, { data: formattedData, onClick: (event) => onClickChartElement(event?.activePayload ? event.activePayload[0].payload : undefined), children: [!hideCartesianGrid && (_jsx(CartesianGrid, { horizontal: !hideHorizontalCartesianGrid, vertical: !hideVerticalCartesianGrid, stroke: cartesianGridLineColor ?? '#e5e7eb', strokeDasharray: cartesianGridLineStyle === 'dashed' ? '5 5' : undefined })), _jsx(XAxis, { dataKey: xAxisField, hide: hideXAxis, tick: { transform: 'translate(0, 6)' }, style: {
|
|
83
73
|
fontSize: '12px',
|
|
84
74
|
fontFamily: theme?.chartLabelFontFamily ||
|
|
85
75
|
theme?.fontFamily ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DashboardFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DashboardFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DashboardFilter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
|
-
import { COMPARISON_OPTIONS, PRIMARY_RANGE } from '../../DateRangePicker/dateRangePickerUtils';
|
|
3
|
+
import { COMPARISON_OPTIONS, PRIMARY_RANGE, } from '../../DateRangePicker/dateRangePickerUtils';
|
|
4
4
|
import { QuillDateRangePicker, } from '../../DateRangePicker/QuillDateRangePicker';
|
|
5
5
|
import { QuillMultiSelectComponent } from '../QuillMultiSelect';
|
|
6
6
|
import { QuillSelectComponent } from '../QuillSelect';
|
|
7
7
|
export function DashboardFilter({ filter, onChangeFilter, SelectComponent = QuillSelectComponent, MultiSelectComponent = QuillMultiSelectComponent, DateRangePickerComponent = QuillDateRangePicker, theme, isLoading, }) {
|
|
8
8
|
const preset = useMemo(() => {
|
|
9
|
-
if ('preset' in filter && 'startDate' in filter && 'endDate' in filter) {
|
|
10
|
-
if (!filter.preset)
|
|
9
|
+
if (('preset' in filter || 'primaryRange' in filter) && 'startDate' in filter && 'endDate' in filter) {
|
|
10
|
+
if (!filter.preset && !filter.primaryRange)
|
|
11
11
|
return '';
|
|
12
12
|
if (!filter.startDate || !filter.endDate)
|
|
13
|
-
return filter.preset.value;
|
|
14
|
-
const presetRange = filter.presetRanges?.find((range) => range.value === filter.preset.value) ?? PRIMARY_RANGE[filter.preset.value];
|
|
13
|
+
return filter.preset?.value ?? filter.primaryRange.value;
|
|
14
|
+
const presetRange = filter.presetRanges?.find((range) => range.value === (filter.preset?.value ?? filter.primaryRange.value)) ?? PRIMARY_RANGE[filter.preset?.value ?? filter.primaryRange.value];
|
|
15
15
|
if (!presetRange)
|
|
16
|
-
return filter.preset.value;
|
|
16
|
+
return filter.preset?.value ?? filter.primaryRange.value;
|
|
17
17
|
if (presetRange.startDate !== filter.startDate ||
|
|
18
18
|
presetRange.endDate !== filter.endDate) {
|
|
19
19
|
return '';
|
|
20
20
|
}
|
|
21
|
-
return filter.preset.value;
|
|
21
|
+
return filter.preset?.value ?? filter.primaryRange.value;
|
|
22
22
|
}
|
|
23
23
|
return '';
|
|
24
24
|
}, [filter]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataLoader.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DataLoader.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAuB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAajD,OAAO,EACL,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA0BtE,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAuFF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,WAAW,EACX,oBAAoB,EAAE,2BAA2B,EACjD,UAAkB,GACnB,EAAE;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,CAAC,EACT,SAAS,EACT,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,IAAI,GACL,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;CACzC,GAAG,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"DataLoader.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DataLoader.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAuB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAajD,OAAO,EACL,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA0BtE,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAuFF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,WAAW,EACX,oBAAoB,EAAE,2BAA2B,EACjD,UAAkB,GACnB,EAAE;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,CAAC,EACT,SAAS,EACT,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,IAAI,GACL,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;CACzC,GAAG,GAAG,CAAC,OAAO,CA+Td;AAED,KAAK,YAAY,GAAG;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAIF,eAAO,MAAM,eAAe,4FAQzB;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAClB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,KACf,YAAY,CAAC;IAClB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,CAAC,EACT,SAAS,EACT,KAAK,EACL,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,iBAAiB,GAClB,EAAE,yBAAyB,KAAK,GAAG,CAAC,OAAO,CAAC;CAC9C,KAAG,GAAG,CAAC,OA+JP,CAAC"}
|
|
@@ -219,14 +219,22 @@ export default function DataLoader({ item, children, filters, userFilters, addit
|
|
|
219
219
|
reportsDispatch({
|
|
220
220
|
type: 'UPDATE_REPORT',
|
|
221
221
|
id: item.id,
|
|
222
|
-
data: {
|
|
222
|
+
data: {
|
|
223
|
+
rows: tempRows,
|
|
224
|
+
loadingRows: false,
|
|
225
|
+
filtersApplied: userFilters,
|
|
226
|
+
},
|
|
223
227
|
});
|
|
224
228
|
}
|
|
225
229
|
else {
|
|
226
230
|
dispatch({
|
|
227
231
|
type: 'UPDATE_DASHBOARD_ITEM',
|
|
228
232
|
id: item.id,
|
|
229
|
-
data: {
|
|
233
|
+
data: {
|
|
234
|
+
rows: tempRows,
|
|
235
|
+
loadingRows: false,
|
|
236
|
+
filtersApplied: userFilters,
|
|
237
|
+
},
|
|
230
238
|
});
|
|
231
239
|
}
|
|
232
240
|
setAdditionalProcessing(updatedProcessing);
|
|
@@ -245,24 +253,24 @@ export default function DataLoader({ item, children, filters, userFilters, addit
|
|
|
245
253
|
if (!client || !filters) {
|
|
246
254
|
return;
|
|
247
255
|
}
|
|
248
|
-
const fetchRowsRequestId = rowsRequestId.current + 1;
|
|
249
|
-
rowsRequestId.current = fetchRowsRequestId;
|
|
250
256
|
const tempReport = (reportMode ? reports : dashboard)[item.id];
|
|
251
257
|
if (tempReport &&
|
|
252
258
|
!didFiltersChange(tempReport, filters) &&
|
|
253
259
|
userFilterValuesEquivalent(userFilters ?? [], previousUserFilters.current ?? []) &&
|
|
254
260
|
!tempReport.triggerReload) {
|
|
255
|
-
setLoading(false);
|
|
256
261
|
return;
|
|
257
262
|
}
|
|
258
263
|
setLoading(true);
|
|
264
|
+
const fetchRowsRequestId = rowsRequestId.current + 1;
|
|
265
|
+
rowsRequestId.current = fetchRowsRequestId;
|
|
259
266
|
previousUserFilters.current = userFilters ?? null;
|
|
260
267
|
rowsAbortController.current?.abort();
|
|
261
268
|
rowsAbortController.current = new AbortController();
|
|
262
269
|
try {
|
|
263
270
|
if (reportMode) {
|
|
264
271
|
try {
|
|
265
|
-
await fetchIndividualReport(item.id, 'Chart', true, filters, userFilters, processing, undefined, rowsAbortController.current
|
|
272
|
+
await fetchIndividualReport(item.id, 'Chart', true, filters, userFilters, processing, undefined, rowsAbortController.current);
|
|
273
|
+
rowsAbortController.current = null;
|
|
266
274
|
setError(undefined);
|
|
267
275
|
}
|
|
268
276
|
catch (e) {
|
|
@@ -278,7 +286,7 @@ export default function DataLoader({ item, children, filters, userFilters, addit
|
|
|
278
286
|
id: item.id,
|
|
279
287
|
data: { ...fetchedReport, triggerReload: false, rowCount: 0 }, // rowCount 0 indicates it's still loading if row length is nonzero
|
|
280
288
|
appliedFilters: userFilters,
|
|
281
|
-
|
|
289
|
+
loadingRows: false,
|
|
282
290
|
});
|
|
283
291
|
setError(error);
|
|
284
292
|
}
|
|
@@ -347,6 +355,7 @@ export const ChartDataLoader = ({ item, children, dateBucket, additionalProcessi
|
|
|
347
355
|
const previousUserFilters = useRef(null);
|
|
348
356
|
const previousDateBucket = useRef(undefined);
|
|
349
357
|
const fetchReportAbortController = useRef(null);
|
|
358
|
+
const rowsRequestId = useRef(0);
|
|
350
359
|
const chartReport = useMemo(() => {
|
|
351
360
|
const report = reportMode ? reports[item.id] : dashboard[item.id];
|
|
352
361
|
if (!report) {
|
|
@@ -368,9 +377,10 @@ export const ChartDataLoader = ({ item, children, dateBucket, additionalProcessi
|
|
|
368
377
|
userFilterValuesEquivalent(userFilters ?? [], previousUserFilters.current ?? []) &&
|
|
369
378
|
dateBucket === previousDateBucket.current &&
|
|
370
379
|
!tempReport.triggerReload) {
|
|
371
|
-
setLoading(false);
|
|
372
380
|
return;
|
|
373
381
|
}
|
|
382
|
+
const fetchRowsRequestId = rowsRequestId.current + 1;
|
|
383
|
+
rowsRequestId.current = fetchRowsRequestId;
|
|
374
384
|
previousUserFilters.current = userFilters ?? null;
|
|
375
385
|
previousDateBucket.current = dateBucket;
|
|
376
386
|
setLoading(true);
|
|
@@ -401,7 +411,7 @@ export const ChartDataLoader = ({ item, children, dateBucket, additionalProcessi
|
|
|
401
411
|
id: item.id,
|
|
402
412
|
data: { ...report, triggerReload: false },
|
|
403
413
|
appliedFilters: userFilters,
|
|
404
|
-
|
|
414
|
+
loadingRows: false,
|
|
405
415
|
});
|
|
406
416
|
setError(error);
|
|
407
417
|
}
|
|
@@ -413,7 +423,9 @@ export const ChartDataLoader = ({ item, children, dateBucket, additionalProcessi
|
|
|
413
423
|
throw e;
|
|
414
424
|
}
|
|
415
425
|
finally {
|
|
416
|
-
|
|
426
|
+
if (fetchRowsRequestId === rowsRequestId.current) {
|
|
427
|
+
setLoading(false);
|
|
428
|
+
}
|
|
417
429
|
}
|
|
418
430
|
};
|
|
419
431
|
useEffect(() => {
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import { QuillReport
|
|
1
|
+
import { QuillReport } from '../models/Report';
|
|
2
2
|
import { DashboardFilter, InternalFilter } from '../models/Filter';
|
|
3
3
|
import { DashboardConfig } from '../models/Dashboard';
|
|
4
|
-
export declare const useReports: () => {
|
|
5
|
-
reloadFilteredReports: (predicate: (report: QuillReportInternal) => boolean) => void;
|
|
6
|
-
};
|
|
7
4
|
export declare const useDashboard: (dashboardName: string | null, customFilters?: InternalFilter[]) => {
|
|
8
5
|
data: DashboardConfig | null;
|
|
9
6
|
dashboardFilters: DashboardFilter[] | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDashboard.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDashboard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useDashboard.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDashboard.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EACL,eAAe,EAEf,cAAc,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,eAAO,MAAM,YAAY,kBACR,MAAM,GAAG,IAAI,kBACZ,cAAc,EAAE;;;;2CA8Gc,MAAM;qCApF1B,MAAM,4CAEf;QACb,MAAM,EAAE,WAAW,GAAG;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QACrC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC7B,oBACiB;QAChB,OAAO,EAAE,eAAe,EAAE,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;CA8FJ,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;sDAuBrB;QACD,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,eAAe,EAAE,CAAC;QAC3B,UAAU,CAAC,EAAE,eAAe,CAAC;KAC9B;4BA+CO,MAAM,oDAMT;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,eAAe,EAAE,CAAC;QAC3B,UAAU,CAAC,EAAE,eAAe,CAAC;QAC7B,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC;KAClC;4BA2FkC,MAAM;CA8B5C,CAAC"}
|
|
@@ -1,28 +1,8 @@
|
|
|
1
1
|
import { useContext, useMemo } from 'react';
|
|
2
|
-
import { ClientContext, DashboardConfigContext,
|
|
2
|
+
import { ClientContext, DashboardConfigContext, DashboardFiltersContext, } from '../Context';
|
|
3
3
|
import { PRIMARY_RANGE } from '../DateRangePicker/dateRangePickerUtils';
|
|
4
4
|
import { DashboardFilterType, } from '../models/Filter';
|
|
5
5
|
import { createDefaultDateFilter } from '../utils/filterProcessing';
|
|
6
|
-
export const useReports = () => {
|
|
7
|
-
const [dashboard, dispatch] = useContext(DashboardContext);
|
|
8
|
-
const reloadReport = (id) => {
|
|
9
|
-
dispatch({
|
|
10
|
-
type: 'UPDATE_DASHBOARD_ITEM',
|
|
11
|
-
id: id,
|
|
12
|
-
data: { triggerReload: true },
|
|
13
|
-
});
|
|
14
|
-
};
|
|
15
|
-
const reloadFilteredReports = (predicate) => {
|
|
16
|
-
for (const id in dashboard) {
|
|
17
|
-
if (predicate(dashboard[id])) {
|
|
18
|
-
reloadReport(id);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
return {
|
|
23
|
-
reloadFilteredReports,
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
6
|
export const useDashboard = (dashboardName, customFilters) => {
|
|
27
7
|
const { dashboardConfig, isLoading: isDashboardsLoading, loadDashboard, } = useContext(DashboardConfigContext);
|
|
28
8
|
const { dashboardFilters, loadFiltersForDashboard } = useContext(DashboardFiltersContext);
|
|
@@ -6,15 +6,8 @@ export declare const useExport: (reportId?: string, { CustomDocumentComponent, m
|
|
|
6
6
|
}) => {
|
|
7
7
|
downloadCSV: () => void;
|
|
8
8
|
downloadPDF: () => void;
|
|
9
|
-
isLoading: boolean;
|
|
10
|
-
isCSVLoading?: undefined;
|
|
11
|
-
isPDFLoading?: undefined;
|
|
12
|
-
} | {
|
|
13
|
-
downloadCSV: () => Promise<void>;
|
|
14
|
-
downloadPDF: () => Promise<void>;
|
|
15
|
-
isCSVLoading: boolean;
|
|
16
9
|
isPDFLoading: boolean;
|
|
17
|
-
|
|
10
|
+
isCSVLoading: boolean;
|
|
18
11
|
};
|
|
19
12
|
interface QuillPDFProps {
|
|
20
13
|
report: QuillReport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useExport.d.ts","sourceRoot":"","sources":["../../../src/hooks/useExport.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"useExport.d.ts","sourceRoot":"","sources":["../../../src/hooks/useExport.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA8D/C,eAAO,MAAM,SAAS,cACT,MAAM,mEAMd;IACD,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,GAAG,CAAC,OAAO,CAAC;IAChE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;;;;;CA2OF,CAAC;AAEF,UAAU,aAAa;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
|
|
@@ -40,7 +40,7 @@ async function getExportData(client, dashboardFilters, reportId) {
|
|
|
40
40
|
useNewNodeSql: true,
|
|
41
41
|
};
|
|
42
42
|
const resp = await getData(client, 'itempost', 'same-origin', hostedBody, cloudBody);
|
|
43
|
-
const cleanedReport = await cleanDashboardItem(resp, dashboardFilters);
|
|
43
|
+
const cleanedReport = await cleanDashboardItem(resp, dashboardFilters, client);
|
|
44
44
|
if (cleanedReport.chartType === 'table' && cleanedReport.pivot) {
|
|
45
45
|
cleanedReport.columns = cleanedReport.yAxisFields;
|
|
46
46
|
}
|
|
@@ -60,7 +60,6 @@ sectionField, } = {}) => {
|
|
|
60
60
|
if (!dashboardName || !dashboardFilters[dashboardName]) {
|
|
61
61
|
return [];
|
|
62
62
|
}
|
|
63
|
-
//FIXME: Pretty sure this won't work with multiple dashboards
|
|
64
63
|
return Object.values(dashboardFilters[dashboardName]).map((dashboardFilter) => {
|
|
65
64
|
return dashboardFilter.filter;
|
|
66
65
|
});
|
|
@@ -75,7 +74,7 @@ sectionField, } = {}) => {
|
|
|
75
74
|
const [isCSVLoading, setIsCSVLoading] = useState(false);
|
|
76
75
|
const [isPDFLoading, setIsPDFLoading] = useState(false);
|
|
77
76
|
if (!reportId || !client) {
|
|
78
|
-
return { downloadCSV: () => { }, downloadPDF: () => { },
|
|
77
|
+
return { downloadCSV: () => { }, downloadPDF: () => { }, isPDFLoading: false, isCSVLoading: false };
|
|
79
78
|
}
|
|
80
79
|
return {
|
|
81
80
|
downloadCSV: async () => {
|
|
@@ -100,6 +99,10 @@ sectionField, } = {}) => {
|
|
|
100
99
|
: specificDashboardFilters;
|
|
101
100
|
const { report: fetchedReport } = await fetchReport(reportId, client, true, filters);
|
|
102
101
|
const report = fetchedReport;
|
|
102
|
+
if (report.pivot && report.pivotRows && report.pivotColumns) {
|
|
103
|
+
report.rows = report.pivotRows;
|
|
104
|
+
report.columns = report.pivotColumns;
|
|
105
|
+
}
|
|
103
106
|
let groupedRows = {};
|
|
104
107
|
if (sectionField) {
|
|
105
108
|
groupedRows = (report?.rows || []).reduce((acc, row) => {
|
|
@@ -194,7 +197,6 @@ sectionField, } = {}) => {
|
|
|
194
197
|
// const divContentBuffer = Buffer.from(div.innerHTML, 'utf-8');
|
|
195
198
|
// htmlBuffer = Buffer.concat([htmlBuffer, divContentBuffer]);
|
|
196
199
|
html += div.innerHTML;
|
|
197
|
-
console.log('html', html);
|
|
198
200
|
currentCount = 0;
|
|
199
201
|
}
|
|
200
202
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuill.d.ts","sourceRoot":"","sources":["../../../src/hooks/useQuill.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,WAAW,EAIZ,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,cACR,MAAM,eACJ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,KAC3D;IACD,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,SAAS,EACL,CAAC,CAAC,QAAQ,EAAE,WAAW,KAAK,MAAM,GAAG,SAAS,CAAC,GAC/C,CAAC,MAAM,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"useQuill.d.ts","sourceRoot":"","sources":["../../../src/hooks/useQuill.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,WAAW,EAIZ,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,cACR,MAAM,eACJ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,KAC3D;IACD,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,SAAS,EACL,CAAC,CAAC,QAAQ,EAAE,WAAW,KAAK,MAAM,GAAG,SAAS,CAAC,GAC/C,CAAC,MAAM,SAAS,CAAC,CAAC;CAiNvB,CAAC"}
|
|
@@ -163,8 +163,10 @@ export const useQuill = (reportId, pagination) => {
|
|
|
163
163
|
}, [reportId, specificReportFilters]);
|
|
164
164
|
return {
|
|
165
165
|
data: processedReport ?? null,
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
loading: !reportId
|
|
167
|
+
|| (reports[reportId] || dashboard[reportId])?.loadingRows
|
|
168
|
+
|| !processedReport?.rows
|
|
169
|
+
|| loading,
|
|
168
170
|
error,
|
|
169
171
|
fetchMore,
|
|
170
172
|
setSort,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { QuillReportInternal } from '../models/Report';
|
|
2
|
+
import { DashboardFilter, Filter } from '../models/Filter';
|
|
3
|
+
export declare const useReports: () => {
|
|
4
|
+
reloadFilteredReports: (predicate: (report: QuillReportInternal) => boolean) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare const useReport: (reportId: string) => {
|
|
7
|
+
reload: (overrideFilters: {
|
|
8
|
+
filters: DashboardFilter[];
|
|
9
|
+
editedFilterLabel?: string;
|
|
10
|
+
}, customFilters?: Filter[], initiator?: "Chart" | "useQuill" | "useExport") => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useReport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReport.d.ts","sourceRoot":"","sources":["../../../src/hooks/useReport.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAuB,eAAe,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEhF,eAAO,MAAM,UAAU;uCAYR,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO;CAYtD,CAAC;AAIF,eAAO,MAAM,SAAS,aAAc,MAAM;8BAIrB;QACf,OAAO,EAAE,eAAe,EAAE,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,kBACc,MAAM,EAAE,cACZ,OAAO,GAAG,UAAU,GAAG,WAAW;CAmChD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { DashboardContext, ReportFiltersContext, ReportsContext, } from '../Context';
|
|
3
|
+
import { convertCustomFilter } from '../models/Filter';
|
|
4
|
+
export const useReports = () => {
|
|
5
|
+
const [dashboard, dispatch] = useContext(DashboardContext);
|
|
6
|
+
const reloadReport = (id) => {
|
|
7
|
+
dispatch({
|
|
8
|
+
type: 'UPDATE_DASHBOARD_ITEM',
|
|
9
|
+
id: id,
|
|
10
|
+
data: { triggerReload: true },
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
const reloadFilteredReports = (predicate) => {
|
|
14
|
+
for (const id in dashboard) {
|
|
15
|
+
if (predicate(dashboard[id])) {
|
|
16
|
+
reloadReport(id);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
reloadFilteredReports,
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
// Exposes context operations with the "Report" scope
|
|
25
|
+
// Not meant to be customer facing
|
|
26
|
+
export const useReport = (reportId) => {
|
|
27
|
+
const { loadFiltersForReport } = useContext(ReportFiltersContext);
|
|
28
|
+
const { reports, reportsDispatch } = useContext(ReportsContext);
|
|
29
|
+
const reload = async (overrideFilters, customFilters = [], initiator = 'Chart') => {
|
|
30
|
+
// Set loading member on the report to true
|
|
31
|
+
reportsDispatch({
|
|
32
|
+
type: 'UPDATE_REPORT',
|
|
33
|
+
id: reportId,
|
|
34
|
+
data: { loadingRows: true },
|
|
35
|
+
});
|
|
36
|
+
// Pull the date filter out of the override filters, process it, and append it to the filters
|
|
37
|
+
const dateFilter = overrideFilters.filters.find((f) => f.filterType === 'date_range');
|
|
38
|
+
loadFiltersForReport(reportId, initiator, [
|
|
39
|
+
...(dateFilter
|
|
40
|
+
? [
|
|
41
|
+
{
|
|
42
|
+
...dateFilter,
|
|
43
|
+
dateField: [reports[reportId]?.dateField],
|
|
44
|
+
},
|
|
45
|
+
]
|
|
46
|
+
: []),
|
|
47
|
+
...(overrideFilters.filters.filter((f) => f.filterType !== 'date_range') ?? []),
|
|
48
|
+
], overrideFilters.editedFilterLabel, customFilters.map(convertCustomFilter));
|
|
49
|
+
};
|
|
50
|
+
return { reload };
|
|
51
|
+
};
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -14,7 +14,8 @@ export type { ReportBuilderProps } from './ReportBuilder';
|
|
|
14
14
|
export { default as ChartEditor } from './ChartEditor';
|
|
15
15
|
export type { ChartEditorProps } from './ChartEditor';
|
|
16
16
|
export { quillFormat as format } from './utils/valueFormatter';
|
|
17
|
-
export { useDashboard,
|
|
17
|
+
export { useDashboard, useDashboards } from './hooks/useDashboard';
|
|
18
|
+
export { useReports } from './hooks/useReport';
|
|
18
19
|
export { useQuill } from './hooks/useQuill';
|
|
19
20
|
export { useExport } from './hooks/useExport';
|
|
20
21
|
export { useMemoizedRows } from './hooks/useFormat';
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EACV,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,EACN,mBAAmB,EACnB,WAAW,GACZ,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,YAAY,EACV,6BAA6B,EAC7B,qBAAqB,EACrB,SAAS,GACV,MAAM,wCAAwC,CAAC;AAChD,YAAY,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,iBAAiB,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -7,7 +7,8 @@ export { default as SQLEditor, SchemaListComponent } from './SQLEditor';
|
|
|
7
7
|
export { default as ReportBuilder } from './ReportBuilder';
|
|
8
8
|
export { default as ChartEditor } from './ChartEditor';
|
|
9
9
|
export { quillFormat as format } from './utils/valueFormatter';
|
|
10
|
-
export { useDashboard,
|
|
10
|
+
export { useDashboard, useDashboards } from './hooks/useDashboard';
|
|
11
|
+
export { useReports } from './hooks/useReport';
|
|
11
12
|
export { useQuill } from './hooks/useQuill';
|
|
12
13
|
export { useExport } from './hooks/useExport';
|
|
13
14
|
export { useMemoizedRows } from './hooks/useFormat';
|