@quillsql/react 2.13.1 → 2.13.2

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 (87) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +4 -2
  3. package/dist/cjs/ChartBuilder.d.ts +4 -1
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +5 -5
  6. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  7. package/dist/cjs/ChartEditor.js +40 -17
  8. package/dist/cjs/Context.d.ts +1 -1
  9. package/dist/cjs/Context.d.ts.map +1 -1
  10. package/dist/cjs/Context.js +5 -25
  11. package/dist/cjs/Dashboard.d.ts +4 -1
  12. package/dist/cjs/Dashboard.d.ts.map +1 -1
  13. package/dist/cjs/Dashboard.js +34 -44
  14. package/dist/cjs/Table.d.ts.map +1 -1
  15. package/dist/cjs/Table.js +5 -2
  16. package/dist/cjs/components/Dashboard/DataLoader.d.ts +6 -4
  17. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  18. package/dist/cjs/components/Dashboard/DataLoader.js +74 -67
  19. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  20. package/dist/cjs/components/Dashboard/TableComponent.js +8 -1
  21. package/dist/cjs/components/QuillTable.d.ts +1 -1
  22. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  23. package/dist/cjs/components/QuillTable.js +17 -14
  24. package/dist/cjs/components/ReportBuilder/ui.d.ts +0 -1
  25. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  26. package/dist/cjs/components/ReportBuilder/ui.js +1 -13
  27. package/dist/cjs/components/UiComponents.d.ts +1 -1
  28. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  29. package/dist/cjs/components/UiComponents.js +3 -3
  30. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  31. package/dist/cjs/hooks/useDashboard.js +9 -13
  32. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  33. package/dist/cjs/hooks/useQuill.js +3 -1
  34. package/dist/cjs/models/Dashboard.d.ts +1 -1
  35. package/dist/cjs/models/Dashboard.d.ts.map +1 -1
  36. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  37. package/dist/cjs/utils/dashboard.js +3 -2
  38. package/dist/cjs/utils/report.d.ts +2 -2
  39. package/dist/cjs/utils/report.d.ts.map +1 -1
  40. package/dist/cjs/utils/report.js +5 -4
  41. package/dist/cjs/utils/tableProcessing.d.ts +2 -2
  42. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  43. package/dist/cjs/utils/tableProcessing.js +3 -1
  44. package/dist/esm/Chart.d.ts.map +1 -1
  45. package/dist/esm/Chart.js +4 -2
  46. package/dist/esm/ChartBuilder.d.ts +4 -1
  47. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  48. package/dist/esm/ChartBuilder.js +5 -5
  49. package/dist/esm/ChartEditor.d.ts.map +1 -1
  50. package/dist/esm/ChartEditor.js +41 -18
  51. package/dist/esm/Context.d.ts +1 -1
  52. package/dist/esm/Context.d.ts.map +1 -1
  53. package/dist/esm/Context.js +5 -25
  54. package/dist/esm/Dashboard.d.ts +4 -1
  55. package/dist/esm/Dashboard.d.ts.map +1 -1
  56. package/dist/esm/Dashboard.js +34 -44
  57. package/dist/esm/Table.d.ts.map +1 -1
  58. package/dist/esm/Table.js +5 -2
  59. package/dist/esm/components/Dashboard/DataLoader.d.ts +6 -4
  60. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  61. package/dist/esm/components/Dashboard/DataLoader.js +75 -68
  62. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  63. package/dist/esm/components/Dashboard/TableComponent.js +8 -1
  64. package/dist/esm/components/QuillTable.d.ts +1 -1
  65. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  66. package/dist/esm/components/QuillTable.js +17 -14
  67. package/dist/esm/components/ReportBuilder/ui.d.ts +0 -1
  68. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  69. package/dist/esm/components/ReportBuilder/ui.js +0 -8
  70. package/dist/esm/components/UiComponents.d.ts +1 -1
  71. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  72. package/dist/esm/components/UiComponents.js +3 -3
  73. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  74. package/dist/esm/hooks/useDashboard.js +9 -13
  75. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  76. package/dist/esm/hooks/useQuill.js +3 -1
  77. package/dist/esm/models/Dashboard.d.ts +1 -1
  78. package/dist/esm/models/Dashboard.d.ts.map +1 -1
  79. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  80. package/dist/esm/utils/dashboard.js +3 -2
  81. package/dist/esm/utils/report.d.ts +2 -2
  82. package/dist/esm/utils/report.d.ts.map +1 -1
  83. package/dist/esm/utils/report.js +5 -4
  84. package/dist/esm/utils/tableProcessing.d.ts +2 -2
  85. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  86. package/dist/esm/utils/tableProcessing.js +3 -1
  87. package/package.json +1 -1
