main.js 2.02 KB
import {
  isObject,
  isArray
} from 'utils-lite'

import {
  getFormated
} from '../../utils'

function getTooltip (args) {
  const {
    tooltipFormatter,
    dataType,
    digit
  } = args

  return {
    show: true,
    formatter (options) {
      const {
        seriesName,
        value
      } = options
      if (tooltipFormatter) {
        return tooltipFormatter.apply(null, arguments)
      }

      return [
        `${seriesName}: `,
        getFormated(value, dataType, digit)
      ].join('')
    }
  }
}

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

  let itemWave = wave
  let len = isArray(seriesMap) ? seriesMap.length : 0

  return rows.slice().map((item, index) => {
    let data = []
    let result = {
      type: 'liquidFill'
    }

    let name = item[dimension]
    let val = Number(item[metrics])
    let itemMap = {}

    if (isArray(seriesMap)) {
      itemMap = !seriesMap[index] ? seriesMap[len - 1] : seriesMap[index]
    } else if (isObject(seriesMap[name])) {
      itemMap = seriesMap[name]
    }

    if (isArray(wave) && isArray(wave[0])) {
      itemWave = isArray(wave[index]) ? wave[index] : wave[wave.length - 1]
    }

    // 根据传入的数据(rows)和额外配置(seriesMap)的数据组合data
    data.push({ value: val })
    if (itemWave && itemWave.length) {
      data = data.concat(itemWave.map(val => ({ value: val })))
    }

    result = Object.assign(result, { data, name }, itemMap)
    return result
  })
}

export const liquidfill = (columns, rows, settings, extra) => {
  const {
    dimension = columns[0],
    metrics = columns[1],
    seriesMap = {},
    dataType = 'percent',
    digit = 2,
    wave = []
  } = settings

  const {
    tooltipVisible,
    tooltipFormatter
  } = extra

  const tooltip = tooltipVisible && getTooltip({
    tooltipFormatter,
    dataType,
    digit
  })
  const series = getSeries({
    rows,
    columns,
    dimension,
    metrics,
    seriesMap,
    wave
  })

  return {
    tooltip,
    series
  }
}