diff --git a/packages/web/src/designer/DesignerQueryDumper.ts b/packages/web/src/designer/DesignerQueryDumper.ts
index 182406e6c..c1930861c 100644
--- a/packages/web/src/designer/DesignerQueryDumper.ts
+++ b/packages/web/src/designer/DesignerQueryDumper.ts
@@ -79,26 +79,27 @@ export class DesignerQueryDumper {
return select;
}
- buildConditionFromFilterField(tables: DesignerTableInfo[], filterField: string): Condition {
+ buildConditionFromFilterField(tables: DesignerTableInfo[], filterField: string, getExpression?: Function): Condition {
const conditions = [];
for (const column of this.designer.columns || []) {
if (!column[filterField]) continue;
- const table = (this.designer.tables || []).find(x => x.designerId == column.designerId);
- if (!table) continue;
- if (!tables.find(x => x.designerId == table.designerId)) continue;
+
+ if (!column.isCustomExpression) {
+ const table = (this.designer.tables || []).find(x => x.designerId == column.designerId);
+ if (!table) continue;
+ if (!tables.find(x => x.designerId == table.designerId)) continue;
+ }
try {
const condition = parseFilter(column[filterField], findDesignerFilterType(column, this.designer));
if (condition) {
conditions.push(
_.cloneDeepWith(condition, expr => {
- if (expr.exprType == 'placeholder')
- return {
- exprType: 'column',
- columnName: column.columnName,
- source: findQuerySource(this.designer, column.designerId),
- };
+ if (expr.exprType == 'placeholder') {
+ if (getExpression) return getExpression(column);
+ return this.getColumnExpression(column);
+ }
})
);
}
@@ -122,45 +123,39 @@ export class DesignerQueryDumper {
};
}
- addConditions(select: Select, tables: DesignerTableInfo[]) {
- const additionalFilterCount = this.designer.settings?.additionalFilterCount || 0;
-
- const filterFields = ['filter', ..._.range(additionalFilterCount).map(index => `additionalFilter${index + 1}`)];
-
- const conditions = _.compact(filterFields.map(field => this.buildConditionFromFilterField(tables, field)));
+ addConditionsCore(select: Select, tables: DesignerTableInfo[], filterFields, selectField, getExpression?) {
+ const conditions: Condition[] = _.compact(
+ filterFields.map(field => this.buildConditionFromFilterField(tables, field, getExpression))
+ );
if (conditions.length == 0) {
return;
}
if (conditions.length == 0) {
- select.where = mergeConditions(select.where, conditions[0]);
+ select[selectField] = mergeConditions(select[selectField], conditions[0]);
return;
}
- select.where = mergeConditions(select.where, {
+ select[selectField] = mergeConditions(select[selectField], {
conditionType: 'or',
conditions,
});
}
- addGroupConditions(select: Select, tables: DesignerTableInfo[], selectIsGrouped: boolean) {
- for (const column of this.designer.columns || []) {
- if (!column.groupFilter) continue;
- const table = (this.designer.tables || []).find(x => x.designerId == column.designerId);
- if (!table) continue;
- if (!tables.find(x => x.designerId == table.designerId)) continue;
+ addConditions(select: Select, tables: DesignerTableInfo[]) {
+ const additionalFilterCount = this.designer.settings?.additionalFilterCount || 0;
+ const filterFields = ['filter', ..._.range(additionalFilterCount).map(index => `additionalFilter${index + 1}`)];
+ this.addConditionsCore(select, tables, filterFields, 'where');
+ }
- const condition = parseFilter(column.groupFilter, findDesignerFilterType(column, this.designer));
- if (condition) {
- select.having = mergeConditions(
- select.having,
- _.cloneDeepWith(condition, expr => {
- if (expr.exprType == 'placeholder') {
- return this.getColumnResultField(column, selectIsGrouped);
- }
- })
- );
- }
- }
+ addGroupConditions(select: Select, tables: DesignerTableInfo[], selectIsGrouped: boolean) {
+ const additionalGroupFilterCount = this.designer.settings?.additionalGroupFilterCount || 0;
+ const filterFields = [
+ 'groupFilter',
+ ..._.range(additionalGroupFilterCount).map(index => `additionalGroupFilter${index + 1}`),
+ ];
+ this.addConditionsCore(select, tables, filterFields, 'having', column =>
+ this.getColumnResultField(column, selectIsGrouped)
+ );
}
getColumnExpression(col): Expression {
diff --git a/packages/web/src/designer/types.ts b/packages/web/src/designer/types.ts
index 3116116d0..d42f2e076 100644
--- a/packages/web/src/designer/types.ts
+++ b/packages/web/src/designer/types.ts
@@ -38,6 +38,7 @@ export type DesignerColumnInfo = {
export type DesignerSettings = {
isDistinct?: boolean;
additionalFilterCount?: number;
+ additionalGroupFilterCount?: number;
};
export type DesignerInfo = {
diff --git a/packages/web/src/elements/QueryDesignColumns.svelte b/packages/web/src/elements/QueryDesignColumns.svelte
index e50db5227..d9bc26d4d 100644
--- a/packages/web/src/elements/QueryDesignColumns.svelte
+++ b/packages/web/src/elements/QueryDesignColumns.svelte
@@ -65,6 +65,26 @@
}));
};
+ const addGroupOrCondition = () => {
+ onChange(current => ({
+ ...current,
+ settings: {
+ ...current?.settings,
+ additionalGroupFilterCount: (current?.settings?.additionalGroupFilterCount ?? 0) + 1,
+ },
+ }));
+ };
+
+ const removeGroupOrCondition = () => {
+ onChange(current => ({
+ ...current,
+ settings: {
+ ...current?.settings,
+ additionalGroupFilterCount: (current?.settings?.additionalGroupFilterCount ?? 1) - 1,
+ },
+ }));
+ };
+
$: columns = value?.columns;
$: tables = value?.tables;
$: settings = value?.settings;
@@ -89,7 +109,18 @@
slot: 5,
props: { filterField: `additionalFilter${index + 1}` },
})),
- hasGroupedColumn && { fieldName: 'groupFilter', header: 'Group filter', slot: 6 },
+ hasGroupedColumn && {
+ fieldName: 'groupFilter',
+ header: 'Group filter',
+ slot: 5,
+ props: { filterField: 'groupFilter' },
+ },
+ ..._.range(hasGroupedColumn ? settings?.additionalGroupFilterCount || 0 : 0).map(index => ({
+ fieldName: `additionalGroupFilter${index + 1}`,
+ header: `OR group filter ${index + 2}`,
+ slot: 5,
+ props: { filterField: `additionalGroupFilter${index + 1}` },
+ })),
{ fieldName: 'actions', header: '', slot: 7 },
]}
>
@@ -175,15 +206,6 @@
}}
/>
-
- {
- changeColumn({ ...row, groupFilter });
- }}
- />
-
removeColumn(row)}>Remove
@@ -193,6 +215,12 @@
{#if settings?.additionalFilterCount > 0}
{/if}
+ {#if hasGroupedColumn}
+
+ {/if}
+ {#if hasGroupedColumn && settings?.additionalGroupFilterCount > 0}
+
+ {/if}