@@ -55,6 +55,7 @@ const TemplateMetricComponent_1 = __importDefault(require("./components/Dashboar
55
55
  const TemplateTableComponent_1 = __importDefault(require("./components/Dashboard/TemplateTableComponent"));
56
56
  const DashboardTemplate_1 = __importDefault(require("./components/Dashboard/DashboardTemplate"));
57
57
  const Filter_2 = require("./models/Filter");
58
+ const paginationProcessing_1 = require("./utils/paginationProcessing");
58
59
  const defaultChartContainerStyles = {
59
60
  display: 'flex',
60
61
  width: '100%',
@@ -110,15 +111,15 @@ const sortByOrdering = (a, b) => {
110
111
  * ### API Reference
111
112
  * @see https://docs.quillsql.com/components/dashboard
112
113
  */
113
- function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithCombo_1.QuillSelectComponentWithCombo, MultiSelectComponent = QuillMultiSelectWithCombo_1.QuillMultiSelectComponentWithCombo, ModalComponent = UiComponents_1.QuillModalComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, FilterTagComponent = ui_1.QuillFilterPopover, PopoverComponent = UiComponents_1.MemoizedPopover, TextInputComponent = UiComponents_1.QuillTextInput, EmptyDashboardComponent = UiComponents_1.QuillEmptyDashboardComponent, DateRangePickerComponent = QuillDateRangePicker_1.QuillDateRangePicker, MetricComponent = MetricComponent_1.default, ChartComponent = ChartComponent_1.default, TableComponent = TableComponent_1.default, TemplateMetricComponent = TemplateMetricComponent_1.default, TemplateChartComponent = TemplateChartComponent_1.default, TemplateTableComponent = TemplateTableComponent_1.default, DashboardSectionComponent = DashboardSection_1.default, DashboardSectionContainerComponent = DashboardSectionContainer_1.default, FilterContainerComponent = UiComponents_1.QuillFilterContainerComponent, DashboardLoadingComponent = UiComponents_1.QuillLoadingDashboardComponent, ErrorComponent = ChartError_1.QuillChartErrorWithAction, onClickReport, hoverActions, onChangeLoading, hideFilters, hideXAxis = false, hideYAxis = false, hideCartesianGrid = false, comparisonLineStyle = 'solid', containerStyle, className, chartContainerStyle = defaultChartContainerStyles, filters, onClickChartElement, dateBucket, additionalProcessing, hideAdminErrors = true, templateDashboardName, }) {
114
+ function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithCombo_1.QuillSelectComponentWithCombo, MultiSelectComponent = QuillMultiSelectWithCombo_1.QuillMultiSelectComponentWithCombo, ModalComponent = UiComponents_1.QuillModalComponent, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, FilterTagComponent = ui_1.QuillFilterPopover, PopoverComponent = UiComponents_1.MemoizedPopover, TextInputComponent = UiComponents_1.QuillTextInput, EmptyDashboardComponent = UiComponents_1.QuillEmptyDashboardComponent, DateRangePickerComponent = QuillDateRangePicker_1.QuillDateRangePicker, MetricComponent = MetricComponent_1.default, ChartComponent = ChartComponent_1.default, TableComponent = TableComponent_1.default, TemplateMetricComponent = TemplateMetricComponent_1.default, TemplateChartComponent = TemplateChartComponent_1.default, TemplateTableComponent = TemplateTableComponent_1.default, DashboardSectionComponent = DashboardSection_1.default, DashboardSectionContainerComponent = DashboardSectionContainer_1.default, FilterContainerComponent = UiComponents_1.QuillFilterContainerComponent, DashboardLoadingComponent = UiComponents_1.QuillLoadingDashboardComponent, ErrorComponent = ChartError_1.QuillChartErrorWithAction, onClickReport, hoverActions, onChangeLoading, hideFilters, hideXAxis = false, hideYAxis = false, hideCartesianGrid = false, comparisonLineStyle = 'solid', containerStyle, className, chartContainerStyle = defaultChartContainerStyles,
115
+ // TODO: do something with these custom filters
116
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
117
+ filters, onClickChartElement, dateBucket, additionalProcessing, hideAdminErrors = true, templateDashboardName, pagination = { rowsPerPage: 10, rowsPerRequest: 50 }, }) {
114
118
  const { isLoading, data, isDashboardFilterLoading, dashboardFilters: populatedDashboardFilters, reload, } = (0, useDashboard_1.useDashboard)(name);
115
119
  const [client, isClientLoading] = (0, react_1.useContext)(Context_1.ClientContext);
116
120
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
117
- const [initialLoad, setInitialLoad] = (0, react_1.useState)(true);
118
121
  const { dispatch: dashboardFiltersDispatch } = (0, react_1.useContext)(Context_1.DashboardFiltersContext);
119
122
  const [schemaData] = (0, react_1.useContext)(Context_1.SchemaDataContext);
120
- const [filterSchemaIsLoaded, setFilterSchemaIsLoaded] = (0, react_1.useState)(false);
121
- const [filterSchema, setFilterSchema] = (0, react_1.useState)({ columns: [] }); // Schema to be passed into FilterModal
122
123
  const [fieldValuesMap, setFieldValuesMap] = (0, react_1.useState)({}); // Mapping of unique values per field, used in string filter 'in' and 'not in'
123
124
  const [referencedTables, setReferencedTables] = (0, react_1.useState)([]); // Intersection of tables referenced in the dashboard
124
125
  const [fieldValuesIsLoaded, setFieldValuesIsLoaded] = (0, react_1.useState)(false);
@@ -183,11 +184,6 @@ function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithComb
183
184
  Filter_1.NullOperator.IsNull,
184
185
  ],
185
186
  };
186
- (0, react_1.useEffect)(() => {
187
- if (!data)
188
- return;
189
- onDashboardDataChange(data, schemaData.schema);
190
- }, [data, filters, schemaData.schema]);
191
187
  // Go through all columns in the referenced tables and get the unique values to use in fieldValuesMap
192
188
  (0, react_1.useEffect)(() => {
193
189
  const fetchData = async () => {
@@ -212,22 +208,18 @@ function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithComb
212
208
  fetchData();
213
209
  }
214
210
  }, [referencedTables]);
