@quillsql/react 2.12.26 → 2.12.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/cjs/Chart.d.ts +17 -2
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +110 -80
  4. package/dist/cjs/Context.d.ts +1 -0
  5. package/dist/cjs/Context.d.ts.map +1 -1
  6. package/dist/cjs/Context.js +17 -2
  7. package/dist/cjs/Table.d.ts +15 -1
  8. package/dist/cjs/Table.d.ts.map +1 -1
  9. package/dist/cjs/Table.js +134 -60
  10. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  11. package/dist/cjs/components/Dashboard/DashboardFilter.js +1 -1
  12. package/dist/cjs/utils/dashboard.d.ts +1 -0
  13. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  14. package/dist/cjs/utils/dashboard.js +20 -1
  15. package/dist/cjs/utils/filterProcessing.d.ts +2 -0
  16. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  17. package/dist/cjs/utils/filterProcessing.js +129 -1
  18. package/dist/esm/Chart.d.ts +17 -2
  19. package/dist/esm/Chart.d.ts.map +1 -1
  20. package/dist/esm/Chart.js +113 -83
  21. package/dist/esm/Context.d.ts +1 -0
  22. package/dist/esm/Context.d.ts.map +1 -1
  23. package/dist/esm/Context.js +16 -1
  24. package/dist/esm/Table.d.ts +15 -1
  25. package/dist/esm/Table.d.ts.map +1 -1
  26. package/dist/esm/Table.js +137 -63
  27. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  28. package/dist/esm/components/Dashboard/DashboardFilter.js +1 -1
  29. package/dist/esm/utils/dashboard.d.ts +1 -0
  30. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  31. package/dist/esm/utils/dashboard.js +18 -0
  32. package/dist/esm/utils/filterProcessing.d.ts +2 -0
  33. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  34. package/dist/esm/utils/filterProcessing.js +126 -0
  35. package/package.json +1 -1
package/dist/esm/Table.js CHANGED
@@ -1,13 +1,19 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useContext, useEffect, useMemo } from 'react';
3
- import { ClientContext, CustomFieldContext, DashboardContext, DashboardFiltersContext, } from './Context';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useContext, useEffect, useState, } from 'react';
3
+ import { ClientContext, CustomFieldContext, DashboardContext, DashboardFiltersContext, ReportFiltersContext, } from './Context';
4
4
  import { getData } from './utils/dataFetcher';
5
- import { mergeComparisonRange } from './utils/merge';
6
5
  import QuillTable from './components/QuillTable';
7
- import { useMemoizedRows } from './hooks/useFormat';
8
6
  import { useExport } from './hooks/useExport';
9
7
  import { processFilterErrorList } from './utils/errorProcessing';
10
- import { didFiltersChange } from './Chart';
8
+ import { cleanDashboardItem } from './utils/dashboard';
9
+ import { quillFormat } from './utils/valueFormatter';
10
+ import { processFilterFromBackend, updateFilter, } from './utils/filterProcessing';
11
+ import { QuillFilterContainerComponent, } from './components/UiComponents';
12
+ import { DashboardFilter } from './components/Dashboard/DashboardFilter';
13
+ import { QuillSelectComponent } from './components/QuillSelect';
14
+ import { QuillMultiSelectComponent } from './components/QuillMultiSelect';
15
+ import { QuillDateRangePicker, } from './DateRangePicker/QuillDateRangePicker';
16
+ import { useTheme } from './hooks';
11
17
  /**
12
18
  * ### Quill Table
13
19
  *
@@ -47,69 +53,137 @@ const Table = (props) => {
47
53
  if ('rows' in data && 'columns' in data) {
48
54
  return (_jsx(QuillTable, { hideCSVDownloadButton: data.hideCSVDownloadButton, columns: data.columns, rows: data.rows, className: data.className, containerStyle: data.containerStyle, LoadingComponent: data.LoadingComponent, isLoading: data.isLoading, downloadCSV: data.downloadCSV }));
49
55
  }
50
- return (_jsx(ChartUpdater, { hideCSVDownloadButton: data.hideCSVDownloadButton, dispatch: dispatch, dashboard: dashboard, reportId: data.reportId, className: data.className, containerStyle: data.containerStyle, dashboardFilters: dashboardFilters, client: client, csvFilename: data.csvFilename, LoadingComponent: data.LoadingComponent }));
56
+ return (_jsx(ChartUpdater, { hideCSVDownloadButton: data.hideCSVDownloadButton, dispatch: dispatch, dashboardContext: dashboard, reportId: data.reportId, className: data.className, containerStyle: data.containerStyle, dashboardFilters: dashboardFilters, client: client, csvFilename: data.csvFilename, LoadingComponent: data.LoadingComponent, SelectComponent: data.SelectComponent, MultiSelectComponent: data.MultiSelectComponent, DateRangePickerComponent: data.DateRangePickerComponent, FilterContainerComponent: data.FilterContainerComponent, hideFilters: data.hideFilters }));
51
57
  };
52
- const ChartUpdater = ({ reportId, containerStyle, className, dashboard, dispatch, client, dashboardFilters, csvFilename, hideCSVDownloadButton = true, LoadingComponent, }) => {
53
- const specificDashboardFilter = useMemo(() => {
54
- return dashboardFilters
55
- .sort((filter) => (filter.filterType === 'date_range' ? -1 : 1))
56
- .filter((f) => dashboard &&
57
- dashboard[reportId] &&
58
- f &&
59
- f.dashboardName === dashboard[reportId].dashboardName);
60
- }, [dashboardFilters, dashboard]);
61
- const { rows, loading } = useMemoizedRows(reportId);
58
+ const ChartUpdater = ({ reportId, containerStyle, className, dashboardContext, dispatch, client, dashboardFilters, csvFilename, hideCSVDownloadButton = true, hideFilters = true, LoadingComponent, SelectComponent = QuillSelectComponent, MultiSelectComponent = QuillMultiSelectComponent, DateRangePickerComponent = QuillDateRangePicker, FilterContainerComponent = QuillFilterContainerComponent, }) => {
59
+ const [loading, setLoading] = useState(false);
60
+ const [initialLoad, setInitialLoad] = useState(true);
62
61
  const { downloadCSV } = useExport(reportId);
63
62
  const [customFields] = useContext(CustomFieldContext);
64
- useEffect(() => {
65
- let isSubscribed = true;
66
- async function getChartOptions() {
67
- if (!didFiltersChange(dashboard[reportId], specificDashboardFilter)) {
68
- return;
69
- }
70
- if (isSubscribed) {
71
- try {
72
- const hostedBody = {
73
- metadata: {
74
- dashboardItemId: reportId,
75
- orgId: client.customerId || '*',
76
- task: 'item',
77
- filters: [...Object.values(specificDashboardFilter)],
78
- clientId: client.publicKey,
79
- databaseType: client?.databaseType,
80
- customFields,
81
- },
82
- };
83
- const cloudBody = {
84
- id: reportId,
85
- filters: [...Object.values(specificDashboardFilter)],
86
- };
87
- const resp = await getData(client, 'itempost', 'omit', hostedBody, cloudBody);
88
- processFilterErrorList(resp);
89
- if (resp && resp.name !== 'error') {
90
- if (resp.compareRows) {
91
- mergeComparisonRange(resp);
92
- }
93
- dispatch({
94
- type: 'UPDATE_DASHBOARD_ITEM',
95
- id: reportId,
96
- data: {
97
- ...resp,
98
- filtersApplied: specificDashboardFilter,
99
- },
100
- });
101
- }
63
+ const [rows, setRows] = useState([]);
64
+ const [columns, setColumns] = useState([]);
65
+ const [tableFilters, setTableFilters] = useState([]);
66
+ const [filterUpdateIndex, setFilterUpdateIndex] = useState(0);
67
+ const { reportFiltersDispatch, reportFilters } = useContext(ReportFiltersContext);
68
+ const theme = useTheme();
69
+ const getChartData = async (reportFilterInfo) => {
70
+ try {
71
+ const filters = reportFilterInfo.filters;
72
+ setLoading(true);
73
+ const hostedBody = {
74
+ metadata: {
75
+ dashboardItemId: reportId,
76
+ orgId: client.customerId || '*',
77
+ clientId: client.publicKey,
78
+ task: 'item',
79
+ getDefaultDashboardFilters: filters ? false : true,
80
+ databaseType: client?.databaseType,
81
+ customFields,
82
+ filters,
83
+ },
84
+ };
85
+ const cloudBody = {
86
+ id: reportId,
87
+ };
88
+ const resp = await getData(client, 'itempost', 'same-origin', hostedBody, cloudBody);
89
+ processFilterErrorList(resp);
90
+ if (resp && resp.name !== 'error' && !resp.errorMessage) {
91
+ const cleanedReport = await cleanDashboardItem(resp, filters ? filters : resp.filters);
92
+ if (cleanedReport.chartType === 'table' && cleanedReport.pivot) {
93
+ cleanedReport.columns = cleanedReport.yAxisFields;
102
94
  }
103
- catch (e) {
104
- console.log('Error fetching chart: ', e);
95
+ let filterArray = filters;
96
+ if (!filterArray) {
97
+ filterArray = resp.filters.map((filter) => {
98
+ return processFilterFromBackend(filter, resp.rows);
99
+ });
100
+ reportFiltersDispatch({
101
+ type: 'UPDATE_REPORT_FILTER',
102
+ id: reportId,
103
+ data: {
104
+ filters: filterArray,
105
+ updateIndex: reportFilterInfo.updateIndex,
106
+ },
107
+ });
105
108
  }
109
+ setFilterUpdateIndex(reportFilterInfo.updateIndex);
110
+ setTableFilters(filterArray);
106
111
  }
112
+ setRows(resp.rows.map((row) => {
113
+ return resp.columns.reduce((formattedRow, column) => {
114
+ // Apply the format function to each field in the row
115
+ const formattedValue = quillFormat({
116
+ value: row[column.field],
117
+ format: column.format,
118
+ });
119
+ formattedRow[column.field] = formattedValue;
120
+ return formattedRow;
121
+ }, {});
122
+ }));
123
+ setColumns(resp.columns);
124
+ setLoading(false);
125
+ }
126
+ catch (e) {
127
+ console.log('Error fetching chart: ', e);
128
+ setLoading(false);
129
+ }
130
+ };
131
+ useEffect(() => {
132
+ // IF WE HAVE THE DATA IN DASHBOARD CONTEXT AND IT IS THE INITIAL LAOD DON'T FETCH DATA
133
+ if (initialLoad && dashboardContext[reportId]) {
134
+ setInitialLoad(false);
135
+ return;
136
+ }
137
+ setInitialLoad(false);
138
+ let parsedReportFilters = reportFilters[reportId]
139
+ ? reportFilters[reportId]
140
+ : { updateIndex: 0 };
141
+ getChartData(parsedReportFilters);
142
+ }, [client.customerId, reportId, reportFilters[reportId]?.updateIndex]);
143
+ useEffect(() => {
144
+ if (!dashboardContext || !dashboardContext[reportId]) {
145
+ return;
107
146
  }
108
- getChartOptions();
109
- return () => {
110
- isSubscribed = false;
111
- };
112
- }, [specificDashboardFilter, client.customerId, reportId]);
113
- return (_jsx(QuillTable, { hideCSVDownloadButton: hideCSVDownloadButton, columns: dashboard[reportId]?.columns || [], rows: rows || dashboard[reportId]?.rows || [], containerStyle: containerStyle, className: className, LoadingComponent: LoadingComponent, isLoading: loading, downloadCSV: downloadCSV }));
147
+ setRows(dashboardContext[reportId].rows.map((row) => {
148
+ return dashboardContext[reportId].columns.reduce((formattedRow, column) => {
149
+ // Apply the format function to each field in the row
150
+ const formattedValue = quillFormat({
151
+ value: row[column.field],
152
+ format: column.format,
153
+ });
154
+ formattedRow[column.field] = formattedValue;
155
+ return formattedRow;
156
+ }, {});
157
+ }));
158
+ setColumns(dashboardContext[reportId].columns);
159
+ }, []);
160
+ return (_jsxs("div", { children: [!hideFilters && (_jsx("div", { style: {
161
+ display: 'flex',
162
+ boxSizing: 'content-box',
163
+ flexDirection: 'row',
164
+ alignItems: 'center',
165
+ }, children: _jsx(FilterContainerComponent, { children: tableFilters.map((filter, index) => (_jsx(DashboardFilter, { filter: filter, onChangeFilter: (filter, value = null, comparison = null) => {
166
+ const updatedFilters = tableFilters.map((f) => {
167
+ if (f.field === filter.field ||
168
+ (f.filterType === 'date_range' &&
169
+ filter.filterType === 'date_range')) {
170
+ return updateFilter(f, value, comparison);
171
+ }
172
+ return f;
173
+ });
174
+ setTableFilters(updatedFilters);
175
+ getChartData({
176
+ filters: updatedFilters,
177
+ updateIndex: filterUpdateIndex + 1,
178
+ });
179
+ reportFiltersDispatch({
180
+ type: 'UPDATE_REPORT_FILTER',
181
+ id: reportId,
182
+ data: {
183
+ filters: updatedFilters,
184
+ updateIndex: filterUpdateIndex + 1,
185
+ },
186
+ });
187
+ }, theme: theme, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, DateRangePickerComponent: DateRangePickerComponent }, index))) }) })), _jsx(QuillTable, { hideCSVDownloadButton: hideCSVDownloadButton, columns: columns ?? [], rows: rows ?? [], containerStyle: containerStyle, className: className, LoadingComponent: LoadingComponent, isLoading: loading, downloadCSV: downloadCSV })] }));
114
188
  };
115
189
  export default Table;
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DashboardFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAIhG,KAAK,mBAAmB,GAAG,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACjE,KAAK,GAAG,CAAC,OAAO,CAAC;AAElB,KAAK,wBAAwB,GAAG,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACjE,KAAK,GAAG,CAAC,OAAO,CAAC;AAElB,KAAK,4BAA4B,GAAG,CAAC,EACnC,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,MAAM,EACN,WAAW,GACZ,EAAE,6BAA6B,KAAK,GAAG,CAAC,OAAO,CAAC;AAEjD,UAAU,oBAAoB;IAC5B,MAAM,EAAE,GAAG,CAAC;IACZ,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACzC,eAAe,EACX,mBAAmB,GACnB,KAAK,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IACnD,oBAAoB,EAChB,wBAAwB,GACxB,KAAK,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IACxD,wBAAwB,EACpB,4BAA4B,GAC5B,KAAK,CAAC,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IAC5D,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,cAAc,EACd,eAAsC,EACtC,oBAAgD,EAChD,wBAAwB,EACxB,KAAK,GACN,EAAE,oBAAoB,kDAoItB"}
1
+ {"version":3,"file":"DashboardFilter.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DashboardFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAIhG,KAAK,mBAAmB,GAAG,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACjE,KAAK,GAAG,CAAC,OAAO,CAAC;AAElB,KAAK,wBAAwB,GAAG,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACjE,KAAK,GAAG,CAAC,OAAO,CAAC;AAElB,KAAK,4BAA4B,GAAG,CAAC,EACnC,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,MAAM,EACN,WAAW,GACZ,EAAE,6BAA6B,KAAK,GAAG,CAAC,OAAO,CAAC;AAEjD,UAAU,oBAAoB;IAC5B,MAAM,EAAE,GAAG,CAAC;IACZ,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACzC,eAAe,EACX,mBAAmB,GACnB,KAAK,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IACnD,oBAAoB,EAChB,wBAAwB,GACxB,KAAK,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IACxD,wBAAwB,EACpB,4BAA4B,GAC5B,KAAK,CAAC,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IAC5D,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,cAAc,EACd,eAAsC,EACtC,oBAAgD,EAChD,wBAAwB,EACxB,KAAK,GACN,EAAE,oBAAoB,kDAmItB"}
@@ -16,7 +16,7 @@ export function DashboardFilter({ filter, onChangeFilter, SelectComponent = Quil
16
16
  }
17
17
  }, [filter]);
18
18
  if (filter.filterType === 'string') {
19
- if (!filter.options) {
19
+ if (!filter.options || filter.options.length === 0) {
20
20
  return null;
21
21
  }
22
22
  if (filter.stringFilterType === 'multiselect') {
@@ -9,4 +9,5 @@ import { QuillReportInternal } from '../Dashboard';
9
9
  export declare function cleanDashboardItem(item: {
10
10
  [key: string]: any;
11
11
  } | undefined, dashboardFilters: any, client?: any, dateBucket?: string): Promise<QuillReportInternal>;
12
+ export declare function getDashboard(dashboardName: string, client: any): Promise<any>;
12
13
  //# sourceMappingURL=dashboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAkC5E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CA+C9B"}
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/utils/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAkC5E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,SAAS,EACxC,gBAAgB,EAAE,GAAG,EACrB,MAAM,CAAC,EAAE,GAAG,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CA+C9B;AAwQD,wBAAsB,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAI,OAAO,CAAC,GAAG,CAAC,CA0BpF"}
@@ -274,3 +274,21 @@ function extractPivotedYAxis(pivotTable, itemInfo, config = undefined) {
274
274
  }
275
275
  return fields;
276
276
  }
277
+ export async function getDashboard(dashboardName, client) {
278
+ const searchParams = new URLSearchParams({
279
+ publicKey: client.publicKey,
280
+ orgId: client.customerId,
281
+ name: dashboardName,
282
+ }).toString();
283
+ const hostedBody = {
284
+ metadata: {
285
+ name: dashboardName,
286
+ task: 'config',
287
+ clientId: client.publicKey,
288
+ orgId: client.customerId || '*',
289
+ databaseType: client.databaseType,
290
+ },
291
+ };
292
+ const resp = await getData(client, `dashconfig?${searchParams}`, 'omit', hostedBody, null, 'GET');
293
+ return resp;
294
+ }
@@ -1,2 +1,4 @@
1
1
  export declare function findAndProcessDateFilter(filters: any[]): any;
2
+ export declare function processFilterFromBackend(filter: any, rows: any[]): any;
3
+ export declare function updateFilter(filter: any, value?: any, comparison?: any): any;
2
4
  //# sourceMappingURL=filterProcessing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAoB5D"}
1
+ {"version":3,"file":"filterProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/filterProcessing.ts"],"names":[],"mappings":"AAQA,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAoB5D;AAMD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OA4BhE;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,GAAG,EACX,KAAK,GAAE,GAAU,EACjB,UAAU,GAAE,GAAU,OAuGvB"}
@@ -1,3 +1,4 @@
1
+ import { COMPARISON_RANGE, PRIMARY_RANGE, defaultOptionsV2, getRangeFromPresetOptions, } from '../DateRangePicker/dateRangePickerUtils';
1
2
  export function findAndProcessDateFilter(filters) {
2
3
  let dateFilter = filters.find((filter) => filter.filterType === 'date_range');
3
4
  if (dateFilter) {
@@ -19,3 +20,128 @@ export function findAndProcessDateFilter(filters) {
19
20
  function isValidDate(date) {
20
21
  return !isNaN(Date.parse(date));
21
22
  }
23
+ export function processFilterFromBackend(filter, rows) {
24
+ if (filter.filterType === 'date_range') {
25
+ return {
26
+ ...filter,
27
+ startDate: new Date(filter.startDate),
28
+ endDate: new Date(filter.endDate),
29
+ options: defaultOptionsV2,
30
+ comparisonRange: {
31
+ ...filter.comparisonRange,
32
+ value: filter.defaultComparisonRange,
33
+ },
34
+ };
35
+ }
36
+ if (filter.filterType === 'string') {
37
+ const options = rows.map((row) => row[filter.field]);
38
+ const distinctOptions = Array.from(new Set(options)).filter((value) => value !== undefined && value !== null);
39
+ return {
40
+ ...filter,
41
+ options: distinctOptions.map((option) => ({
42
+ label: option,
43
+ value: option,
44
+ })),
45
+ };
46
+ }
47
+ return filter;
48
+ }
49
+ export function updateFilter(filter, value = null, comparison = null) {
50
+ //for dateObjects only, since values are arrays for dateObjects
51
+ const { selectedValue: _, operator, ...filterWithoutSelectedValue } = filter; // _ is a throwaway variable
52
+ if (filter.filterType === 'string') {
53
+ let selectedValue = {};
54
+ if (value) {
55
+ if (filter.stringFilterType === 'multiselect') {
56
+ const parsedValue = JSON.parse(value);
57
+ if (parsedValue.length === 0) {
58
+ selectedValue = { values: [] };
59
+ }
60
+ else {
61
+ selectedValue = { values: parsedValue, operator: 'IN' };
62
+ }
63
+ }
64
+ else {
65
+ selectedValue = { selectedValue: value };
66
+ }
67
+ }
68
+ return {
69
+ ...filterWithoutSelectedValue,
70
+ ...selectedValue,
71
+ dashboardName: name,
72
+ };
73
+ }
74
+ if (filter.filterType === 'date' || filter.filterType === 'date_range') {
75
+ let presetsOptions = defaultOptionsV2;
76
+ if (filter.presetRanges) {
77
+ presetsOptions = filter.presetRanges.map((elem) => {
78
+ if (!elem.isStatic) {
79
+ return {
80
+ label: elem.label,
81
+ value: elem.value,
82
+ startDate: PRIMARY_RANGE[elem.value].start,
83
+ endDate: PRIMARY_RANGE[elem.value].end,
84
+ };
85
+ }
86
+ return {
87
+ label: elem.label,
88
+ value: elem.value,
89
+ startDate: new Date(elem.startDate),
90
+ endDate: new Date(elem.endDate),
91
+ };
92
+ });
93
+ }
94
+ if (comparison ||
95
+ (filter.comparison && filter.comparisonRange.value !== 'NO_COMPARISON')) {
96
+ let preset = '';
97
+ if (comparison) {
98
+ preset = filter.preset.label;
99
+ }
100
+ const key = comparison?.value || filter.comparisonRange.value;
101
+ let primaryRange = {
102
+ start: value ? value.startDate : filter.startDate,
103
+ end: value ? value.endDate : filter.endDate,
104
+ };
105
+ if (value && value.preset) {
106
+ preset = value.preset;
107
+ primaryRange = getRangeFromPresetOptions(value.preset, presetsOptions);
108
+ }
109
+ return {
110
+ startDate: primaryRange.start,
111
+ endDate: primaryRange.end,
112
+ filterType: 'date_range',
113
+ label: 'Date',
114
+ field: 'date_range',
115
+ preset: { label: preset },
116
+ options: filter.options,
117
+ comparison: true,
118
+ comparisonRange: {
119
+ startDate: COMPARISON_RANGE[key](primaryRange)?.start,
120
+ endDate: COMPARISON_RANGE[key](primaryRange)?.end,
121
+ value: key,
122
+ },
123
+ dashboardName: name,
124
+ };
125
+ }
126
+ else {
127
+ const primaryRange = value && value.preset
128
+ ? getRangeFromPresetOptions(value.preset, presetsOptions)
129
+ : {
130
+ start: value?.startDate || filter.startDate,
131
+ end: value?.endDate || filter.endDate,
132
+ };
133
+ const preset = value?.preset ? value.preset : '';
134
+ return {
135
+ ...filter,
136
+ preset: { label: preset },
137
+ startDate: primaryRange.start,
138
+ endDate: primaryRange.end,
139
+ filterType: 'date_range',
140
+ field: 'date_range',
141
+ options: filter.options,
142
+ label: 'Date',
143
+ dashboardName: name,
144
+ };
145
+ }
146
+ }
147
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillsql/react",
3
- "version": "2.12.26",
3
+ "version": "2.12.27",
4
4
  "exports": {
5
5
  ".": {
6
6
  "import": "./dist/esm/index.js",