From f556ef53f3177746ec2526b4b963da4ef00c2d58 Mon Sep 17 00:00:00 2001 From: Corbin Bullard Date: Wed, 11 Oct 2023 13:31:21 -0400 Subject: [PATCH] fix(Charts): Set max row limit + removed the option to use an empty row limit value (#25579) --- .../src/shared-controls/sharedControls.tsx | 9 ++++- .../superset-ui-core/src/validator/index.ts | 1 + .../src/validator/validateMaxValue.ts | 8 ++++ .../test/validator/validateMaxValue.test.ts | 38 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 superset-frontend/packages/superset-ui-core/src/validator/validateMaxValue.ts create mode 100644 superset-frontend/packages/superset-ui-core/test/validator/validateMaxValue.test.ts diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx index 57419b491899f..80469e17a4dd4 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx @@ -47,6 +47,8 @@ import { isDefined, hasGenericChartAxes, NO_TIME_RANGE, + validateNonEmpty, + validateMaxValue, } from '@superset-ui/core'; import { @@ -243,7 +245,12 @@ const row_limit: SharedControlConfig<'SelectControl'> = { type: 'SelectControl', freeForm: true, label: t('Row limit'), - validators: [legacyValidateInteger], + clearable: false, + validators: [ + validateNonEmpty, + legacyValidateInteger, + v => validateMaxValue(v, 100000), + ], default: 10000, choices: formatSelectOptions(ROW_LIMIT_OPTIONS), description: t( diff --git a/superset-frontend/packages/superset-ui-core/src/validator/index.ts b/superset-frontend/packages/superset-ui-core/src/validator/index.ts index 532efcc959116..fb37328c02290 100644 --- a/superset-frontend/packages/superset-ui-core/src/validator/index.ts +++ b/superset-frontend/packages/superset-ui-core/src/validator/index.ts @@ -22,3 +22,4 @@ export { default as legacyValidateNumber } from './legacyValidateNumber'; export { default as validateInteger } from './validateInteger'; export { default as validateNumber } from './validateNumber'; export { default as validateNonEmpty } from './validateNonEmpty'; +export { default as validateMaxValue } from './validateMaxValue'; diff --git a/superset-frontend/packages/superset-ui-core/src/validator/validateMaxValue.ts b/superset-frontend/packages/superset-ui-core/src/validator/validateMaxValue.ts new file mode 100644 index 0000000000000..24c1da1c79dde --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/src/validator/validateMaxValue.ts @@ -0,0 +1,8 @@ +import { t } from '../translation'; + +export default function validateMaxValue(v: unknown, max: Number) { + if (Number(v) > +max) { + return t('Value cannot exceed %s', max); + } + return false; +} diff --git a/superset-frontend/packages/superset-ui-core/test/validator/validateMaxValue.test.ts b/superset-frontend/packages/superset-ui-core/test/validator/validateMaxValue.test.ts new file mode 100644 index 0000000000000..70f3d332c52e3 --- /dev/null +++ b/superset-frontend/packages/superset-ui-core/test/validator/validateMaxValue.test.ts @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { validateMaxValue } from '@superset-ui/core'; +import './setup'; + +describe('validateInteger()', () => { + it('returns the warning message if invalid', () => { + expect(validateMaxValue(10.1, 10)).toBeTruthy(); + expect(validateMaxValue(1, 0)).toBeTruthy(); + expect(validateMaxValue('2', 1)).toBeTruthy(); + }); + it('returns false if the input is valid', () => { + expect(validateMaxValue(0, 1)).toBeFalsy(); + expect(validateMaxValue(10, 10)).toBeFalsy(); + expect(validateMaxValue(undefined, 1)).toBeFalsy(); + expect(validateMaxValue(NaN, NaN)).toBeFalsy(); + expect(validateMaxValue(null, 1)).toBeFalsy(); + expect(validateMaxValue('1', 1)).toBeFalsy(); + expect(validateMaxValue('a', 1)).toBeFalsy(); + }); +});