215
- // Get the relevant information from the dashboard and schema to pass to FilterModal
216
- const updateFilterSchema = (sections, schema) => {
217
- if (!sections || !schema || schema.length === 0) {
218
- return;
211
+ const filterSchema = (0, react_1.useMemo)(() => {
212
+ if (!data?.sections ||
213
+ !schemaData.schema ||
214
+ schemaData.schema.length === 0) {
215
+ return { columns: [] };
219
216
  }
220
- setFilterSchemaIsLoaded(false);
217
+ const sections = data?.sections;
218
+ const schema = schemaData.schema;
221
219
  // find intersection of all referenced tables
222
- const tables = Object.keys(sections)
223
- .map((section) => {
224
- return sections[section].map((chart) => {
225
- return chart.referencedTables;
226
- });
227
- })
228
- .reduce((accumulator, currentArray) => {
229
- return accumulator.concat(currentArray);
230
- }, []);
220
+ const tables = Object.values(sections)
221
+ .flatMap((section) => section.map((chart) => chart.referencedTables))
222
+ .flat();
231
223
  if (tables && tables.length > 0) {
232
224
  let intersection = new Set(tables[0]);
233
225
  for (let i = 1; i < tables.length; ++i) {
@@ -251,23 +243,13 @@ function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithComb
251
243
  .reduce((accumulator, currentArray) => {
252
244
  return accumulator.concat(currentArray);
253
245
  }, []);
254
- setFilterSchema({ columns });
246
+ return { columns };
255
247
  }
256
248
  else {
257
- setFilterSchema({ columns: [] });
249
+ return { columns: [] };
258
250
  }
259
- setFilterSchemaIsLoaded(true);
260
- };
261
- const onDashboardDataChange = (resp, schema) => {
262
- // setDashboardSections(resp.sections ?? {});
263
- updateFilterSchema(resp.sections, schema);
264
- setInitialLoad(false);
265
- };
266
- const handleOnClickDashboardItem = (elem) => {
267
- if (onClickReport) {
268
- onClickReport({ ...elem, _id: elem.id });
269
- }
270
- };
251
+ }, [data?.sections, schemaData.schema]);
252
+ const handleOnClickDashboardItem = (elem) => onClickReport && onClickReport({ ...elem, _id: elem.id });
271
253
  const updateFilter = (filter, value = null, comparison = null) => {
272
254
  if (!populatedDashboardFilters)
273
255
  return;
@@ -380,10 +362,10 @@ function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithComb
380
362
  }));
381
363
  };
382
364
  (0, react_1.useEffect)(() => {
383
- if (onChangeLoading) {
384
- onChangeLoading(isLoading || initialLoad);
365
+ if (onChangeLoading && isLoading) {
366
+ onChangeLoading(isLoading);
385
367
  }
386
- }, [isLoading, initialLoad, onChangeLoading]);
368
+ }, [isLoading, onChangeLoading]);
387
369
  if (!isLoading &&
388
370
  (Object.keys(data?.sections ?? {}).length === 0 ||
389
371
  Object.values(data?.sections ?? {})[0]?.length === 0)) {
@@ -394,7 +376,6 @@ function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithComb
394
376
  }
