@quillsql/react 2.16.89 → 2.16.91

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/index.cjs CHANGED
@@ -18641,6 +18641,19 @@ function replaceBigQuerySpecialCharacters(column) {
18641
18641
  function processColumnReference(column, databaseType, fallbackOnNull, isColumnFieldAlias, isValueFieldAlias) {
18642
18642
  switch (databaseType.toLowerCase()) {
18643
18643
  case "postgresql":
18644
+ case "redshift": {
18645
+ if (column === "") {
18646
+ return fallbackOnNull ? `"${fallbackOnNull}"` : `"_"`;
18647
+ }
18648
+ if (isColumnFieldAlias) {
18649
+ return `"${column.replaceAll('"', "")}"`;
18650
+ }
18651
+ const columnParts = column.split(".");
18652
+ if (columnParts.length > 1) {
18653
+ return `"` + columnParts.map((part) => part.replaceAll('"', "")).join('"."') + `"`;
18654
+ }
18655
+ return `"${column.replaceAll('"', "")}"`;
18656
+ }
18644
18657
  case "clickhouse": {
18645
18658
  if (column === "") {
18646
18659
  return fallbackOnNull ? `"${fallbackOnNull}"` : `"_"`;
@@ -18755,6 +18768,8 @@ function generateDistinctQuery(stringFields, query, databaseType) {
18755
18768
  return generateDistinctQueryBigQuery(stringFields, query);
18756
18769
  case "postgresql":
18757
18770
  return generateDistinctQueryPostgres(stringFields, query);
18771
+ case "redshift":
18772
+ return generateDistinctQueryRedshift(stringFields, query);
18758
18773
  case "snowflake":
18759
18774
  return generateDistinctQuerySnowflake(stringFields, query);
18760
18775
  case "mssql":
@@ -18801,6 +18816,13 @@ function generateDistinctQueryPostgres(stringFields, query) {
18801
18816
  const distinctQuery = distinctQueries.join(" UNION ALL ");
18802
18817
  return `WITH querytable AS (${query.replace(";", "")}) ` + distinctQuery;
18803
18818
  }
18819
+ function generateDistinctQueryRedshift(stringFields, query) {
18820
+ const distinctQueries = stringFields.map((field) => {
18821
+ return `SELECT '${field}' AS "field", LISTAGG(DISTINCT "${field}") AS "string_values" FROM querytable`;
18822
+ });
18823
+ const distinctQuery = distinctQueries.join(" UNION ALL ");
18824
+ return `WITH querytable AS (${query.replace(";", "")}) ` + distinctQuery;
18825
+ }
18804
18826
  function generateDistinctQuerySnowflake(stringFields, query) {
18805
18827
  const distinctQueries = stringFields.map((field) => {
18806
18828
  return `SELECT '${field}' AS "field", ARRAY_AGG(DISTINCT "${field}") AS "string_values" FROM querytable`;
@@ -18842,7 +18864,7 @@ function generateMinMaxDateRangeQueries(columnFields, query, databaseType) {
18842
18864
  const min2 = "MIN";
18843
18865
  const cast = databaseType.toLowerCase() === "snowflake" ? "::TIMESTAMP_TZ" : "";
18844
18866
  const distinctQueries = columnFields.map((field) => {
18845
- const wrappedField = ["postgresql", "clickhouse"].includes(
18867
+ const wrappedField = ["postgresql", "redshift", "clickhouse"].includes(
18846
18868
  databaseType.toLowerCase()
18847
18869
  ) ? processColumnReference(field, databaseType) : field;
18848
18870
  return `SELECT '${field}' AS ${processColumnReference("field", databaseType)}, ${min2}(${wrappedField})${cast} AS ${processColumnReference("min_range", databaseType)}, ${max2}(${wrappedField})${cast} AS ${processColumnReference("max_range", databaseType)} FROM querytable`;
@@ -53707,6 +53729,7 @@ function generateSuggestionsByDatasource(monaco, range, databaseType) {
53707
53729
  switch (databaseType.toLowerCase()) {
53708
53730
  case "snowflake":
53709
53731
  case "postgresql":
53732
+ case "redshift":
53710
53733
  return [
53711
53734
  ...POSTGRES_DATASOURCE_SUGGESTIONS(monaco, range),
53712
53735
  ...GENERIC_DATASOURCE_SUGGESTIONS(monaco, range)
@@ -64337,6 +64360,20 @@ function resolveTableColumnLabel(fieldRaw, labelRaw) {
64337
64360
  const label = String(labelRaw ?? "").trim();
64338
64361
  return !label || label === field ? toTitleCaseLabel(field) : label;
64339
64362
  }
64363
+ function reportColumnsContainPivotOutputFields(report) {
64364
+ if (!report?.pivot || String(report.chartType ?? "").toLowerCase() !== "table" || !Array.isArray(report.columns) || report.columns.length === 0) {
64365
+ return false;
64366
+ }
64367
+ const detailFields = new Set(
64368
+ [
64369
+ ...report.reportBuilderState?.columns ?? [],
64370
+ ...report.columnInternal ?? []
64371
+ ].flatMap((column) => [column.field, column.alias]).map((field) => String(field ?? "").trim()).filter(Boolean)
64372
+ );
64373
+ return report.columns.some(
64374
+ (column) => !detailFields.has(String(column.field ?? "").trim())
64375
+ );
64376
+ }
64340
64377
  function mergeDisplayAndSourceForTableFormats(args) {
64341
64378
  const {
64342
64379
  effectiveReportBuilderTableNames,
@@ -64346,7 +64383,8 @@ function mergeDisplayAndSourceForTableFormats(args) {
64346
64383
  includeSelectedSchemaFallback
64347
64384
  } = args;
64348
64385
  const selectedTableNames = new Set(effectiveReportBuilderTableNames);
64349
- const persistedReportColumns = Array.isArray(sourceReport?.columns) && sourceReport.columns.length > 0 ? sourceReport.columns : null;
64386
+ const savedColumnsArePivotDisplayColumns = reportColumnsContainPivotOutputFields(sourceReport);
64387
+ const persistedReportColumns = !savedColumnsArePivotDisplayColumns && Array.isArray(sourceReport?.columns) && sourceReport.columns.length > 0 ? sourceReport.columns : null;
64350
64388
  const pivotTableColumnsFromSchema = sourceReport?.pivot && !persistedReportColumns && scopedSchemaColumns.length > 0 && selectedTableNames.size > 0 ? scopedSchemaColumns.filter(
64351
64389
  (column) => selectedTableNames.has(String(column.table ?? "").trim())
64352
64390
  ) : [];
@@ -66519,9 +66557,8 @@ function useReport(reportIdArg, options = {}) {
66519
66557
  }, [schemaForReportBuilderState, schemaForeignKeyMap]);
66520
66558
  const reportBuilderBaseTableNamesKey = (sourceReport?.reportBuilderState?.tables ?? []).map((t) => String(t?.name ?? "").trim()).filter(Boolean).join("\0") ?? "";
66521
66559
  const selectedBaseTableNamesForFieldOptions = (0, import_react63.useMemo)(() => {
66522
- const fromPicker = schemaDatasourceIds?.map((id) => String(id ?? "").trim()).filter(Boolean) ?? [];
66523
- if (fromPicker.length > 0) {
66524
- return fromPicker;
66560
+ if (Array.isArray(schemaDatasourceIds)) {
66561
+ return schemaDatasourceIds.map((id) => String(id ?? "").trim()).filter(Boolean);
66525
66562
  }
66526
66563
  return (sourceReport?.reportBuilderState?.tables ?? []).map((t) => String(t?.name ?? "").trim()).filter(Boolean);
66527
66564
  }, [schemaDatasourceIdsKey, reportBuilderBaseTableNamesKey]);
@@ -67730,7 +67767,8 @@ function useReport(reportIdArg, options = {}) {
67730
67767
  table: String(column.table ?? "").trim() || resolveColumnTableFromReportMetadata(sourceReport, column.field)
67731
67768
  }))
67732
67769
  );
67733
- const sourceDisplayColumns = savedDisplayColumns.length > 0 ? savedDisplayColumns : sourceDisplayColumnsFromSchema.length > 0 ? sourceDisplayColumnsFromSchema : sourceQueryColumns;
67770
+ const savedColumnsArePivotDisplayColumns = reportColumnsContainPivotOutputFields(sourceReport);
67771
+ const sourceDisplayColumns = savedDisplayColumns.length > 0 && !savedColumnsArePivotDisplayColumns ? savedDisplayColumns : sourceDisplayColumnsFromSchema.length > 0 ? sourceDisplayColumnsFromSchema : sourceQueryColumns;
67734
67772
  const shouldKeepLocalRowGroup = groupRowsBySetViaSetReportRef.current || groupColumnsBySetViaSetReportRef.current && prev.groupRowsBy !== void 0;
67735
67773
  const shouldKeepLocalColumnGroup = groupColumnsBySetViaSetReportRef.current || groupRowsBySetViaSetReportRef.current && prev.groupColumnsBy !== void 0;
67736
67774
  const nextGroupRowsBy = shouldTakePivotGroupsFromSource ? shouldKeepLocalRowGroup ? prev.groupRowsBy : sourceRowGroupOption : prev.groupRowsBy !== void 0 ? prev.groupRowsBy : groupRowsBySetViaSetReportRef.current ? prev.groupRowsBy : sourceRowGroupOption;
@@ -67870,7 +67908,7 @@ function useReport(reportIdArg, options = {}) {
67870
67908
  prevPivotStateForColumnExpansionRef.current = pivotState;
67871
67909
  }, [pivotState]);
67872
67910
  const effectiveReportBuilderTables = (0, import_react63.useMemo)(() => {
67873
- const explicitBaseFromSchemaPicker = Array.isArray(schemaDatasourceIds) && schemaDatasourceIds.length > 0 ? schemaDatasourceIds.map((tableName) => String(tableName ?? "").trim()).filter(Boolean).map((name2) => ({ name: name2 })) : null;
67911
+ const explicitBaseFromSchemaPicker = Array.isArray(schemaDatasourceIds) ? schemaDatasourceIds.map((tableName) => String(tableName ?? "").trim()).filter(Boolean).map((name2) => ({ name: name2 })) : null;
67874
67912
  const baseTablesForMerge = explicitBaseFromSchemaPicker ?? baseReportBuilderTables;
67875
67913
  return mergeReportBuilderTables(
67876
67914
  baseTablesForMerge,
@@ -67904,6 +67942,12 @@ function useReport(reportIdArg, options = {}) {
67904
67942
  () => baseReportBuilderTables.map((table2) => String(table2.name ?? "").trim()).filter((name2) => Boolean(name2)),
67905
67943
  [baseReportBuilderTables]
67906
67944
  );
67945
+ const datasourcePickerValues = (0, import_react63.useMemo)(() => {
67946
+ if (Array.isArray(schemaDatasourceIds)) {
67947
+ return schemaDatasourceIds.map((tableName) => String(tableName ?? "").trim()).filter((name2) => Boolean(name2));
67948
+ }
67949
+ return baseReportBuilderTableNames;
67950
+ }, [baseReportBuilderTableNames, schemaDatasourceIdsKey]);
67907
67951
  const normalizeQueryBuilderFieldNameForConfig = (0, import_react63.useMemo)(() => {
67908
67952
  const configEntries = Object.entries(queryBuilderFieldConfigByName);
67909
67953
  const preferredTableNames = /* @__PURE__ */ new Set([
@@ -70700,7 +70744,7 @@ function useReport(reportIdArg, options = {}) {
70700
70744
  }
70701
70745
  if (effectiveNextState.datasources !== void 0) {
70702
70746
  const nextIds = effectiveNextState.datasources.map((tableName) => String(tableName ?? "").trim()).filter(Boolean);
70703
- next.schemaDatasourceIds = nextIds.length > 0 ? nextIds : void 0;
70747
+ next.schemaDatasourceIds = nextIds;
70704
70748
  if (nextIds.length > 0) {
70705
70749
  pruneFormStateToExplicitDatasourceTables(next, nextIds, {
70706
70750
  sourceReport,
@@ -70753,6 +70797,15 @@ function useReport(reportIdArg, options = {}) {
70753
70797
  }
70754
70798
  }
70755
70799
  }
70800
+ } else {
70801
+ next.queryColumns = [];
70802
+ next.groupRowsBy = void 0;
70803
+ next.groupColumnsBy = void 0;
70804
+ next.aggregationState = [];
70805
+ next.aggregationTablesByIndex = [];
70806
+ next.pivotSort = void 0;
70807
+ next.regularSort = void 0;
70808
+ next.queryFilters = { combinator: "and", rules: [] };
70756
70809
  }
70757
70810
  }
70758
70811
  if (effectiveNextState.columns !== void 0) {
@@ -70773,6 +70826,8 @@ function useReport(reportIdArg, options = {}) {
70773
70826
  if (replacesDatasourceTableScope) {
70774
70827
  next.queryColumns = normalizedDisplayColumns;
70775
70828
  next.schemaDatasourceIds = [...requestedDisplayTableNames];
70829
+ } else if (effectiveNextState.datasources !== void 0 && normalizedDisplayColumns.length === 0) {
70830
+ next.queryColumns = [];
70776
70831
  } else {
70777
70832
  next.queryColumns = mergeReportBuilderColumns(
70778
70833
  next.queryColumns,
@@ -71158,6 +71213,28 @@ function useReport(reportIdArg, options = {}) {
71158
71213
  const hasReportFlagsOverride = overrides?.reportFlags !== void 0;
71159
71214
  const isFlatTable = String(resolvedChartType).toLowerCase() === "table" && !effectiveReportBuilderState.pivot;
71160
71215
  const isPivotTable = String(resolvedChartType).toLowerCase() === "table" && Boolean(effectiveReportBuilderState.pivot);
71216
+ const fallbackDetailColumns = effectiveReportBuilderState.columns.map(
71217
+ (column) => {
71218
+ const field = String(column.alias ?? "").trim() || String(column.field ?? "").trim();
71219
+ const tableName = String(column.table ?? "").trim();
71220
+ const metadata = [
71221
+ ...sourceReport.columnInternal ?? [],
71222
+ ...sourceReport.columns ?? []
71223
+ ].find((candidate) => {
71224
+ const candidateField = String(candidate.field ?? "").trim();
71225
+ const candidateTable = String(
71226
+ candidate.table ?? ""
71227
+ ).trim();
71228
+ return (candidateField === field || candidateField === String(column.field ?? "").trim()) && (!tableName || !candidateTable || candidateTable === tableName);
71229
+ });
71230
+ return {
71231
+ field,
71232
+ label: String(metadata?.label ?? "").trim() || toTitleCaseLabel(field),
71233
+ format: String(metadata?.format ?? "").trim() || "string"
71234
+ };
71235
+ }
71236
+ );
71237
+ const columnsSelectedForSave = table.columns.length > 0 ? table.columns : fallbackDetailColumns;
71161
71238
  const resp = await saveReport({
71162
71239
  report: {
71163
71240
  ...EMPTY_INTERNAL_REPORT,
@@ -71169,7 +71246,7 @@ function useReport(reportIdArg, options = {}) {
71169
71246
  dashboardName: resolvedDashboardName,
71170
71247
  ...isAdmin ? { adminMode: true } : {},
71171
71248
  ...hasSectionOverride ? { section: overrides.section } : {},
71172
- columns: isPivotTable ? chart?.columns ?? sourceReport.columns : table.columns,
71249
+ columns: columnsSelectedForSave,
71173
71250
  ...isFlatTable ? {
71174
71251
  sort: effectiveReportBuilderState.sort?.[0] ?? null
71175
71252
  } : {},
@@ -71258,6 +71335,7 @@ function useReport(reportIdArg, options = {}) {
71258
71335
  reportId: effectiveReportId || void 0,
71259
71336
  /* ── Selected value + pick list (same naming pattern throughout) ── */
71260
71337
  datasources,
71338
+ datasourcePickerValues,
71261
71339
  datasourceOptions,
71262
71340
  groupRowsBy,
71263
71341
  groupRowsByOptions,
package/dist/index.d.cts CHANGED
@@ -3275,7 +3275,8 @@ interface SetReportBuilderInput {
3275
3275
  chartAxes?: SetReportChartAxesInput;
3276
3276
  /**
3277
3277
  * Schema table names for datasource / multi-table picker UIs.
3278
- * Empty array clears the override (report base tables apply again).
3278
+ * An empty array clears the picker selection; omit or pass `undefined` via
3279
+ * report switches to fall back to saved report base tables.
3279
3280
  */
3280
3281
  datasources?: string[];
3281
3282
  }
@@ -3451,6 +3452,7 @@ declare function useReport(reportIdArg?: string, options?: UseReportOptions): {
3451
3452
  */
3452
3453
  reportId: string | undefined;
3453
3454
  datasources: string[];
3455
+ datasourcePickerValues: string[];
3454
3456
  datasourceOptions: DatasourceOption[];
3455
3457
  groupRowsBy: string | undefined;
3456
3458
  groupRowsByOptions: SelectOption[];
package/dist/index.d.ts CHANGED
@@ -3275,7 +3275,8 @@ interface SetReportBuilderInput {
3275
3275
  chartAxes?: SetReportChartAxesInput;
3276
3276
  /**
3277
3277
  * Schema table names for datasource / multi-table picker UIs.
3278
- * Empty array clears the override (report base tables apply again).
3278
+ * An empty array clears the picker selection; omit or pass `undefined` via
3279
+ * report switches to fall back to saved report base tables.
3279
3280
  */
3280
3281
  datasources?: string[];
3281
3282
  }
@@ -3451,6 +3452,7 @@ declare function useReport(reportIdArg?: string, options?: UseReportOptions): {
3451
3452
  */
3452
3453
  reportId: string | undefined;
3453
3454
  datasources: string[];
3455
+ datasourcePickerValues: string[];
3454
3456
  datasourceOptions: DatasourceOption[];
3455
3457
  groupRowsBy: string | undefined;
3456
3458
  groupRowsByOptions: SelectOption[];
package/dist/index.js CHANGED
@@ -18687,6 +18687,19 @@ function replaceBigQuerySpecialCharacters(column) {
18687
18687
  function processColumnReference(column, databaseType, fallbackOnNull, isColumnFieldAlias, isValueFieldAlias) {
18688
18688
  switch (databaseType.toLowerCase()) {
18689
18689
  case "postgresql":
18690
+ case "redshift": {
18691
+ if (column === "") {
18692
+ return fallbackOnNull ? `"${fallbackOnNull}"` : `"_"`;
18693
+ }
18694
+ if (isColumnFieldAlias) {
18695
+ return `"${column.replaceAll('"', "")}"`;
18696
+ }
18697
+ const columnParts = column.split(".");
18698
+ if (columnParts.length > 1) {
18699
+ return `"` + columnParts.map((part) => part.replaceAll('"', "")).join('"."') + `"`;
18700
+ }
18701
+ return `"${column.replaceAll('"', "")}"`;
18702
+ }
18690
18703
  case "clickhouse": {
18691
18704
  if (column === "") {
18692
18705
  return fallbackOnNull ? `"${fallbackOnNull}"` : `"_"`;
@@ -18801,6 +18814,8 @@ function generateDistinctQuery(stringFields, query, databaseType) {
18801
18814
  return generateDistinctQueryBigQuery(stringFields, query);
18802
18815
  case "postgresql":
18803
18816
  return generateDistinctQueryPostgres(stringFields, query);
18817
+ case "redshift":
18818
+ return generateDistinctQueryRedshift(stringFields, query);
18804
18819
  case "snowflake":
18805
18820
  return generateDistinctQuerySnowflake(stringFields, query);
18806
18821
  case "mssql":
@@ -18847,6 +18862,13 @@ function generateDistinctQueryPostgres(stringFields, query) {
18847
18862
  const distinctQuery = distinctQueries.join(" UNION ALL ");
18848
18863
  return `WITH querytable AS (${query.replace(";", "")}) ` + distinctQuery;
18849
18864
  }
18865
+ function generateDistinctQueryRedshift(stringFields, query) {
18866
+ const distinctQueries = stringFields.map((field) => {
18867
+ return `SELECT '${field}' AS "field", LISTAGG(DISTINCT "${field}") AS "string_values" FROM querytable`;
18868
+ });
18869
+ const distinctQuery = distinctQueries.join(" UNION ALL ");
18870
+ return `WITH querytable AS (${query.replace(";", "")}) ` + distinctQuery;
18871
+ }
18850
18872
  function generateDistinctQuerySnowflake(stringFields, query) {
18851
18873
  const distinctQueries = stringFields.map((field) => {
18852
18874
  return `SELECT '${field}' AS "field", ARRAY_AGG(DISTINCT "${field}") AS "string_values" FROM querytable`;
@@ -18888,7 +18910,7 @@ function generateMinMaxDateRangeQueries(columnFields, query, databaseType) {
18888
18910
  const min2 = "MIN";
18889
18911
  const cast = databaseType.toLowerCase() === "snowflake" ? "::TIMESTAMP_TZ" : "";
18890
18912
  const distinctQueries = columnFields.map((field) => {
18891
- const wrappedField = ["postgresql", "clickhouse"].includes(
18913
+ const wrappedField = ["postgresql", "redshift", "clickhouse"].includes(
18892
18914
  databaseType.toLowerCase()
18893
18915
  ) ? processColumnReference(field, databaseType) : field;
18894
18916
  return `SELECT '${field}' AS ${processColumnReference("field", databaseType)}, ${min2}(${wrappedField})${cast} AS ${processColumnReference("min_range", databaseType)}, ${max2}(${wrappedField})${cast} AS ${processColumnReference("max_range", databaseType)} FROM querytable`;
@@ -53860,6 +53882,7 @@ function generateSuggestionsByDatasource(monaco, range, databaseType) {
53860
53882
  switch (databaseType.toLowerCase()) {
53861
53883
  case "snowflake":
53862
53884
  case "postgresql":
53885
+ case "redshift":
53863
53886
  return [
53864
53887
  ...POSTGRES_DATASOURCE_SUGGESTIONS(monaco, range),
53865
53888
  ...GENERIC_DATASOURCE_SUGGESTIONS(monaco, range)
@@ -64545,6 +64568,20 @@ function resolveTableColumnLabel(fieldRaw, labelRaw) {
64545
64568
  const label = String(labelRaw ?? "").trim();
64546
64569
  return !label || label === field ? toTitleCaseLabel(field) : label;
64547
64570
  }
64571
+ function reportColumnsContainPivotOutputFields(report) {
64572
+ if (!report?.pivot || String(report.chartType ?? "").toLowerCase() !== "table" || !Array.isArray(report.columns) || report.columns.length === 0) {
64573
+ return false;
64574
+ }
64575
+ const detailFields = new Set(
64576
+ [
64577
+ ...report.reportBuilderState?.columns ?? [],
64578
+ ...report.columnInternal ?? []
64579
+ ].flatMap((column) => [column.field, column.alias]).map((field) => String(field ?? "").trim()).filter(Boolean)
64580
+ );
64581
+ return report.columns.some(
64582
+ (column) => !detailFields.has(String(column.field ?? "").trim())
64583
+ );
64584
+ }
64548
64585
  function mergeDisplayAndSourceForTableFormats(args) {
64549
64586
  const {
64550
64587
  effectiveReportBuilderTableNames,
@@ -64554,7 +64591,8 @@ function mergeDisplayAndSourceForTableFormats(args) {
64554
64591
  includeSelectedSchemaFallback
64555
64592
  } = args;
64556
64593
  const selectedTableNames = new Set(effectiveReportBuilderTableNames);
64557
- const persistedReportColumns = Array.isArray(sourceReport?.columns) && sourceReport.columns.length > 0 ? sourceReport.columns : null;
64594
+ const savedColumnsArePivotDisplayColumns = reportColumnsContainPivotOutputFields(sourceReport);
64595
+ const persistedReportColumns = !savedColumnsArePivotDisplayColumns && Array.isArray(sourceReport?.columns) && sourceReport.columns.length > 0 ? sourceReport.columns : null;
64558
64596
  const pivotTableColumnsFromSchema = sourceReport?.pivot && !persistedReportColumns && scopedSchemaColumns.length > 0 && selectedTableNames.size > 0 ? scopedSchemaColumns.filter(
64559
64597
  (column) => selectedTableNames.has(String(column.table ?? "").trim())
64560
64598
  ) : [];
@@ -66727,9 +66765,8 @@ function useReport(reportIdArg, options = {}) {
66727
66765
  }, [schemaForReportBuilderState, schemaForeignKeyMap]);
66728
66766
  const reportBuilderBaseTableNamesKey = (sourceReport?.reportBuilderState?.tables ?? []).map((t) => String(t?.name ?? "").trim()).filter(Boolean).join("\0") ?? "";
66729
66767
  const selectedBaseTableNamesForFieldOptions = useMemo33(() => {
66730
- const fromPicker = schemaDatasourceIds?.map((id) => String(id ?? "").trim()).filter(Boolean) ?? [];
66731
- if (fromPicker.length > 0) {
66732
- return fromPicker;
66768
+ if (Array.isArray(schemaDatasourceIds)) {
66769
+ return schemaDatasourceIds.map((id) => String(id ?? "").trim()).filter(Boolean);
66733
66770
  }
66734
66771
  return (sourceReport?.reportBuilderState?.tables ?? []).map((t) => String(t?.name ?? "").trim()).filter(Boolean);
66735
66772
  }, [schemaDatasourceIdsKey, reportBuilderBaseTableNamesKey]);
@@ -67938,7 +67975,8 @@ function useReport(reportIdArg, options = {}) {
67938
67975
  table: String(column.table ?? "").trim() || resolveColumnTableFromReportMetadata(sourceReport, column.field)
67939
67976
  }))
67940
67977
  );
67941
- const sourceDisplayColumns = savedDisplayColumns.length > 0 ? savedDisplayColumns : sourceDisplayColumnsFromSchema.length > 0 ? sourceDisplayColumnsFromSchema : sourceQueryColumns;
67978
+ const savedColumnsArePivotDisplayColumns = reportColumnsContainPivotOutputFields(sourceReport);
67979
+ const sourceDisplayColumns = savedDisplayColumns.length > 0 && !savedColumnsArePivotDisplayColumns ? savedDisplayColumns : sourceDisplayColumnsFromSchema.length > 0 ? sourceDisplayColumnsFromSchema : sourceQueryColumns;
67942
67980
  const shouldKeepLocalRowGroup = groupRowsBySetViaSetReportRef.current || groupColumnsBySetViaSetReportRef.current && prev.groupRowsBy !== void 0;
67943
67981
  const shouldKeepLocalColumnGroup = groupColumnsBySetViaSetReportRef.current || groupRowsBySetViaSetReportRef.current && prev.groupColumnsBy !== void 0;
67944
67982
  const nextGroupRowsBy = shouldTakePivotGroupsFromSource ? shouldKeepLocalRowGroup ? prev.groupRowsBy : sourceRowGroupOption : prev.groupRowsBy !== void 0 ? prev.groupRowsBy : groupRowsBySetViaSetReportRef.current ? prev.groupRowsBy : sourceRowGroupOption;
@@ -68078,7 +68116,7 @@ function useReport(reportIdArg, options = {}) {
68078
68116
  prevPivotStateForColumnExpansionRef.current = pivotState;
68079
68117
  }, [pivotState]);
68080
68118
  const effectiveReportBuilderTables = useMemo33(() => {
68081
- const explicitBaseFromSchemaPicker = Array.isArray(schemaDatasourceIds) && schemaDatasourceIds.length > 0 ? schemaDatasourceIds.map((tableName) => String(tableName ?? "").trim()).filter(Boolean).map((name2) => ({ name: name2 })) : null;
68119
+ const explicitBaseFromSchemaPicker = Array.isArray(schemaDatasourceIds) ? schemaDatasourceIds.map((tableName) => String(tableName ?? "").trim()).filter(Boolean).map((name2) => ({ name: name2 })) : null;
68082
68120
  const baseTablesForMerge = explicitBaseFromSchemaPicker ?? baseReportBuilderTables;
68083
68121
  return mergeReportBuilderTables(
68084
68122
  baseTablesForMerge,
@@ -68112,6 +68150,12 @@ function useReport(reportIdArg, options = {}) {
68112
68150
  () => baseReportBuilderTables.map((table2) => String(table2.name ?? "").trim()).filter((name2) => Boolean(name2)),
68113
68151
  [baseReportBuilderTables]
68114
68152
  );
68153
+ const datasourcePickerValues = useMemo33(() => {
68154
+ if (Array.isArray(schemaDatasourceIds)) {
68155
+ return schemaDatasourceIds.map((tableName) => String(tableName ?? "").trim()).filter((name2) => Boolean(name2));
68156
+ }
68157
+ return baseReportBuilderTableNames;
68158
+ }, [baseReportBuilderTableNames, schemaDatasourceIdsKey]);
68115
68159
  const normalizeQueryBuilderFieldNameForConfig = useMemo33(() => {
68116
68160
  const configEntries = Object.entries(queryBuilderFieldConfigByName);
68117
68161
  const preferredTableNames = /* @__PURE__ */ new Set([
@@ -70908,7 +70952,7 @@ function useReport(reportIdArg, options = {}) {
70908
70952
  }
70909
70953
  if (effectiveNextState.datasources !== void 0) {
70910
70954
  const nextIds = effectiveNextState.datasources.map((tableName) => String(tableName ?? "").trim()).filter(Boolean);
70911
- next.schemaDatasourceIds = nextIds.length > 0 ? nextIds : void 0;
70955
+ next.schemaDatasourceIds = nextIds;
70912
70956
  if (nextIds.length > 0) {
70913
70957
  pruneFormStateToExplicitDatasourceTables(next, nextIds, {
70914
70958
  sourceReport,
@@ -70961,6 +71005,15 @@ function useReport(reportIdArg, options = {}) {
70961
71005
  }
70962
71006
  }
70963
71007
  }
71008
+ } else {
71009
+ next.queryColumns = [];
71010
+ next.groupRowsBy = void 0;
71011
+ next.groupColumnsBy = void 0;
71012
+ next.aggregationState = [];
71013
+ next.aggregationTablesByIndex = [];
71014
+ next.pivotSort = void 0;
71015
+ next.regularSort = void 0;
71016
+ next.queryFilters = { combinator: "and", rules: [] };
70964
71017
  }
70965
71018
  }
70966
71019
  if (effectiveNextState.columns !== void 0) {
@@ -70981,6 +71034,8 @@ function useReport(reportIdArg, options = {}) {
70981
71034
  if (replacesDatasourceTableScope) {
70982
71035
  next.queryColumns = normalizedDisplayColumns;
70983
71036
  next.schemaDatasourceIds = [...requestedDisplayTableNames];
71037
+ } else if (effectiveNextState.datasources !== void 0 && normalizedDisplayColumns.length === 0) {
71038
+ next.queryColumns = [];
70984
71039
  } else {
70985
71040
  next.queryColumns = mergeReportBuilderColumns(
70986
71041
  next.queryColumns,
@@ -71366,6 +71421,28 @@ function useReport(reportIdArg, options = {}) {
71366
71421
  const hasReportFlagsOverride = overrides?.reportFlags !== void 0;
71367
71422
  const isFlatTable = String(resolvedChartType).toLowerCase() === "table" && !effectiveReportBuilderState.pivot;
71368
71423
  const isPivotTable = String(resolvedChartType).toLowerCase() === "table" && Boolean(effectiveReportBuilderState.pivot);
71424
+ const fallbackDetailColumns = effectiveReportBuilderState.columns.map(
71425
+ (column) => {
71426
+ const field = String(column.alias ?? "").trim() || String(column.field ?? "").trim();
71427
+ const tableName = String(column.table ?? "").trim();
71428
+ const metadata = [
71429
+ ...sourceReport.columnInternal ?? [],
71430
+ ...sourceReport.columns ?? []
71431
+ ].find((candidate) => {
71432
+ const candidateField = String(candidate.field ?? "").trim();
71433
+ const candidateTable = String(
71434
+ candidate.table ?? ""
71435
+ ).trim();
71436
+ return (candidateField === field || candidateField === String(column.field ?? "").trim()) && (!tableName || !candidateTable || candidateTable === tableName);
71437
+ });
71438
+ return {
71439
+ field,
71440
+ label: String(metadata?.label ?? "").trim() || toTitleCaseLabel(field),
71441
+ format: String(metadata?.format ?? "").trim() || "string"
71442
+ };
71443
+ }
71444
+ );
71445
+ const columnsSelectedForSave = table.columns.length > 0 ? table.columns : fallbackDetailColumns;
71369
71446
  const resp = await saveReport({
71370
71447
  report: {
71371
71448
  ...EMPTY_INTERNAL_REPORT,
@@ -71377,7 +71454,7 @@ function useReport(reportIdArg, options = {}) {
71377
71454
  dashboardName: resolvedDashboardName,
71378
71455
  ...isAdmin ? { adminMode: true } : {},
71379
71456
  ...hasSectionOverride ? { section: overrides.section } : {},
71380
- columns: isPivotTable ? chart?.columns ?? sourceReport.columns : table.columns,
71457
+ columns: columnsSelectedForSave,
71381
71458
  ...isFlatTable ? {
71382
71459
  sort: effectiveReportBuilderState.sort?.[0] ?? null
71383
71460
  } : {},
@@ -71466,6 +71543,7 @@ function useReport(reportIdArg, options = {}) {
71466
71543
  reportId: effectiveReportId || void 0,
71467
71544
  /* ── Selected value + pick list (same naming pattern throughout) ── */
71468
71545
  datasources,
71546
+ datasourcePickerValues,
71469
71547
  datasourceOptions,
71470
71548
  groupRowsBy,
71471
71549
  groupRowsByOptions,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillsql/react",
3
- "version": "2.16.89",
3
+ "version": "2.16.91",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {