Replace c3 (#11112)

* [charts] replace in asset.js

* replace in reports
diff --git a/erpnext/accounts/doctype/asset/asset.js b/erpnext/accounts/doctype/asset/asset.js
index 7c4eeae..e3afc35 100644
--- a/erpnext/accounts/doctype/asset/asset.js
+++ b/erpnext/accounts/doctype/asset/asset.js
@@ -55,13 +55,13 @@
 				});
 			}
 
-			frm.trigger("show_graph");
+			frm.trigger("setup_chart");
 		}
 	},
 
-	show_graph: function(frm) {
-		var x_intervals = ["x", frm.doc.purchase_date];
-		var asset_values = ["Asset Value", frm.doc.gross_purchase_amount];
+	setup_chart: function(frm) {
+		var x_intervals = [frm.doc.purchase_date];
+		var asset_values = [frm.doc.gross_purchase_amount];
 		var last_depreciation_date = frm.doc.purchase_date;
 
 		if(frm.doc.opening_accumulated_depreciation) {
@@ -94,32 +94,21 @@
 			last_depreciation_date = frm.doc.disposal_date;
 		}
 
-		frm.dashboard.setup_chart({
+		frm.dashboard.render_graph({
+			title: "Asset Value",
 			data: {
-				x: 'x',
-				columns: [x_intervals, asset_values],
-				regions: {
-					'Asset Value': [{'start': last_depreciation_date, 'style':'dashed'}]
-				}
+				labels: x_intervals,
+				datasets: [{
+					color: 'green',
+					values: asset_values,
+					formatted: asset_values.map(d => d.toFixed(2))
+				}]
 			},
-			legend: {
-				show: false
-			},
-			axis: {
-				x: {
-					type: 'timeseries',
-					tick: {
-						format: "%d-%m-%Y"
-					}
-				},
-				y: {
-					min: 0,
-					padding: {bottom: 10}
-				}
-			}
+			type: 'line'
 		});
 	},
 
+
 	item_code: function(frm) {
 		if(frm.doc.item_code) {
 			frappe.call({
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 9906893..56db392 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -44,7 +44,7 @@
 			})
 
 		columns += [_("Age (Days)") + ":Int:80"]
-		
+
 		self.ageing_col_idx_start = len(columns)
 
 		if not "range1" in self.filters:
@@ -53,7 +53,7 @@
 			self.filters["range2"] = "60"
 		if not "range3" in self.filters:
 			self.filters["range3"] = "90"
-			
+
 		for label in ("0-{range1}".format(range1=self.filters["range1"]),
 			"{range1}-{range2}".format(range1=cint(self.filters["range1"])+ 1, range2=self.filters["range2"]),
 			"{range2}-{range3}".format(range2=cint(self.filters["range2"])+ 1, range3=self.filters["range3"]),
@@ -74,14 +74,14 @@
 		})
 		if args.get("party_type") == "Customer":
 			columns += [
-				_("Territory") + ":Link/Territory:80", 
+				_("Territory") + ":Link/Territory:80",
 				_("Customer Group") + ":Link/Customer Group:120"
 			]
 		if args.get("party_type") == "Supplier":
 			columns += [_("Supplier Type") + ":Link/Supplier Type:80"]
-			
+
 		columns.append(_("Remarks") + "::200")
-		
+
 		return columns
 
 	def get_data(self, party_naming_by, args):
@@ -97,13 +97,13 @@
 			self.filters["company"] = frappe.db.get_single_value('Global Defaults', 'default_company')
 
 		company_currency = frappe.db.get_value("Company", self.filters.get("company"), "default_currency")
-		
+
 		return_entries = self.get_return_entries(args.get("party_type"))
 
 		data = []
 		for gle in self.get_entries_till(self.filters.report_date, args.get("party_type")):
 			if self.is_receivable_or_payable(gle, dr_or_cr, future_vouchers):
-				outstanding_amount, credit_note_amount = self.get_outstanding_amount(gle, 
+				outstanding_amount, credit_note_amount = self.get_outstanding_amount(gle,
 					self.filters.report_date, dr_or_cr, return_entries, currency_precision)
 				if abs(outstanding_amount) > 0.1/10**currency_precision:
 					row = [gle.posting_date, gle.party]
@@ -179,15 +179,15 @@
 			# entries adjusted with future vouchers
 			((gle.against_voucher_type, gle.against_voucher) in future_vouchers)
 		)
-		
+
 	def get_return_entries(self, party_type):
 		doctype = "Sales Invoice" if party_type=="Customer" else "Purchase Invoice"
-		return [d.name for d in frappe.get_all(doctype, filters={"is_return": 1, "docstatus": 1})]	
+		return [d.name for d in frappe.get_all(doctype, filters={"is_return": 1, "docstatus": 1})]
 
 	def get_outstanding_amount(self, gle, report_date, dr_or_cr, return_entries, currency_precision):
 		payment_amount, credit_note_amount = 0.0, 0.0
 		reverse_dr_or_cr = "credit" if dr_or_cr=="debit" else "debit"
-		
+
 		for e in self.get_gl_entries_for(gle.party, gle.party_type, gle.voucher_type, gle.voucher_no):
 			if getdate(e.posting_date) <= report_date and e.name!=gle.name:
 				amount = flt(e.get(reverse_dr_or_cr)) - flt(e.get(dr_or_cr))
@@ -195,11 +195,11 @@
 					payment_amount += amount
 				else:
 					credit_note_amount += amount
-					
+
 		outstanding_amount = flt((flt(gle.get(dr_or_cr)) - flt(gle.get(reverse_dr_or_cr)) \
 			- payment_amount - credit_note_amount), currency_precision)
 		credit_note_amount = flt(credit_note_amount, currency_precision)
-		
+
 		return outstanding_amount, credit_note_amount
 
 	def get_party_name(self, party_type, party_name):
@@ -207,7 +207,7 @@
 
 	def get_territory(self, party_name):
 		return self.get_party_map("Customer").get(party_name, {}).get("territory") or ""
-		
+
 	def get_customer_group(self, party_name):
 		return self.get_party_map("Customer").get(party_name, {}).get("customer_group") or ""
 
@@ -220,7 +220,7 @@
 				select_fields = "name, customer_name, territory, customer_group"
 			elif party_type == "Supplier":
 				select_fields = "name, supplier_name, supplier_type"
-			
+
 			self.party_map = dict(((r.name, r) for r in frappe.db.sql("select {0} from `tab{1}`"
 				.format(select_fields, party_type), as_dict=True)))
 
@@ -250,8 +250,8 @@
 			else:
 				select_fields = "sum(debit) as debit, sum(credit) as credit"
 
-			self.gl_entries = frappe.db.sql("""select name, posting_date, account, party_type, party, 
-				voucher_type, voucher_no, against_voucher_type, against_voucher, 
+			self.gl_entries = frappe.db.sql("""select name, posting_date, account, party_type, party,
+				voucher_type, voucher_no, against_voucher_type, against_voucher,
 				account_currency, remarks, {0}
 				from `tabGL Entry`
 				where docstatus < 2 and party_type=%s and (party is not null and party != '') {1}
@@ -277,13 +277,13 @@
 
 		if party_type_field=="customer":
 			if self.filters.get("customer_group"):
-				lft, rgt = frappe.db.get_value("Customer Group", 
+				lft, rgt = frappe.db.get_value("Customer Group",
 					self.filters.get("customer_group"), ["lft", "rgt"])
-			
-				conditions.append("""party in (select name from tabCustomer 
-					where exists(select name from `tabCustomer Group` where lft >= {0} and rgt <= {1} 
+
+				conditions.append("""party in (select name from tabCustomer
+					where exists(select name from `tabCustomer Group` where lft >= {0} and rgt <= {1}
 						and name=tabCustomer.customer_group))""".format(lft, rgt))
-						
+
 			if self.filters.get("credit_days_based_on"):
 				conditions.append("party in (select name from tabCustomer where credit_days_based_on=%s)")
 				values.append(self.filters.get("credit_days_based_on"))
@@ -303,22 +303,22 @@
 		return self.gl_entries_map.get(party, {})\
 			.get(against_voucher_type, {})\
 			.get(against_voucher, [])
-			
+
 	def get_chart_data(self, columns, data):
 		ageing_columns = columns[self.ageing_col_idx_start : self.ageing_col_idx_start+4]
-		
+
 		rows = []
 		for d in data:
 			rows.append(d[self.ageing_col_idx_start : self.ageing_col_idx_start+4])
 
 		if rows:
 			rows.insert(0, [[d.get("label")] for d in ageing_columns])
-		
+
 		return {
 			"data": {
-				'rows': rows
+				'labels': rows
 			},
-			"chart_type": 'pie'
+			"type": 'percentage'
 		}
 
 def execute(filters=None):
diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.py b/erpnext/accounts/report/balance_sheet/balance_sheet.py
index 2db4ef8..18b07ea 100644
--- a/erpnext/accounts/report/balance_sheet/balance_sheet.py
+++ b/erpnext/accounts/report/balance_sheet/balance_sheet.py
@@ -8,18 +8,18 @@
 from erpnext.accounts.report.financial_statements import (get_period_list, get_columns, get_data)
 
 def execute(filters=None):
-	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year, 
+	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year,
 		filters.periodicity, company=filters.company)
 
-	asset = get_data(filters.company, "Asset", "Debit", period_list, 
+	asset = get_data(filters.company, "Asset", "Debit", period_list,
 		only_current_fiscal_year=False, filters=filters,
 		accumulated_values=filters.accumulated_values)
-		
-	liability = get_data(filters.company, "Liability", "Credit", period_list, 
+
+	liability = get_data(filters.company, "Liability", "Credit", period_list,
 		only_current_fiscal_year=False, filters=filters,
 		accumulated_values=filters.accumulated_values)
-		
-	equity = get_data(filters.company, "Equity", "Credit", period_list, 
+
+	equity = get_data(filters.company, "Equity", "Credit", period_list,
 		only_current_fiscal_year=False, filters=filters,
 		accumulated_values=filters.accumulated_values)
 
@@ -43,17 +43,17 @@
 			unclosed[period.key] = opening_balance
 			if provisional_profit_loss:
 				provisional_profit_loss[period.key] = provisional_profit_loss[period.key] - opening_balance
-				
+
 		unclosed["total"]=opening_balance
 		data.append(unclosed)
-		
+
 	if provisional_profit_loss:
 		data.append(provisional_profit_loss)
 	if total_credit:
-		data.append(total_credit)		
+		data.append(total_credit)
 
 	columns = get_columns(filters.periodicity, period_list, filters.accumulated_values, company=filters.company)
-	
+
 	chart = get_chart_data(filters, columns, asset, liability, equity)
 
 	return columns, data, message, chart
@@ -87,7 +87,7 @@
 
 			total += flt(provisional_profit_loss[period.key])
 			provisional_profit_loss["total"] = total
-			
+
 			total_row_total += flt(total_row[period.key])
 			total_row["total"] = total_row_total
 
@@ -98,7 +98,7 @@
 				"warn_if_negative": True,
 				"currency": currency
 			})
-			
+
 	return provisional_profit_loss, total_row
 
 def check_opening_balance(asset, liability, equity):
@@ -111,17 +111,17 @@
 		opening_balance -= flt(liability[0].get("opening_balance", 0), float_precision)
 	if equity:
 		opening_balance -= flt(equity[0].get("opening_balance", 0), float_precision)
-		
+
 	opening_balance = flt(opening_balance, float_precision)
 	if opening_balance:
 		return _("Previous Financial Year is not closed"),opening_balance
 	return None,None
-		
+
 def get_chart_data(filters, columns, asset, liability, equity):
-	x_intervals = ['x'] + [d.get("label") for d in columns[2:]]
-	
+	labels = [d.get("label") for d in columns[2:]]
+
 	asset_data, liability_data, equity_data = [], [], []
-	
+
 	for p in columns[2:]:
 		if asset:
 			asset_data.append(asset[-2].get(p.get("fieldname")))
@@ -129,23 +129,25 @@
 			liability_data.append(liability[-2].get(p.get("fieldname")))
 		if equity:
 			equity_data.append(equity[-2].get(p.get("fieldname")))
-		
-	columns = [x_intervals]
+
+	datasets = []
 	if asset_data:
-		columns.append(["Assets"] + asset_data)
+		datasets.append({'title':'Assets', 'values': asset_data})
 	if liability_data:
-		columns.append(["Liabilities"] + liability_data)
+		datasets.append({'title':'Liabilities', 'values': liability_data})
 	if equity_data:
-		columns.append(["Equity"] + equity_data)
+		datasets.append({'title':'Equity', 'values': equity_data})
 
 	chart = {
 		"data": {
-			'x': 'x',
-			'columns': columns
+			'labels': labels,
+			'datasets': datasets
 		}
 	}
 
 	if not filters.accumulated_values:
-		chart["chart_type"] = "bar"
+		chart["type"] = "bar"
+	else:
+		chart["type"] = "line"
 
 	return chart
\ No newline at end of file
diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
index 6729d67..89ee63a 100644
--- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
+++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
@@ -8,15 +8,15 @@
 from erpnext.accounts.report.financial_statements import (get_period_list, get_columns, get_data)
 
 def execute(filters=None):
-	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year, 
+	period_list = get_period_list(filters.from_fiscal_year, filters.to_fiscal_year,
 		filters.periodicity, filters.accumulated_values, filters.company)
 
 	income = get_data(filters.company, "Income", "Credit", period_list, filters = filters,
-		accumulated_values=filters.accumulated_values, 
+		accumulated_values=filters.accumulated_values,
 		ignore_closing_entries=True, ignore_accumulated_values_for_fy= True)
-		
+
 	expense = get_data(filters.company, "Expense", "Debit", period_list, filters=filters,
-		accumulated_values=filters.accumulated_values, 
+		accumulated_values=filters.accumulated_values,
 		ignore_closing_entries=True, ignore_accumulated_values_for_fy= True)
 
 	net_profit_loss = get_net_profit_loss(income, expense, period_list, filters.company)
@@ -61,7 +61,7 @@
 
 
 def get_chart_data(filters, columns, income, expense, net_profit_loss):
-	x_intervals = ['x'] + [d.get("label") for d in columns[2:]]
+	labels = [d.get("label") for d in columns[2:]]
 
 	income_data, expense_data, net_profit = [], [], []
 
@@ -73,27 +73,24 @@
 		if net_profit_loss:
 			net_profit.append(net_profit_loss.get(p.get("fieldname")))
 
-	columns = [x_intervals]
+	datasets = []
 	if income_data:
-		columns.append(["Income"] + income_data)
+		datasets.append({'title': 'Income', 'values': income_data})
 	if expense_data:
-		columns.append(["Expense"] + expense_data)
+		datasets.append({'title': 'Expense', 'values': expense_data})
 	if net_profit:
-		columns.append(["Net Profit/Loss"] + net_profit)
+		datasets.append({'title': 'Net Profit/Loss', 'values': net_profit})
 
 	chart = {
 		"data": {
-			'x': 'x',
-			'columns': columns,
-			'colors': {
-				'Income': '#5E64FF',
-				'Expense': '#b8c2cc',
-				'Net Profit/Loss': '#ff5858'
-			}
+			'labels': labels,
+			'datasets': datasets
 		}
 	}
 
 	if not filters.accumulated_values:
-		chart["chart_type"] = "bar"
+		chart["type"] = "bar"
+	else:
+		chart["type"] = "line"
 
 	return chart
\ No newline at end of file
diff --git a/erpnext/crm/report/minutes_to_first_response_for_opportunity/minutes_to_first_response_for_opportunity.js b/erpnext/crm/report/minutes_to_first_response_for_opportunity/minutes_to_first_response_for_opportunity.js
index d9c4c8b..cdfdad1 100644
--- a/erpnext/crm/report/minutes_to_first_response_for_opportunity/minutes_to_first_response_for_opportunity.js
+++ b/erpnext/crm/report/minutes_to_first_response_for_opportunity/minutes_to_first_response_for_opportunity.js
@@ -21,23 +21,13 @@
 	get_chart_data: function (columns, result) {
 		return {
 			data: {
-				x: 'Date',
-				columns: [
-					['Date'].concat($.map(result, function (d) { return d[0]; })),
-					['Mins to first response'].concat($.map(result, function (d) { return d[1]; }))
-				]
-				// rows: [['Date', 'Mins to first response']].concat(result)
+				labels: result.map(d => d[0]),
+				datasets: [{
+					title: 'Mins to first response',
+					values: result.map(d => d[1])
+				}]
 			},
-			axis: {
-				x: {
-					type: 'timeseries',
-					tick: {
-						format: frappe.ui.py_date_format
-					}
-				}
-			},
-			chart_type: 'line',
-
+			type: 'line',
 		}
 	}
 }
diff --git a/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py b/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py
index 63e5f3c..93ea11c 100644
--- a/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py
+++ b/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py
@@ -29,26 +29,26 @@
 
 def get_log_data(filters):
 	fy = frappe.db.get_value('Fiscal Year', filters.get('fiscal_year'), ['year_start_date', 'year_end_date'], as_dict=True)
-	data = frappe.db.sql("""select 
+	data = frappe.db.sql("""select
 			vhcl.license_plate as "License", vhcl.make as "Make", vhcl.model as "Model",
-			vhcl.location as "Location", log.name as "Log", log.odometer as "Odometer", 
+			vhcl.location as "Location", log.name as "Log", log.odometer as "Odometer",
 			log.date as "Date", log.fuel_qty as "Fuel Qty", log.price as "Fuel Price"
-		from 
+		from
 			`tabVehicle` vhcl,`tabVehicle Log` log
-		where 
+		where
 			vhcl.license_plate = log.license_plate and log.docstatus = 1 and date between %s and %s
 		order by date""" ,(fy.year_start_date, fy.year_end_date), as_dict=1)
 	dl=list(data)
 	for row in dl:
 		row["Service Expense"]= get_service_expense(row["Log"])
 	return dl
-	
+
 def get_service_expense(logname):
-	expense_amount = frappe.db.sql("""select sum(expense_amount) 
-		from `tabVehicle Log` log,`tabVehicle Service` ser 
+	expense_amount = frappe.db.sql("""select sum(expense_amount)
+		from `tabVehicle Log` log,`tabVehicle Service` ser
 		where ser.parent=log.name and log.name=%s""",logname)
 	return flt(expense_amount[0][0]) if expense_amount else 0
-	
+
 def get_chart_data(data,period_list):
 	fuel_exp_data,service_exp_data,fueldata,servicedata = [],[],[],[]
 	service_exp_data = []
@@ -63,19 +63,25 @@
 		fueldata.append([period.key,total_fuel_exp])
 		servicedata.append([period.key,total_ser_exp])
 
-	x_intervals = ['x'] + [period.key for period in period_list]
+	labels = [period.key for period in period_list]
 	fuel_exp_data= [row[1] for row in fueldata]
 	service_exp_data= [row[1] for row in servicedata]
-	columns = [x_intervals]
+	datasets = []
 	if fuel_exp_data:
-		columns.append(["Fuel Expenses"]+ fuel_exp_data)
+		datasets.append({
+			'title': 'Fuel Expenses',
+			'values': fuel_exp_data
+		})
 	if service_exp_data:
-		columns.append(["Service Expenses"]+ service_exp_data)
+		datasets.append({
+			'title': 'Service Expenses',
+			'values': service_exp_data
+		})
 	chart = {
 		"data": {
-			'x': 'x',
-			'columns': columns
+			'labels': labels,
+			'datasets': datasets
 		}
 	}
-	chart["chart_type"] = "line"
+	chart["type"] = "line"
 	return chart
\ No newline at end of file
diff --git a/erpnext/manufacturing/page/production_analytics/production_analytics.js b/erpnext/manufacturing/page/production_analytics/production_analytics.js
index 1fb1ef2..39168b7 100644
--- a/erpnext/manufacturing/page/production_analytics/production_analytics.js
+++ b/erpnext/manufacturing/page/production_analytics/production_analytics.js
@@ -53,7 +53,7 @@
 
 		this.show_zero_check()
 		this.setup_chart_check();
-		
+
 	},
 	init_filter_values: function() {
 		this._super();
@@ -61,12 +61,13 @@
 	},
 	setup_chart: function() {
 		var me = this;
-		
+
 		var chart_data = this.get_chart_data ? this.get_chart_data() : null;
 
-		this.chart = new frappe.ui.Chart({
-			wrapper: this.chart_area,
-			data: chart_data
+		this.chart = new frappe.chart.FrappeChart({
+			parent: ".chart",
+			data: chart_data,
+			type: 'line'
 		});
 	},
 	set_default_values: function() {
@@ -95,7 +96,7 @@
 		var  pending = {name:"Pending", "id":"pending-pos",
 			checked:true};
 		var completed = {name:"Completed", "id":"completed-pos",
-			checked:true};	
+			checked:true};
 
 		$.each(frappe.report_dump.data["Production Order"], function(i, d) {
 			var dateobj = frappe.datetime.str_to_obj(d.creation);
@@ -109,10 +110,10 @@
 					var planned_start_date = frappe.datetime.user_to_obj(frappe.datetime.str_to_user(d.planned_start_date));
 					var aend_date = frappe.datetime.user_to_obj(frappe.datetime.str_to_user(d.actual_end_date));
 					var modified = frappe.datetime.user_to_obj(frappe.datetime.str_to_user(d.modified));
-					
+
 					if (dateobj <= start_period || dateobj <= end_period) {
 						all_open_orders[col.field] = flt(all_open_orders[col.field]) + 1;
-				
+
 						if(d.status=="Completed") {
 							if(aend_date < start_period || modified < start_period) {
 								completed[col.field] = flt(completed[col.field]) + 1;
@@ -140,7 +141,7 @@
 							}else{
 								not_started[col.field] = flt(not_started[col.field]) + 1;
 							}
-						}							
+						}
 					}
 				}
 			});
@@ -151,6 +152,6 @@
 			this.chart_area.toggle(false);
 		}
 		this.data = [all_open_orders, not_started, overdue, pending, completed];
-		
+
 	}
 });
diff --git a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py b/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py
index 2b407c7..9bdf621 100644
--- a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py
+++ b/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py
@@ -172,20 +172,19 @@
 
 def get_chart_data(grades, assessment_criteria_list, kounter):
 	grades = sorted(grades)
-	chart_data = []
-	chart_data.append(["x"] + assessment_criteria_list)
+	datasets = []
 	for grade in grades:
-		tmp = [grade]
+		tmp = []
 		for ac in assessment_criteria_list:
 			if grade in kounter[ac]:
 				tmp.append(kounter[ac][grade])
 			else:
 				tmp.append(0)
-		chart_data.append(tmp)
+		datasets.append(tmp)
 	return {
 		"data": {
-			"x": "x",
-			"columns": chart_data
+			"labels": assessment_criteria_list,
+			"datasets": datasets
 		},
-		"chart_type": 'bar',
+		"type": 'bar',
 	}
diff --git a/erpnext/support/report/minutes_to_first_response_for_issues/minutes_to_first_response_for_issues.js b/erpnext/support/report/minutes_to_first_response_for_issues/minutes_to_first_response_for_issues.js
index e84b13c..4cf07fa 100644
--- a/erpnext/support/report/minutes_to_first_response_for_issues/minutes_to_first_response_for_issues.js
+++ b/erpnext/support/report/minutes_to_first_response_for_issues/minutes_to_first_response_for_issues.js
@@ -18,23 +18,13 @@
 	get_chart_data: function(columns, result) {
 		return {
 			data: {
-				x: 'Date',
-				columns: [
-					['Date'].concat($.map(result, function(d) { return d[0]; })),
-					['Mins to first response'].concat($.map(result, function(d) { return d[1]; }))
-				]
-				// rows: [['Date', 'Mins to first response']].concat(result)
+				labels: result.map(d => d[0]),
+				datasets: [{
+					title: 'Mins to first response',
+					values: result.map(d => d[1])
+				}]
 			},
-			axis: {
-				x: {
-					type: 'timeseries',
-					tick: {
-						format: frappe.ui.py_date_format
-					}
-				}
-			},
-			chart_type: 'line',
-
+			type: 'line',
 		}
 	}
 }
diff --git a/erpnext/support/report/support_hour_distribution/support_hour_distribution.py b/erpnext/support/report/support_hour_distribution/support_hour_distribution.py
index e96b7b2..905ea6a 100644
--- a/erpnext/support/report/support_hour_distribution/support_hour_distribution.py
+++ b/erpnext/support/report/support_hour_distribution/support_hour_distribution.py
@@ -24,7 +24,7 @@
 
 	columns = get_columns()
 	data, timeslot_wise_count = get_data(filters)
-	chart = get_chartdata(timeslot_wise_count)
+	chart = get_chart_data(timeslot_wise_count)
 	return columns, data, None, chart
 
 def get_data(filters):
@@ -75,23 +75,21 @@
 
 	return columns
 
-def get_chartdata(timeslot_wise_count):
-	x_interval = ['x']
-	total_count = ['Total']
+def get_chart_data(timeslot_wise_count):
+	total_count = []
 	timeslots = ['12AM - 3AM', '3AM - 6AM', '6AM - 9AM',
 		'9AM - 12PM', '12PM - 3PM', '3PM - 6PM', '6PM - 9PM', '9PM - 12AM']
 
-	x_interval.extend(timeslots)
-	columns = [x_interval]
+	datasets = []
 	for data in timeslots:
 		total_count.append(timeslot_wise_count.get(data, 0))
-	columns.append(total_count)
+	datasets.append({'values': total_count})
 
 	chart = {
 		"data": {
-			'x': 'x',
-			'columns': columns
+			'labels': timeslots,
+			'datasets': datasets
 		}
 	}
-	chart["chart_type"] = "line"
+	chart["type"] = "line"
 	return chart