395
377
  return ((0, jsx_runtime_1.jsxs)("div", { className: className, ...(0, styles_1.styleToProps)(containerStyle), children: [data &&
396
378
  data.customFiltersEnabled &&
397
- filterSchemaIsLoaded &&
398
379
  !hideAdminErrors &&
399
380
  !hideFilters &&
400
381
  data &&
@@ -465,13 +446,19 @@ function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithComb
465
446
  textAlign: 'left',
466
447
  marginTop: 12,
467
448
  }, children: section })] })), metrics(data.sections, section, sortByOrdering).length > 0 && ((0, jsx_runtime_1.jsx)(DashboardSectionComponent, { section: "metrics", children: metrics(data.sections, section, sortByOrdering).map((item, index) => {
468
- return ((0, jsx_runtime_1.jsx)(DataLoader_1.default, { item: item, filters: populatedDashboardFilters, children: ({ isLoading, error, data, }) => ((0, jsx_runtime_1.jsx)(MetricComponent, { error: error, isLoading: isLoading, report: data, onClick: !isLoading && onClickReport
449
+ return ((0, jsx_runtime_1.jsx)(DataLoader_1.default, { item: item, filters: populatedDashboardFilters, additionalProcessing: {
450
+ page: paginationProcessing_1.DEFAULT_PAGINATION,
451
+ last: additionalProcessing?.last,
452
+ }, children: ({ isLoading, error, data, }) => ((0, jsx_runtime_1.jsx)(MetricComponent, { error: error, isLoading: isLoading, report: data, onClick: !isLoading && onClickReport
469
453
  ? () => handleOnClickDashboardItem({
470
454
  ...item,
471
455
  ...data,
472
456
  })
473
457
  : () => { }, hoverActions: hoverActions }, item.name + '' + index)) }, `metric${index}`));
474
- }) })), charts(data.sections, section, sortByOrdering).length > 0 && ((0, jsx_runtime_1.jsx)(DashboardSectionComponent, { section: "charts", children: charts(data.sections, section, sortByOrdering).map((item, index) => ((0, jsx_runtime_1.jsx)(DataLoader_1.ChartDataLoader, { item: item, dateBucket: dateBucket, additionalProcessing: additionalProcessing, filters: populatedDashboardFilters, children: ({ isLoading, data, error, dateBucket, }) => ((0, jsx_runtime_1.jsx)(ChartComponent, { report: data, error: error, onClick: () => {
458
+ }) })), charts(data.sections, section, sortByOrdering).length > 0 && ((0, jsx_runtime_1.jsx)(DashboardSectionComponent, { section: "charts", children: charts(data.sections, section, sortByOrdering).map((item, index) => ((0, jsx_runtime_1.jsx)(DataLoader_1.ChartDataLoader, { item: item, dateBucket: dateBucket, additionalProcessing: {
459
+ page: pagination,
460
+ last: additionalProcessing?.last,
461
+ }, filters: populatedDashboardFilters, children: ({ isLoading, data, error, dateBucket, }) => ((0, jsx_runtime_1.jsx)(ChartComponent, { report: data, error: error, onClick: () => {
475
462
  if (!isLoading && onClickReport) {
476
463
  handleOnClickDashboardItem({
477
464
  ...item,
@@ -483,7 +470,10 @@ function Dashboard({ name, hidden = false, SelectComponent = QuillSelectWithComb
483
470
  height: 300,
484
471
  } })) : ((0, jsx_runtime_1.jsx)(Chart_1.ChartDisplay, { reportId: data.id, config: data, loading: isLoading, containerStyle: chartContainerStyle, colors: theme.chartColors?.length
485
472
  ? theme.chartColors
486
- : undefined, scrollable: false, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle, onClickChartElement: onClickChartElement })) }, item.name + '' + index)) }, `chart${index}`))) })), tables(data.sections, section, sortByOrdering).length > 0 && ((0, jsx_runtime_1.jsx)(DashboardSectionComponent, { section: "tables", children: tables(data.sections, section, sortByOrdering).map((item, index) => ((0, jsx_runtime_1.jsx)(DataLoader_1.default, { item: item, filters: populatedDashboardFilters, children: ({ isLoading, error, onPageChange, onSortChange, data, rowCount, rowCountIsLoading, }) => ((0, jsx_runtime_1.jsx)(TableComponent, { report: data, isLoading: isLoading, error: error, onClick: !isLoading && onClickReport
473
+ : undefined, scrollable: false, hideXAxis: hideXAxis, hideYAxis: hideYAxis, hideCartesianGrid: hideCartesianGrid, comparisonLineStyle: comparisonLineStyle, onClickChartElement: onClickChartElement })) }, item.name + '' + index)) }, `chart${index}`))) })), tables(data.sections, section, sortByOrdering).length > 0 && ((0, jsx_runtime_1.jsx)(DashboardSectionComponent, { section: "tables", children: tables(data.sections, section, sortByOrdering).map((item, index) => ((0, jsx_runtime_1.jsx)(DataLoader_1.default, { item: item, filters: populatedDashboardFilters, additionalProcessing: {
474
+ page: pagination,
475
+ last: additionalProcessing?.last,
476
+ }, children: ({ isLoading, error, onPageChange, onSortChange, data, rowCount, rowCountIsLoading, }) => ((0, jsx_runtime_1.jsx)(TableComponent, { report: data, isLoading: isLoading, error: error, onClick: !isLoading && onClickReport
487
477
  ? () => handleOnClickDashboardItem({
488
478
  ...item,
489
479
  ...data,
@@ -1 +1 @@
1
- {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/Table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,WAAW,EACX,SAAS,EAIV,MAAM,OAAO,CAAC;AAcf,OAAO,EACL,yBAAyB,EAEzB,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAuBnC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAwDD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,CAAC;IAEhC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IAEJ;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IAErC,oDAAoD;IACpD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAE/D,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,GAAG,CAAC,OAAO,CAAC;IAEzE,+DAA+D;IAC/D,wBAAwB,CAAC,EAAE,CAAC,EAC1B,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,WAAW,EACX,iBAAiB,EACjB,cAAc,GACf,EAAE;QACD,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE;YAAE,SAAS,EAAE,IAAI,CAAC;YAAC,OAAO,EAAE,IAAI,CAAA;SAAE,CAAC;QAC9C,aAAa,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAClD,iBAAiB,EAAE,CAAC,EAClB,SAAS,EACT,OAAO,GACR,EAAE;YACD,SAAS,EAAE,IAAI,CAAC;YAChB,OAAO,EAAE,IAAI,CAAC;SACf,KAAK,IAAI,CAAC;QACX,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;KACjE,KAAK,GAAG,CAAC,OAAO,CAAC;IAElB,wEAAwE;IACxE,wBAAwB,CAAC,EAAE,CAAC,EAC1B,QAAQ,GACT,EAAE;QACD,QAAQ,EAAE,SAAS,CAAC;KACrB,KAAK,GAAG,CAAC,OAAO,CAAC;IAElB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,mDAsC/B,CAAC;AAmSF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/Table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,WAAW,EACX,SAAS,EAIV,MAAM,OAAO,CAAC;AAcf,OAAO,EACL,yBAAyB,EAEzB,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAuBnC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAwDD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,CAAC;IAEhC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IAEJ;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IAErC,oDAAoD;IACpD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAE/D,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,GAAG,CAAC,OAAO,CAAC;IAEzE,+DAA+D;IAC/D,wBAAwB,CAAC,EAAE,CAAC,EAC1B,SAAS,EACT,KAAK,EACL,aAAa,EACb,MAAM,EACN,WAAW,EACX,iBAAiB,EACjB,cAAc,GACf,EAAE;QACD,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE;YAAE,SAAS,EAAE,IAAI,CAAC;YAAC,OAAO,EAAE,IAAI,CAAA;SAAE,CAAC;QAC9C,aAAa,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAClD,iBAAiB,EAAE,CAAC,EAClB,SAAS,EACT,OAAO,GACR,EAAE;YACD,SAAS,EAAE,IAAI,CAAC;YAChB,OAAO,EAAE,IAAI,CAAC;SACf,KAAK,IAAI,CAAC;QACX,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;KACjE,KAAK,GAAG,CAAC,OAAO,CAAC;IAElB,wEAAwE;IACxE,wBAAwB,CAAC,EAAE,CAAC,EAC1B,QAAQ,GACT,EAAE;QACD,QAAQ,EAAE,SAAS,CAAC;KACrB,KAAK,GAAG,CAAC,OAAO,CAAC;IAElB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,QAAA,MAAM,KAAK,UAAW,UAAU,mDAyC/B,CAAC;AAsSF,eAAe,KAAK,CAAC"}
package/dist/cjs/Table.js CHANGED
@@ -52,8 +52,9 @@ const Table = (props) => {
52
52
  const data = props;
53
53
  const [dashboard] = (0, react_1.useContext)(Context_1.DashboardContext);
54
54
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
55
+ const [page, setPage] = (0, react_1.useState)(0);
55
56
  if ('rows' in data && 'columns' in data) {
56
- return ((0, jsx_runtime_1.jsx)(QuillTable_1.default, { hideCSVDownloadButton: data.hideCSVDownloadButton, columns: data.columns, rows: data.rows, className: data.className, containerStyle: data.containerStyle, LoadingComponent: data.LoadingComponent, isLoading: data.isLoading, downloadCSV: data.downloadCSV }));
57
+ return ((0, jsx_runtime_1.jsx)(QuillTable_1.default, { hideCSVDownloadButton: data.hideCSVDownloadButton, columns: data.columns, rows: data.rows, className: data.className, containerStyle: data.containerStyle, LoadingComponent: data.LoadingComponent, isLoading: data.isLoading, downloadCSV: data.downloadCSV, currentPage: page, onPageChange: setPage }));
57
58
  }
58
59
  if (!client) {
59
60
  return null;
@@ -71,12 +72,14 @@ const ChartUpdater = ({ reportId, containerStyle, className, dashboardContext, c
71
72
  const [filterUpdateIndex, setFilterUpdateIndex] = (0, react_1.useState)(0);
72
73
  const [previousPage, setPreviousPage] = (0, react_1.useState)(1);
73
74
  const [rowCount, setRowCount] = (0, react_1.useState)(0);
75
+ const [currentPage, setCurrentPage] = (0, react_1.useState)(0);
74
76
  const { reportFiltersDispatch, reportFilters } = (0, react_1.useContext)(Context_1.ReportFiltersContext);
75
77
  const [currentProcessing, setCurrentProcessing] = (0, react_1.useState)({
76
78
  page: pagination,
77
79
  });
78
80
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
79
81
  const onPageChange = (page) => {
82
+ setCurrentPage(page);
80
83
  if (currentProcessing.page &&
81
84
  page > previousPage &&
82
85
  (0, paginationProcessing_1.shouldFetchMore)(paginationProcessing_1.DEFAULT_PAGINATION, page, previousPage)) {
@@ -217,6 +220,6 @@ const ChartUpdater = ({ reportId, containerStyle, className, dashboardContext, c
217
220
  updateIndex: filterUpdateIndex + 1,
218
221
  },
219
222
  });
220
- }, theme: theme, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, DateRangePickerComponent: DateRangePickerComponent }, index))) })), (0, jsx_runtime_1.jsx)(QuillTable_1.default, { hideCSVDownloadButton: hideCSVDownloadButton, columns: columns ?? [], rows: rows ?? [], containerStyle: containerStyle, className: className, LoadingComponent: LoadingComponent, sort: currentProcessing.sort, isLoading: loading || initialLoad, downloadCSV: downloadCSV, onPageChange: onPageChange, onSortChange: onSortChange, rowCount: rowCount })] }));
223
+ }, theme: theme, SelectComponent: SelectComponent, MultiSelectComponent: MultiSelectComponent, DateRangePickerComponent: DateRangePickerComponent }, index))) })), (0, jsx_runtime_1.jsx)(QuillTable_1.default, { hideCSVDownloadButton: hideCSVDownloadButton, columns: columns ?? [], rows: rows ?? [], containerStyle: containerStyle, className: className, LoadingComponent: LoadingComponent, sort: currentProcessing.sort, isLoading: loading || initialLoad, downloadCSV: downloadCSV, onPageChange: onPageChange, onSortChange: onSortChange, rowCount: rowCount, currentPage: currentPage })] }));
221
224
  };
222
225
  exports.default = Table;
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import { QuillReport } from '../../models/Report';
3
3
  import { QuillTheme } from '../../QuillProvider';
4
+ import { AdditionalProcessing } from '../../utils/tableProcessing';
4
5
  export type DataLoaderChildProps = {
5
6
  isLoading: boolean;
6
7
  error?: string;
@@ -13,9 +14,10 @@ export type DataLoaderChildProps = {
13
14
  rowCount?: number;
14
15
  rowCountIsLoading?: boolean;
15
16
  };
16
- export default function DataLoader({ item, children, filters, }: {
17
- item: any;
17
+ export default function DataLoader({ item, children, filters, additionalProcessing: defaultAdditionalProcessing, }: {
18
+ item: QuillReport;
18
19
  filters: any[] | null;
20
+ additionalProcessing: AdditionalProcessing;
19
21
  children: ({ isLoading, error, onPageChange, onSortChange, data, }: DataLoaderChildProps) => JSX.Element;
20
22
  }): JSX.Element;
21
23
  type ColorMapType = {
@@ -37,10 +39,10 @@ export type ChartDataLoaderChildProps = {
37
39
  rowCountIsLoading?: boolean;
38
40
  };
39
41
  export declare const ChartDataLoader: ({ item, children, dateBucket, additionalProcessing, filters, }: {
40
- item: any;
42
+ item: QuillReport;
41
43
  dateBucket?: string | undefined;
42
44
  mapColorsToFields?: ((_report: QuillReport, _theme: QuillTheme) => ColorMapType) | undefined;
43
- additionalProcessing?: any;
45
+ additionalProcessing: AdditionalProcessing;
44
46
  filters: any[] | null;
45
47
  children: ({ isLoading, error, data, dateBucket, rowCount, rowCountIsLoading, }: ChartDataLoaderChildProps) => JSX.Element;
46
48
  }) => JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"DataLoader.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DataLoader.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,WAAW,EAAuB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAoCjD,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;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,OAAO,GACR,EAAE;IACD,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtB,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,CAqNd;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;UAOpB,GAAG;;mCAGE,WAAW,UACZ,UAAU,KACf,YAAY;2BACM,GAAG;aACjB,GAAG,EAAE,GAAG,IAAI;qFAQlB,yBAAyB,KAAK,WAAW;MAC1C,WA4EH,CAAC"}
1
+ {"version":3,"file":"DataLoader.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/DataLoader.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,WAAW,EAAuB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAajD,OAAO,EACL,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AAuBrC,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;AAkCF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,oBAAoB,EAAE,2BAA2B,GAClD,EAAE;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,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,CAyLd;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;UAOpB,WAAW;;mCAGN,WAAW,UACZ,UAAU,KACf,YAAY;0BACK,oBAAoB;aACjC,GAAG,EAAE,GAAG,IAAI;qFAQlB,yBAAyB,KAAK,WAAW;MAC1C,WAmFH,CAAC"}
@@ -28,38 +28,67 @@ const constructReportFromItem = (item) => {
28
28
  filtersApplied: item.filtersApplied,
29
29
  };
30
30
  };
31
- function DataLoader({ item, children, filters, }) {
31
+ function filterValuesEquivalent(filters1, filters2) {
32
+ if (filters1.length !== filters2.length) {
33
+ return false;
34
+ }
35
+ // The two filters arrays aren't necessarily in the same order
36
+ // we can build two dictionaries of [label, filter] and compare them
37
+ const mappedFilters1 = filters1.reduce((acc, filter) => {
38
+ acc[filter.label] = filter;
39
+ return acc;
40
+ }, {});
41
+ const mappedFilters2 = filters2.reduce((acc, filter) => {
42
+ acc[filter.label] = filter;
43
+ return acc;
44
+ }, {});
45
+ for (const key in mappedFilters1) {
46
+ if (mappedFilters1[key].selectedValue !==
47
+ mappedFilters2[key]?.selectedValue ||
48
+ mappedFilters1[key].values !== mappedFilters2[key]?.values ||
49
+ mappedFilters1[key].field !== mappedFilters2[key]?.field ||
50
+ mappedFilters1[key].label !== mappedFilters2[key]?.label ||
51
+ mappedFilters1[key].table !== mappedFilters2[key]?.table ||
52
+ mappedFilters1[key].filterType !== mappedFilters2[key]?.filterType ||
53
+ mappedFilters1[key].startDate !== mappedFilters2[key]?.startDate ||
54
+ mappedFilters1[key].endDate !== mappedFilters2[key]?.endDate) {
55
+ return false;
56
+ }
57
+ }
58
+ return true;
59
+ }
60
+ function DataLoader({ item, children, filters, additionalProcessing: defaultAdditionalProcessing, }) {
32
61
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
33
62
  const [dashboard, dispatch] = (0, react_1.useContext)(Context_1.DashboardContext);
34
63
  const [schemaData] = (0, react_1.useContext)(Context_1.SchemaDataContext);
35
64
  const [loading, setLoading] = (0, react_1.useState)(false);
36
65
  const [error, setError] = (0, react_1.useState)(undefined);
37
66
  const [previousPage, setPreviousPage] = (0, react_1.useState)(0);
38
- const [report, setReport] = (0, react_1.useState)(dashboard[item._id] ?? constructReportFromItem(item));
39
- const [additionalProcessing, setAdditionProcessing] = (0, react_1.useState)({
40
- page: paginationProcessing_1.DEFAULT_PAGINATION,
41
- });
67
+ const [report, setReport] = (0, react_1.useState)(dashboard[item.id] ?? constructReportFromItem(item));
68
+ const [additionalProcessing, setAdditionProcessing] = (0, react_1.useState)(defaultAdditionalProcessing);
42
69
  const previousFilters = (0, react_1.useRef)(null);
43
- const [rowCount, setRowCount] = (0, react_1.useState)(dashboard[item._id]?.rowCount ?? 0);
70
+ const [rowCount, setRowCount] = (0, react_1.useState)(dashboard[item.id]?.rowCount ?? 0);
44
71
  const [rowCountIsLoading, setRowCountIsLoading] = (0, react_1.useState)(false);
45
72
  const fetchRowCount = async (processing) => {
46
73
  if (!client || !filters) {
47
74
  return;
48
75
  }
49
76
  setRowCountIsLoading(true);
50
- const rowCount = await (0, report_1.fetchReportRowCount)(item._id, client, true, filters, processing, schemaData.customFields);
51
- dispatch({
52
- type: 'UPDATE_DASHBOARD_ITEM',
53
- id: item._id,
54
- data: { rowCount },
55
- });
56
- setRowCount(rowCount);
77
+ const rowCount = await (0, report_1.fetchReportRowCount)(item.id, client, true, filters, processing, schemaData.customFields);
78
+ if (rowCount) {
79
+ dispatch({
80
+ type: 'UPDATE_DASHBOARD_ITEM',
81
+ id: item.id,
82
+ data: { rowCount },
83
+ });
84
+ setRowCount(rowCount);
85
+ }
57
86
  setRowCountIsLoading(false);
58
87
  };
59
88
  const onPageChange = (page) => {
60
89
  if (additionalProcessing &&
61
90
  additionalProcessing.page &&
62
- (0, paginationProcessing_1.shouldFetchMore)(paginationProcessing_1.DEFAULT_PAGINATION, page, previousPage)) {
91
+ (0, paginationProcessing_1.shouldFetchMore)(additionalProcessing.page, page, previousPage)) {
63
92
  const newPagination = { ...additionalProcessing.page, page };
64
93
  const updatedProcessing = {
65
94
  ...additionalProcessing,
@@ -89,7 +118,7 @@ function DataLoader({ item, children, filters, }) {
89
118
  setLoading(true);
90
119
  try {
91
120
  const updatedProcessing = { ...additionalProcessing, ...processing };
92
- const paginatedRows = await (0, tableProcessing_1.fetchResultsByReport)(report.id, client, updatedProcessing, filters, schemaData.customFields);
121
+ const paginatedRows = await (0, tableProcessing_1.fetchResultsByReport)(report.id, client, updatedProcessing, filters, schemaData.customFields, true);
93
122
  if (paginatedRows.error) {
94
123
  throw new Error('Error fetching chart');
95
124
  }
@@ -111,26 +140,26 @@ function DataLoader({ item, children, filters, }) {
111
140
  if (!client || !filters) {
112
141
  return;
113
142
  }
114
- if (dashboard[item._id] &&
115
- !(0, Chart_1.didFiltersChange)(dashboard[item._id], filters) &&
143
+ if (dashboard[item.id] &&
144
+ !(0, Chart_1.didFiltersChange)(dashboard[item.id], filters) &&
116
145
  !loading &&
117
146
  // @ts-ignore
118
- !dashboard[item._id].triggerReload) {
147
+ !dashboard[item.id].triggerReload) {
119
148
  setLoading(false);
120
149
  const convertedReport = (0, report_1.convertInternalReportToReport)(
121
150
  // @ts-ignore
122
- dashboard[item._id]);
151
+ dashboard[item.id]);
123
152
  setReport(convertedReport);
124
153
  return;
125
154
  }
126
155
  setLoading(true);
127
- const { report: fetchedReport, error } = await (0, report_1.fetchReport)(item._id, client, true, filters, processing, undefined, schemaData.customFields);
128
- fetchRowCount(processing);
156
+ const { report: fetchedReport, error } = await (0, report_1.fetchReport)(item.id, client, true, filters, processing, undefined, schemaData.customFields, true);
129
157
  dispatch({
130
158
  type: 'ADD_DASHBOARD_ITEM',
131
- id: item._id,
132
- data: { ...fetchedReport, triggerReload: false },
159
+ id: item.id,
160
+ data: { ...fetchedReport, triggerReload: false, rowCount: 0 }, // rowCount 0 indicates it's still loading if row length is nonzero
133
161
  });
162
+ fetchRowCount(processing);
134
163
  const convertedReport = (0, report_1.convertInternalReportToReport)(fetchedReport);
135
164
  setReport(convertedReport);
136
165
  setAdditionProcessing(processing);
@@ -146,50 +175,22 @@ function DataLoader({ item, children, filters, }) {
146
175
  return;
147
176
  }
148
177
  previousFilters.current = filters;
178
+ setPreviousPage(0);
149
179
  fetchReportHelper(additionalProcessing);
150
- }, [filters, item._id]);
151
- function filterValuesEquivalent(filters1, filters2) {
152
- if (filters1.length !== filters2.length) {
153
- return false;
154
- }
155
- // The two filters arrays aren't necessarily in the same order
156
- // we can build two dictionaries of [label, filter] and compare them
157
- const mappedFilters1 = filters1.reduce((acc, filter) => {
158
- acc[filter.label] = filter;
159
- return acc;
160
- }, {});
161
- const mappedFilters2 = filters2.reduce((acc, filter) => {
162
- acc[filter.label] = filter;
163
- return acc;
164
- }, {});
165
- for (const key in mappedFilters1) {
166
- if (mappedFilters1[key].selectedValue !==
167
- mappedFilters2[key]?.selectedValue ||
168
- mappedFilters1[key].values !== mappedFilters2[key]?.values ||
169
- mappedFilters1[key].field !== mappedFilters2[key]?.field ||
170
- mappedFilters1[key].label !== mappedFilters2[key]?.label ||
171
- mappedFilters1[key].table !== mappedFilters2[key]?.table ||
172
- mappedFilters1[key].filterType !== mappedFilters2[key]?.filterType ||
173
- mappedFilters1[key].startDate !== mappedFilters2[key]?.startDate ||
174
- mappedFilters1[key].endDate !== mappedFilters2[key]?.endDate) {
175
- return false;
176
- }
177
- }
178
- return true;
179
- }
180
+ }, [filters, item.id]);
180
181
  (0, react_1.useEffect)(() => {
181
182
  // @ts-ignore
182
- if (dashboard[item._id] && dashboard[item._id].triggerReload) {
183
+ if (dashboard[item.id] && dashboard[item.id].triggerReload) {
183
184
  fetchReportHelper(additionalProcessing);
184
185
  }
185
- }, [dashboard[item._id]]);
186
+ }, [dashboard[item.id]]);
186
187
  return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children({
187
188
  isLoading: loading,
188
189
  error,
189
190
  onPageChange,
190
191
  onSortChange,
191
192
  data: report,
192
- rowCount,
193
+ rowCount: report.pivot ? report.rowCount : rowCount,
193
194
  rowCountIsLoading,
194
195
  }) }));
195
196
  }
@@ -202,36 +203,37 @@ const ChartDataLoader = ({ item, children, dateBucket, additionalProcessing, fil
202
203
  const [loading, setLoading] = (0, react_1.useState)(false);
203
204
  const [error, setError] = (0, react_1.useState)(undefined);
204
205
  const [localDateBucket, setLocalDateBucket] = (0, react_1.useState)(undefined);
205
- const [localAdditionalProcessing, setLocalAdditionalProcessing] = (0, react_1.useState)();
206
- const [report, setReport] = (0, react_1.useState)(dashboard[item._id] ?? constructReportFromItem(item));
206
+ const [report, setReport] = (0, react_1.useState)(dashboard[item.id] ?? constructReportFromItem(item));
207
207
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
208
208
  const [schemaData] = (0, react_1.useContext)(Context_1.SchemaDataContext);
209
+ const previousFilters = (0, react_1.useRef)(null);
209
210
  const fetchReportHelper = async (useReportTask = true) => {
210
211
  if (!client || !filters) {
211
212
  return;
212
213
  }
213
- const tempReport = dashboard[item._id];
214
+ const tempReport = dashboard[item.id];
214
215
  if (tempReport &&
215
216
  !(0, Chart_1.didFiltersChange)(tempReport, filters) &&
216
217
  !tempReport.triggerReload &&
217
- dateBucket === localDateBucket &&
218
- additionalProcessing?.last === localAdditionalProcessing?.last) {
218
+ dateBucket === localDateBucket) {
219
219
  setLoading(false);
220
220
  const convertedReport = (0, report_1.convertInternalReportToReport)(tempReport);
221
221
  setReport(convertedReport);
222
222
  return;
223
223
  }
224
224
  setLoading(true);
225
- const { report, error } = await (0, report_1.fetchReport)(item._id, client, useReportTask, filters, additionalProcessing, dateBucket, schemaData.customFields);
225
+ const { report, error } = await (0, report_1.fetchReport)(item.id, client, useReportTask, filters, {
226
+ ...additionalProcessing,
227
+ ...(item.pivot ? {} : { page: paginationProcessing_1.DEFAULT_PAGINATION }),
228
+ }, dateBucket, schemaData.customFields);
226
229
  dispatch({
227
230
  type: 'ADD_DASHBOARD_ITEM',
228
- id: item._id,
231
+ id: item.id,
229
232
  data: { ...report, triggerReload: false },
230
233
  });
231
234
  const convertedReport = (0, report_1.convertInternalReportToReport)(report);
232
235
  setReport(convertedReport);
233
236
  setLocalDateBucket(dateBucket);
234
- setLocalAdditionalProcessing(additionalProcessing);
235
237
  setError(error);
236
238
  setLoading(false);
237
239
  };
@@ -239,15 +241,20 @@ const ChartDataLoader = ({ item, children, dateBucket, additionalProcessing, fil
239
241
  if (!filters) {
240
242
  return;
241
243
  }
244
+ if (previousFilters.current &&
245
+ filterValuesEquivalent(previousFilters.current, filters)) {
246
+ return;
247
+ }
248
+ previousFilters.current = filters;
242
249
  setInitialLoad(false);
243
250
  fetchReportHelper();
244
- }, [filters, item._id, dateBucket, additionalProcessing]);
251
+ }, [filters, item.id, dateBucket]);
245
252
  (0, react_1.useEffect)(() => {
246
- const tempReport = dashboard[item._id];
253
+ const tempReport = dashboard[item.id];
247
254
  if (tempReport && tempReport.triggerReload) {
248
255
  fetchReportHelper();
249
256
  }
250
- }, [dashboard[item._id]]);
257
+ }, [dashboard[item.id]]);
251
258
  return children({
252
259
  isLoading: loading || initialLoad,
253
260
  data: report,
@@ -1 +1 @@
1
- {"version":3,"file":"TableComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/TableComponent.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACrE,GAAG,GAAG,CAAC,OAAO,CA0Fd"}
1
+ {"version":3,"file":"TableComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/Dashboard/TableComponent.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACrE,GAAG,GAAG,CAAC,OAAO,CAkGd"}
@@ -15,11 +15,17 @@ function QuillTableComponent({ report, onClick, isLoading, error, rowCount, rowC
15
15
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
16
16
  const [initialLoad, setInitialLoad] = (0, react_1.useState)(true);
17
17
  const { downloadCSV } = (0, useExport_1.useExport)(report?.id);
18
+ const [page, setPage] = (0, react_1.useState)(0);
18
19
  (0, react_1.useEffect)(() => {
19
20
  if (!isLoading) {
20
21
  setInitialLoad(false);
21
22
  }
22
23
  }, [isLoading]);
24
+ (0, react_1.useEffect)(() => {
25
+ if (rowCountIsLoading) {
26
+ setPage(0);
27
+ }
28
+ }, [rowCountIsLoading]);
23
29
  return ((0, jsx_runtime_1.jsxs)("div", { style: { cursor: error || !onClick ? 'default' : 'pointer' }, onClick: () => onClick && onClick(report), children: [(0, jsx_runtime_1.jsx)("div", { style: {
24
30
  display: 'flex',
25
31
  flexDirection: 'row',
@@ -52,8 +58,9 @@ function QuillTableComponent({ report, onClick, isLoading, error, rowCount, rowC
52
58
  downloadCSV();
53
59
  }, onPageChange: (page) => {
54
60
  onPageChange && onPageChange(page);
61
+ setPage(page);
55
62
  }, onSortChange: (sort) => {
56
63
  onSortChange && onSortChange(sort);
57
- }, currentPage: report?.pagination?.page, sort: report?.sort }))] }, report?.name));
64
+ }, currentPage: report?.pagination?.page ?? page, sort: report?.sort }))] }, report?.name));
58
65
  }
