114 lines
3.5 KiB
TypeScript
114 lines
3.5 KiB
TypeScript
/**
|
|
* 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 {
|
|
ControlPanelState,
|
|
ControlSetItem,
|
|
ControlState,
|
|
sharedControls,
|
|
Dataset,
|
|
ColumnMeta,
|
|
defineSavedMetrics,
|
|
} from '@superset-ui/chart-controls';
|
|
import { t } from '@superset-ui/core';
|
|
import { getQueryMode, isAggMode, validateAggControlValues } from './shared';
|
|
|
|
const percentMetrics: typeof sharedControls.metrics = {
|
|
type: 'MetricsControl',
|
|
label: t('Percentage metrics'),
|
|
description: t(
|
|
'Select one or many metrics to display, that will be displayed in the percentages of total. ' +
|
|
'Percentage metrics will be calculated only from data within the row limit. ' +
|
|
'You can use an aggregation function on a column or write custom SQL to create a percentage metric.',
|
|
),
|
|
multi: true,
|
|
visibility: isAggMode,
|
|
resetOnHide: false,
|
|
mapStateToProps: ({ datasource, controls }, controlState) => ({
|
|
columns: datasource?.columns || [],
|
|
savedMetrics: defineSavedMetrics(datasource),
|
|
datasource,
|
|
datasourceType: datasource?.type,
|
|
queryMode: getQueryMode(controls),
|
|
externalValidationErrors: validateAggControlValues(controls, [
|
|
controls.groupby?.value,
|
|
controls.metrics?.value,
|
|
controlState?.value,
|
|
]),
|
|
}),
|
|
rerender: ['groupby', 'metrics'],
|
|
default: [],
|
|
validators: [],
|
|
};
|
|
|
|
const dndPercentMetrics = {
|
|
...percentMetrics,
|
|
type: 'DndMetricSelect',
|
|
};
|
|
|
|
export const percentMetricsControlSetItem: ControlSetItem = {
|
|
name: 'percent_metrics',
|
|
config: {
|
|
...dndPercentMetrics,
|
|
},
|
|
};
|
|
|
|
export const metricsControlSetItem: ControlSetItem = {
|
|
name: 'metrics',
|
|
override: {
|
|
validators: [],
|
|
visibility: isAggMode,
|
|
mapStateToProps: (
|
|
{ controls, datasource, form_data }: ControlPanelState,
|
|
controlState: ControlState,
|
|
) => ({
|
|
columns: datasource?.columns[0]?.hasOwnProperty('filterable')
|
|
? (datasource as Dataset)?.columns?.filter(
|
|
(c: ColumnMeta) => c.filterable,
|
|
)
|
|
: datasource?.columns,
|
|
savedMetrics: defineSavedMetrics(datasource),
|
|
// current active adhoc metrics
|
|
selectedMetrics:
|
|
form_data.metrics || (form_data.metric ? [form_data.metric] : []),
|
|
datasource,
|
|
externalValidationErrors: validateAggControlValues(controls, [
|
|
controls.groupby?.value,
|
|
controls.percent_metrics?.value,
|
|
controlState.value,
|
|
]),
|
|
}),
|
|
rerender: ['groupby', 'percent_metrics'],
|
|
resetOnHide: false,
|
|
},
|
|
};
|
|
|
|
export const showTotalsControlSetItem: ControlSetItem = {
|
|
name: 'show_totals',
|
|
config: {
|
|
type: 'CheckboxControl',
|
|
label: t('Show totals'),
|
|
default: false,
|
|
description: t(
|
|
'Show total aggregations of selected metrics. Note that row limit does not apply to the result.',
|
|
),
|
|
visibility: isAggMode,
|
|
resetOnHide: false,
|
|
},
|
|
};
|