121 lines
3.6 KiB
TypeScript

/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import { G2PlotChart } from './g2plot';
import { ChartType, RenderProps } from '../chart';
import React from 'react';
import { DualAxes as G2DualAxes } from '@ant-design/plots';
import lodash from 'lodash';
export class DualAxes extends G2PlotChart {
constructor() {
super({ name: 'dualAxes', title: 'Dual Axes Chart', Component: G2DualAxes });
this.config = [
'xField',
{
yField: {
title: '{{t("yField")}}',
type: 'array',
'x-decorator': 'FormItem',
'x-component': 'ArrayItems',
items: {
type: 'void',
'x-component': 'Space',
properties: {
sort: {
type: 'void',
'x-decorator': 'FormItem',
'x-component': 'ArrayItems.SortHandle',
},
input: {
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'Select',
'x-reactions': '{{ useChartFields }}',
'x-component-props': {
style: {
minWidth: '200px',
},
},
required: true,
},
remove: {
type: 'void',
'x-decorator': 'FormItem',
'x-component': 'ArrayItems.Remove',
},
},
},
properties: {
add: {
type: 'void',
title: '{{t("Add")}}',
'x-component': 'ArrayItems.Addition',
},
},
},
},
'size',
];
}
init: ChartType['init'] = (fields, { measures, dimensions }) => {
const { xField, yFields } = this.infer(fields, { measures, dimensions });
return {
general: {
xField: xField?.value,
yField: yFields?.map((f) => f.value) || [],
},
};
};
getProps({ data, general, advanced, fieldProps }: RenderProps) {
const props = super.getProps({ data, general, advanced, fieldProps });
return {
...lodash.omit(props, ['legend', 'tooltip', 'yField']),
children:
props.yField?.map((yField: string, index: number) => {
return {
type: 'line',
yField,
tooltip: {
items: [
(data: any) => {
const { [yField]: y } = data;
const yFieldProps = fieldProps[yField];
const name = yFieldProps?.label || yField;
const value = yFieldProps?.transformer ? yFieldProps.transformer(y) : y;
return {
name,
value,
};
},
],
},
colorField: () => {
const props = fieldProps[yField];
return props?.label || yField;
},
axis: {
y: {
title: fieldProps[yField]?.label || yField,
position: index === 0 ? 'left' : 'right',
labelFormatter: (datnum) => {
const props = fieldProps[yField];
const transformer = props?.transformer;
return transformer ? transformer(datnum) : datnum;
},
},
},
};
}) || [],
};
}
}