export function generateConfig()

in packages/chart-render/src/widgets/Column/index.tsx [17:99]


export function generateConfig(
  meta: DataSource['meta'],
  data: DataSource['data']
): ColumnConfig {
  const { metaDim, metaInd } = splitMeta(meta);

  if (metaInd.length >= 1 && metaDim.length === 0) {
    // case 1: N指标、0维度 => 指标名作为 x 轴,指标值作为 y 轴
    const xField = 'type';
    const yField = 'value';
    return {
      xField,
      yField,
      data: data
        .map(item => {
          return metaInd.map(({ id, name }) => {
            return {
              [xField]: id,
              [yField]: item[id],
            };
          });
        })
        .flat(),
      meta: {
        [xField]: {
          formatter: label =>
            meta.find(({ id }) => label === id)?.name || label,
        },
      },
      tooltip: {
        // @ts-ignore
        formatter: ({ [xField]: type, [yField]: value }) => ({
          name: meta.find(({ id }) => type === id)?.name as string,
          value,
        }),
      },
    };
  } else if (metaInd.length === 1 && metaDim.length === 1) {
    // case 2: 单指标,单维度 => 维度作为 x 轴,指标作为 y 轴
    const xField = metaDim.shift()?.id as string;
    const yField = metaInd.shift()?.id as string;
    return {
      data,
      xField,
      yField,
      meta: {
        [yField]: { alias: meta.find(({ id }) => id === yField)?.name },
      },
    };
  } else if (metaInd.length > 1 && metaDim.length === 1) {
    // case 3: 多指标,单维度 => 维度作为 x 轴,指标名作为系列,指标值作为 y 轴
    const xField = metaDim.shift()?.id as string;
    const yField = 'value';
    const seriesField = 'type';
    return {
      data: data
        .map(item => {
          return metaInd.map(({ id, name }) => {
            return {
              [xField]: item[xField],
              [yField]: item[id],
              [seriesField]: name,
            };
          });
        })
        .flat(),
      xField,
      yField,
      seriesField,
      isGroup: true,
    };
  } else if (metaInd.length === 1 && metaDim.length === 2) {
    // case 3: 单指标,双维度
    return {
      data,
      xField: metaDim.shift()?.id as string,
      yField: metaInd.shift()?.id as string,
      seriesField: metaDim.shift()?.id,
      isGroup: true,
    };
  }
  return { data, xField: '', yField: '' };
}