mirror of
https://github.com/apache/superset.git
synced 2026-07-09 08:15:49 +00:00
Co-authored-by: Superset Dev <dev@superset.apache.org> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
114 lines
3.2 KiB
TypeScript
114 lines
3.2 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 {
|
|
DataRecordValue,
|
|
getSmallNumberFormatter,
|
|
isDefined,
|
|
isProbablyHTML,
|
|
sanitizeHtml,
|
|
} from '@superset-ui/core';
|
|
import { GenericDataType } from '@apache-superset/core/common';
|
|
import {
|
|
ValueFormatterParams,
|
|
ValueGetterParams,
|
|
} from '@superset-ui/core/components/ThemedAgGridReact';
|
|
import { DataColumnMeta, InputColumn } from '../types';
|
|
import DateWithFormatter from './DateWithFormatter';
|
|
|
|
/**
|
|
* Format text for cell value.
|
|
*/
|
|
function formatValue(
|
|
formatter: DataColumnMeta['formatter'],
|
|
value: DataRecordValue,
|
|
): [boolean, string] {
|
|
// render undefined as empty string
|
|
if (value === undefined) {
|
|
return [false, ''];
|
|
}
|
|
// render null as `N/A`
|
|
if (
|
|
value === null ||
|
|
// null values in temporal columns are wrapped in a Date object, so make sure we
|
|
// handle them here too
|
|
(value instanceof DateWithFormatter && value.input === null)
|
|
) {
|
|
return [false, 'N/A'];
|
|
}
|
|
if (formatter) {
|
|
return [false, formatter(value as number)];
|
|
}
|
|
if (typeof value === 'string') {
|
|
return isProbablyHTML(value) ? [true, sanitizeHtml(value)] : [false, value];
|
|
}
|
|
return [false, value.toString()];
|
|
}
|
|
|
|
export function formatColumnValue(
|
|
column: DataColumnMeta,
|
|
value: DataRecordValue,
|
|
) {
|
|
const { dataType, formatter, config = {} } = column;
|
|
const isNumber = dataType === GenericDataType.Numeric;
|
|
const smallNumberFormatter = getSmallNumberFormatter(
|
|
formatter,
|
|
config.d3SmallNumberFormat,
|
|
config.currencyFormat,
|
|
);
|
|
return formatValue(
|
|
isNumber && typeof value === 'number' && Math.abs(value) < 1
|
|
? smallNumberFormatter
|
|
: formatter,
|
|
value,
|
|
);
|
|
}
|
|
|
|
export const valueFormatter = (
|
|
params: ValueFormatterParams,
|
|
col: InputColumn,
|
|
): string => {
|
|
const { value, node } = params;
|
|
if (
|
|
isDefined(value) &&
|
|
value !== '' &&
|
|
!(value instanceof DateWithFormatter && value.input === null)
|
|
) {
|
|
return col.formatter?.(value) || value;
|
|
}
|
|
if (node?.level === -1) {
|
|
return '';
|
|
}
|
|
return 'N/A';
|
|
};
|
|
|
|
export const valueGetter = (params: ValueGetterParams, col: InputColumn) => {
|
|
// @ts-expect-error
|
|
if (params?.colDef?.isMain) {
|
|
const modifiedColId = `Main ${params.column.getColId()}`;
|
|
return params.data[modifiedColId];
|
|
}
|
|
if (isDefined(params.data?.[params.column.getColId()])) {
|
|
return params.data[params.column.getColId()];
|
|
}
|
|
if (col.isNumeric) {
|
|
return undefined;
|
|
}
|
|
return '';
|
|
};
|