mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 13:39:24 +08:00
121 lines
3.6 KiB
TypeScript
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;
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}) || [],
|
|
};
|
|
}
|
|
}
|