@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 +87 -9
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +87 -9
- package/package.json +1 -1
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
|
|
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
|
-
|
|
66523
|
-
|
|
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
|
|
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)
|
|
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
|
|
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:
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
66731
|
-
|
|
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
|
|
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)
|
|
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
|
|
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:
|
|
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,
|