59
66
  exports.default = QuillTableComponent;
@@ -8,7 +8,7 @@ export interface TableComponentProps {
8
8
  label: string;
9
9
  field: string;
10
10
  }[];
11
- currentPage?: number;
11
+ currentPage: number;
12
12
  sort?: {
13
13
  field: string;
14
14
  direction: string;
@@ -1 +1 @@
1
- {"version":3,"file":"QuillTable.d.ts","sourceRoot":"","sources":["../../../src/components/QuillTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAG/D,OAAO,EAAE,oBAAoB,EAAyB,MAAM,gBAAgB,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IACrC,0BAA0B,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,WAAW,EACX,IAAI,EACJ,qBAA4B,EAC5B,cAAc,EACd,SAAS,EACT,gBAAwC,EACxC,WAAgB,EAChB,eAA8B,EAC9B,WAAW,EACX,YAAY,EACZ,YAAY,GACb,EAAE,mBAAmB,2CAwdrB"}
1
+ {"version":3,"file":"QuillTable.d.ts","sourceRoot":"","sources":["../../../src/components/QuillTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAG/D,OAAO,EAAE,oBAAoB,EAAyB,MAAM,gBAAgB,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IACrC,0BAA0B,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,WAAW,EACX,IAAI,EACJ,qBAA4B,EAC5B,cAAc,EACd,SAAS,EACT,gBAAwC,EACxC,WAAgB,EAChB,eAA8B,EAC9B,WAAW,EACX,YAAY,EACZ,YAAY,GACb,EAAE,mBAAmB,2CA+drB"}