main.js 1.49 KB
import { isObject } from 'utils-lite'

function getTreeLegend (args) {
  const {
    dimension,
    rows
  } = args
  const result = rows.map(row => row[dimension])
  return { data: result }
}

function getTreeTooltip (args) {
  const {
    tooltipFormatter
  } = args

  return {
    trigger: 'item',
    triggerOn: 'mousemove',
    formatter: tooltipFormatter
  }
}

function getTreeSeries (args) {
  const {
    dimension,
    metrics,
    rows,
    seriesMap
  } = args

  const series = []
  rows.forEach(row => {
    const label = row[dimension]
    const seriesItem = seriesMap[label]
    const result = {
      type: 'tree',
      name: row[dimension],
      data: row[metrics]
    }
    if (seriesMap[row[dimension]]) {
      Object.keys(seriesItem).forEach(key => {
        if (isObject(result[key])) {
          Object.assign(result[key], seriesItem[key])
        } else {
          result[key] = seriesItem[key]
        }
      })
    }
    series.push(result)
  })

  return series
}

export const tree = (columns, rows, settings, extra) => {
  const {
    dimension = columns[0],
    metrics = columns[1],
    seriesMap = {}
  } = settings

  const { legendVisible, tooltipFormatter, tooltipVisible } = extra

  const series = getTreeSeries({
    dimension,
    metrics,
    rows,
    seriesMap
  })
  const legend = legendVisible && rows.length > 1 && getTreeLegend({
    dimension,
    rows
  })
  const tooltip = tooltipVisible && getTreeTooltip({
    tooltipFormatter
  })
  return { series, legend, tooltip }
}