UNPKG

ikizmet-apexcharts

Version:

iKizmet fork of Apex Charts library

324 lines (268 loc) 7.54 kB
import Bar from './Bar' import Fill from '../modules/Fill' import Graphics from '../modules/Graphics' import Utils from '../utils/Utils' /** * ApexCharts RangeBar Class responsible for drawing Range/Timeline Bars. * * @module RangeBar **/ class RangeBar extends Bar { draw(series, seriesIndex) { let w = this.w let graphics = new Graphics(this.ctx) let fill = new Fill(this.ctx) this.rangeBarOptions = this.w.config.plotOptions.rangeBar this.series = series this.seriesRangeStart = w.globals.seriesRangeStart this.seriesRangeEnd = w.globals.seriesRangeEnd this.initVariables(series) let ret = graphics.group({ class: 'apexcharts-rangebar-series apexcharts-plot-series' }) for (let i = 0, bc = 0; i < series.length; i++, bc++) { let pathTo, pathFrom let x, y, xDivision, // xDivision is the GRIDWIDTH divided by number of datapoints (columns) yDivision, // yDivision is the GRIDHEIGHT divided by number of datapoints (bars) zeroH, // zeroH is the baseline where 0 meets y axis zeroW // zeroW is the baseline where 0 meets x axis let yArrj = [] // hold y values of current iterating series let xArrj = [] // hold x values of current iterating series let realIndex = w.globals.comboCharts ? seriesIndex[i] : i // el to which series will be drawn let elSeries = graphics.group({ class: `apexcharts-series ${Utils.escapeString( w.globals.seriesNames[realIndex] )}`, rel: i + 1, 'data:realIndex': realIndex }) if (series[i].length > 0) { this.visibleI = this.visibleI + 1 } let strokeWidth = 0 let barHeight = 0 let barWidth = 0 if (this.yRatio.length > 1) { this.yaxisIndex = realIndex } let initPositions = this.initialPositions() y = initPositions.y yDivision = initPositions.yDivision barHeight = initPositions.barHeight zeroW = initPositions.zeroW x = initPositions.x barWidth = initPositions.barWidth xDivision = initPositions.xDivision zeroH = initPositions.zeroH xArrj.push(x + barWidth / 2) // eldatalabels let elDataLabelsWrap = graphics.group({ class: 'apexcharts-datalabels' }) for ( let j = 0, tj = w.globals.dataPoints; j < w.globals.dataPoints; j++, tj-- ) { if (typeof this.series[i][j] === 'undefined' || series[i][j] === null) { this.isNullValue = true } else { this.isNullValue = false } if (w.config.stroke.show) { if (this.isNullValue) { strokeWidth = 0 } else { strokeWidth = Array.isArray(this.strokeWidth) ? this.strokeWidth[realIndex] : this.strokeWidth } } let paths = null if (this.isHorizontal) { paths = this.drawRangeBarPaths({ indexes: { i, j, realIndex, bc }, barHeight, strokeWidth, pathTo, pathFrom, zeroW, x, y, yDivision, elSeries }) } else { paths = this.drawRangeColumnPaths({ indexes: { i, j, realIndex, bc }, x, y, xDivision, pathTo, pathFrom, barWidth, zeroH, strokeWidth, elSeries }) } pathTo = paths.pathTo pathFrom = paths.pathFrom y = paths.y x = paths.x // push current X if (j > 0) { xArrj.push(x + barWidth / 2) } yArrj.push(y) let pathFill = fill.fillPath({ seriesNumber: realIndex }) let lineFill = w.globals.stroke.colors[realIndex] elSeries = this.renderSeries({ realIndex, pathFill, lineFill, j, i, pathFrom, pathTo, strokeWidth, elSeries, x, y, series, barHeight, barWidth, elDataLabelsWrap, visibleSeries: this.visibleI, type: 'rangebar' }) } // push all x val arrays into main xArr w.globals.seriesXvalues[realIndex] = xArrj w.globals.seriesYvalues[realIndex] = yArrj ret.add(elSeries) } return ret } drawRangeColumnPaths({ indexes, x, y, strokeWidth, xDivision, pathTo, pathFrom, barWidth, zeroH }) { let w = this.w let graphics = new Graphics(this.ctx) let i = indexes.i let j = indexes.j const yRatio = this.yRatio[this.yaxisIndex] let realIndex = indexes.realIndex const range = this.getRangeValue(realIndex, j) let y1 = Math.min(range.start, range.end) let y2 = Math.max(range.start, range.end) if (w.globals.isXNumeric) { x = (w.globals.seriesX[i][j] - w.globals.minX) / this.xRatio - barWidth / 2 } let barXPosition = x + barWidth * this.visibleI pathTo = graphics.move(barXPosition, zeroH) pathFrom = graphics.move(barXPosition, zeroH) if (w.globals.previousPaths.length > 0) { pathFrom = this.getPathFrom(realIndex, j, true) } if ( typeof this.series[i][j] === 'undefined' || this.series[i][j] === null ) { y1 = zeroH } else { y1 = zeroH - y1 / yRatio y2 = zeroH - y2 / yRatio } pathTo = graphics.move(barXPosition, y2) + graphics.line(barXPosition + barWidth, y2) + graphics.line(barXPosition + barWidth, y1) + graphics.line(barXPosition, y1) + graphics.line(barXPosition, y2 - strokeWidth / 2) if (!w.globals.isXNumeric) { x = x + xDivision } return { pathTo, pathFrom, x, y: y2, barXPosition } } drawRangeBarPaths({ indexes, x, y, yDivision, pathTo, pathFrom, barHeight, zeroW }) { let w = this.w let graphics = new Graphics(this.ctx) let i = indexes.i let j = indexes.j let realIndex = indexes.realIndex let x1 = zeroW let x2 = zeroW if (w.globals.isXNumeric) { y = (w.globals.seriesX[i][j] - w.globals.minX) / this.invertedXRatio - barHeight } let barYPosition = y + barHeight * this.visibleI pathTo = graphics.move(zeroW, barYPosition) pathFrom = graphics.move(zeroW, barYPosition) if (w.globals.previousPaths.length > 0) { pathFrom = this.getPathFrom(realIndex, j) } if ( typeof this.series[i][j] !== 'undefined' && this.series[i][j] !== null ) { x1 = zeroW + this.seriesRangeStart[i][j] / this.invertedYRatio x2 = zeroW + this.seriesRangeEnd[i][j] / this.invertedYRatio } pathTo = graphics.move(x1, barYPosition) + graphics.line(x2, barYPosition) + graphics.line(x2, barYPosition + barHeight) + graphics.line(x1, barYPosition + barHeight) + graphics.line(x1, barYPosition) if (!w.globals.isXNumeric) { y = y + yDivision } return { pathTo, pathFrom, x: x2, y, barYPosition } } getRangeValue(i, j) { const w = this.w return { start: w.globals.seriesRangeStart[i][j], end: w.globals.seriesRangeEnd[i][j] } } } export default RangeBar