[Dashboards] - Min Max range on secondary axis bar charts (#15118)

video QA


https://github.com/user-attachments/assets/70c37188-2398-43de-bbf6-5882bb79940a

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
nitin
2025-10-22 14:21:01 +05:30
committed by GitHub
parent c6addc2bb4
commit 226cc9eb74
37 changed files with 1096 additions and 407 deletions
@@ -29,7 +29,6 @@ import {
} from 'src/engine/api/common/types/common-query-args.type';
import { isWorkspaceAuthContext } from 'src/engine/api/common/utils/is-workspace-auth-context.util';
import { GraphqlQueryParser } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query.parser';
import { computeIsNumericReturningAggregate } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/compute-is-numeric-returning-aggregate.util';
import { formatResultWithGroupByDimensionValues } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/format-result-with-group-by-dimension-values.util';
import { getGroupByExpression } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/get-group-by-expression.util';
import { isGroupByDateField } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/is-group-by-date-field.util';
@@ -169,32 +168,6 @@ export class CommonGroupByQueryRunnerService extends CommonBaseQueryRunnerServic
}
});
if (processedArgs.omitNullValues) {
const aggregateFields = selectedFieldsResult.aggregate ?? {};
Object.values(aggregateFields).forEach((aggregationField) => {
const aggregateExpression =
ProcessAggregateHelper.getAggregateExpression(
aggregationField,
objectMetadataNameSingular,
);
if (aggregateExpression) {
queryBuilder.andHaving(`${aggregateExpression} IS NOT NULL`);
const isNumericReturningAggregate =
computeIsNumericReturningAggregate(
aggregationField.aggregateOperation,
aggregationField.fromFieldType,
);
if (isNumericReturningAggregate) {
queryBuilder.andHaving(`${aggregateExpression} != 0`);
}
}
});
}
commonQueryParser.applyGroupByOrderToBuilder(
queryBuilder,
processedArgs.orderBy ?? [],
@@ -49,7 +49,6 @@ export interface GroupByQueryArgs {
filter?: ObjectRecordFilter;
orderBy?: OrderByWithGroupBy;
groupBy: ObjectRecordGroupBy;
omitNullValues?: boolean;
viewId?: string;
}
@@ -25,7 +25,6 @@ import { IGroupByConnection } from 'src/engine/api/graphql/workspace-query-runne
import { type WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface';
import { GroupByResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { computeIsNumericReturningAggregate } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/compute-is-numeric-returning-aggregate.util';
import { formatResultWithGroupByDimensionValues } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/format-result-with-group-by-dimension-values.util';
import { getGroupByExpression } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/get-group-by-expression.util';
import { isGroupByDateField } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/is-group-by-date-field.util';
@@ -137,33 +136,6 @@ export class GraphqlQueryGroupByResolverService extends GraphqlQueryBaseResolver
}
});
if (executionArgs.args.omitNullValues) {
const aggregateFields =
executionArgs.graphqlQuerySelectedFieldsResult.aggregate ?? {};
Object.values(aggregateFields).forEach((aggregationField) => {
const aggregateExpression =
ProcessAggregateHelper.getAggregateExpression(
aggregationField,
objectMetadataNameSingular,
);
if (aggregateExpression) {
queryBuilder.andHaving(`${aggregateExpression} IS NOT NULL`);
const isNumericReturningAggregate =
computeIsNumericReturningAggregate(
aggregationField.aggregateOperation,
aggregationField.fromFieldType,
);
if (isNumericReturningAggregate) {
queryBuilder.andHaving(`${aggregateExpression} != 0`);
}
}
});
}
executionArgs.graphqlQueryParser.applyGroupByOrderToBuilder(
queryBuilder,
executionArgs.args.orderBy ?? [],
@@ -63,7 +63,6 @@ export interface GroupByResolverArgs<Filter = ObjectRecordFilter> {
groupBy: ObjectRecordGroupBy;
viewId?: string;
orderBy?: OrderByWithGroupBy;
omitNullValues?: boolean;
}
export interface UpdateOneResolverArgs<
@@ -177,10 +177,7 @@ export const getResolverArgs = (
isNullable: true,
isArray: true,
},
omitNullValues: {
type: GraphQLBoolean,
isNullable: true,
},
viewId: {
type: UUIDScalarType,
isNullable: true,
@@ -6,7 +6,6 @@ import { CommonGroupByQueryRunnerService } from 'src/engine/api/common/common-qu
import { parseAggregateFieldsRestRequest } from 'src/engine/api/rest/input-request-parsers/aggregate-fields-parser-utils/parse-aggregate-fields-rest-request.util';
import { parseFilterRestRequest } from 'src/engine/api/rest/input-request-parsers/filter-parser-utils/parse-filter-rest-request.util';
import { parseGroupByRestRequest } from 'src/engine/api/rest/input-request-parsers/group-by-parser-utils/parse-group-by-rest-request.util';
import { parseOmitNullValuesRestRequest } from 'src/engine/api/rest/input-request-parsers/omit-null-values-parser-utils/parse-omit-null-values-rest-request.util';
import { parseOrderByWithGroupByRestRequest } from 'src/engine/api/rest/input-request-parsers/order-by-with-group-by-parser-utils/parse-order-by-with-group-by-rest-request.util';
import { parseViewIdRestRequest } from 'src/engine/api/rest/input-request-parsers/view-id-parser-utils/parse-view-id-rest-request.util';
import { AuthenticatedRequest } from 'src/engine/api/rest/types/authenticated-request';
@@ -28,14 +27,8 @@ export class RestApiGroupByHandler extends RestApiBaseHandler {
objectMetadataMaps,
} = await this.buildCommonOptions(request);
const {
filter,
orderBy,
viewId,
groupBy,
selectedFields,
omitNullValues,
} = this.parseRequestArgs(request);
const { filter, orderBy, viewId, groupBy, selectedFields } =
this.parseRequestArgs(request);
return await this.commonGroupByQueryRunnerService.run({
args: {
@@ -44,7 +37,6 @@ export class RestApiGroupByHandler extends RestApiBaseHandler {
viewId,
groupBy,
selectedFields,
omitNullValues,
},
authContext,
objectMetadataMaps,
@@ -61,7 +53,6 @@ export class RestApiGroupByHandler extends RestApiBaseHandler {
const viewId = parseViewIdRestRequest(request);
const groupBy = parseGroupByRestRequest(request);
const aggregateFields = parseAggregateFieldsRestRequest(request);
const omitNullValues = parseOmitNullValuesRestRequest(request);
const selectedFields = { ...aggregateFields, groupByDimensionValues: true };
return {
@@ -70,7 +61,6 @@ export class RestApiGroupByHandler extends RestApiBaseHandler {
viewId,
groupBy,
selectedFields,
omitNullValues,
};
}
}