You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
1.8KB

  1. HTMLWidgets.widget({
  2. name: 'frappeChart',
  3. type: 'output',
  4. factory: function(el, width, height) {
  5. // TODO: define shared variables for this instance
  6. // we'll create chart in renderValue but want to access it elsewhere
  7. let chart = null
  8. // helper function to prep the data
  9. const prepareChartData = function(data) {
  10. const chartData = {labels: [], datasets: []}
  11. // Get keys of data, assume that first entry is for labels, the rest are data
  12. let labelColumn = Object.keys(data)[0]
  13. let columns = Object.keys(data).slice(1)
  14. // First column in x.data is the labels
  15. chartData.labels = data[labelColumn]
  16. // Create an appropriate object for each column, reformat data and add to chartData
  17. columns.forEach(function(col) {
  18. chartData.datasets.push({name: col, values: data[col]})
  19. })
  20. return chartData
  21. }
  22. return {
  23. renderValue: function(x) {
  24. el.widget = this
  25. x.data = prepareChartData(x.data)
  26. chart = new frappe.Chart(el, x)
  27. if (HTMLWidgets.shinyMode && x.isNavigable) {
  28. el.addEventListener('data-select', function(ev) {
  29. let {index, values} = ev
  30. Shiny.setInputValue(el.id + '_selected', {index, values})
  31. })
  32. }
  33. },
  34. resize: function(width, height) {
  35. // TODO: code to re-render the widget with a new size
  36. },
  37. update: function(data) {
  38. if (!chart) {
  39. console.error("The chart has not yet been initialized.")
  40. }
  41. let chartData = prepareChartData(data)
  42. chart.update(chartData)
  43. },
  44. chart: () => chart
  45. };
  46. }
  47. });
  48. if (HTMLWidgets.shinyMode) {
  49. Shiny.addCustomMessageHandler('frappeCharts:update', function({id, data}) {
  50. let el = document.getElementById(id)
  51. if (el.widget) {
  52. el.widget.update(data)
  53. }
  54. })
  55. }