My requirement is to get xrange chart working/understanding using highcharts library I am following a jsfiddle https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/gantt/demo/resource-management written in HTML/CSS/JS and writing the code for the same in Reactjs

import React from 'react'
import { render } from 'react-dom'
import HighchartsReact from 'highcharts-react-official'
import Highcharts from 'highcharts/highcharts'
import XRangeModule from 'highcharts/modules/xrange'
import exporting from 'highcharts/modules/exporting'
exporting(Highcharts)
XRangeModule(Highcharts)

let today = new Date()

const day = 1000 * 60 * 60 * 24,
  dateFormat = Highcharts.dateFormat

// Set to 00:00:00:000 today
today.setUTCHours(0)
today.setUTCMinutes(0)
today.setUTCSeconds(0)
today.setUTCMilliseconds(0)
today = today.getTime()

const cars = [
  {
    model: 'Nissan Leaf',
    current: 0,
    deals: [
      {
        rentedTo: 'Lisa Star',
        from: today - 1 * day,
        to: today + 2 * day
      },
      {
        rentedTo: 'Shane Long',
        from: today - 3 * day,
        to: today - 2 * day
      },
      {
        rentedTo: 'Jack Coleman',
        from: today + 5 * day,
        to: today + 6 * day
      }
    ]
  },
  {
    model: 'Jaguar E-type',
    current: 0,
    deals: [
      {
        rentedTo: 'Martin Hammond',
        from: today - 2 * day,
        to: today + 1 * day
      },
      {
        rentedTo: 'Linda Jackson',
        from: today - 2 * day,
        to: today + 1 * day
      },
      {
        rentedTo: 'Robert Sailor',
        from: today + 2 * day,
        to: today + 6 * day
      }
    ]
  },
  {
    model: 'Volvo V60',
    current: 0,
    deals: [
      {
        rentedTo: 'Mona Ricci',
        from: today + 0 * day,
        to: today + 3 * day
      },
      {
        rentedTo: 'Jane Dockerman',
        from: today + 3 * day,
        to: today + 4 * day
      },
      {
        rentedTo: 'Bob Shurro',
        from: today + 6 * day,
        to: today + 8 * day
      }
    ]
  },
  {
    model: 'Volkswagen Golf',
    current: 0,
    deals: [
      {
        rentedTo: 'Hailie Marshall',
        from: today - 1 * day,
        to: today + 1 * day
      },
      {
        rentedTo: 'Morgan Nicholson',
        from: today - 3 * day,
        to: today - 2 * day
      },
      {
        rentedTo: 'William Harriet',
        from: today + 2 * day,
        to: today + 3 * day
      }
    ]
  },
  {
    model: 'Peugeot 208',
    current: 0,
    deals: [
      {
        rentedTo: 'Harry Peterson',
        from: today - 1 * day,
        to: today + 2 * day
      },
      {
        rentedTo: 'Emma Wilson',
        from: today + 3 * day,
        to: today + 4 * day
      },
      {
        rentedTo: 'Ron Donald',
        from: today + 5 * day,
        to: today + 6 * day
      }
    ]
  }
]

// Parse car data into series.
const series = cars.map(function (car, i) {
  const data = car.deals.map(function (deal) {
    return {
      id: 'deal-' + i,
      rentedTo: deal.rentedTo,
      start: deal.from,
      end: deal.to,
      y: i,
      name: deal.rentedTo
    }
  })
  return {
    name: car.model,
    data: data,
    current: car.deals[car.current]
  }
})

const options = {
  series: series,
  plotOptions: {
    series: {
      dataLabels: {
        enabled: true,
        format: '{point.name}',
        style: {
          fontWeight: 'normal'
        }
      }
    }
  },
  title: {
    text: 'Car Rental Schedule'
  },
  tooltip: {
    pointFormat:
      '<span>Rented To: {point.rentedTo}</span><br/><span>From: {point.start:%e. %b}</span><br/><span>To: {point.end:%e. %b}</span>'
  },
  lang: {
    accessibility: {
      axis: {
        xAxisDescriptionPlural:
          'The chart has a two-part X axis showing time in both week numbers and days.',
        yAxisDescriptionSingular:
          'The chart has a tabular Y axis showing a data table row for each point.'
      }
    }
  },
  accessibility: {
    keyboardNavigation: {
      seriesNavigation: {
        mode: 'serialize'
      }
    },
    point: {
      valueDescriptionFormat:
        'Rented to {point.rentedTo} from {point.x:%A, %B %e} to {point.x2:%A, %B %e}.'
    },
    series: {
      descriptionFormat:
        '{series.name}, car {add series.index 1} of {series.chart.series.length}.'
    }
  },
  xAxis: {
    currentDateIndicator: true
  },
  yAxis: {
    type: 'category',
    grid: {
      columns: [
        {
          title: {
            text: 'Model'
          },
          categories: series.map(function (s) {
            return s.name
          })
        },
        {
          title: {
            text: 'Rented To'
          },
          categories: series.map(function (s) {
            return s.current.rentedTo
          })
        },
        {
          title: {
            text: 'From'
          },
          categories: series.map(function (s) {
            return dateFormat('%e. %b', s.current.from)
          })
        },
        {
          title: {
            text: 'To'
          },
          categories: series.map(function (s) {
            return dateFormat('%e. %b', s.current.to)
          })
        }
      ]
    }
  }
}

export default function Xrange() {
  return <HighchartsReact highcharts={Highcharts} options={options} />
}

but i see UI vastly different For React I got following UI enter image description here but from jsfiddle, I get enter image description here

Why so?

Also How is yaxis mapped in Highcharts gantt/xrange chart I have seen code snippets where we have no categories column mentioned but one of attribute from array objects is taking as yaxis?

1

There are 1 answers

0
ppotaczek On BEST ANSWER

You need to import highcharts-gantt product:

import Highcharts from "highcharts/highcharts-gantt";

And use ganttChart constructor type:

<HighchartsReact
  constructorType="ganttChart"
  highcharts={Highcharts}
  options={options}
/>

Live demo: https://codesandbox.io/s/highcharts-react-demo-gzgtvd?file=/demo.jsx

Docs: https://www.highcharts.com/docs/gantt/getting-started-gantt