Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

85 linhas
2.2KB

  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. let labelsName = Object.keys(x.data)[0]
  26. x.data = prepareChartData(x.data)
  27. chart = new frappe.Chart(el, x)
  28. if (HTMLWidgets.shinyMode && x.isNavigable) {
  29. el.addEventListener('data-select', function(ev) {
  30. let {index, values} = ev
  31. let chart = el.widget.chart()
  32. let label = chart.data.labels[index]
  33. let names = chart.data.datasets.map(d => d.name)
  34. let data = values.reduce(function(acc, v, idx) {
  35. acc[names[idx]] = v
  36. return acc
  37. }, {})
  38. data[labelsName] = label
  39. Shiny.setInputValue(el.id + '_selected:frappeCharts-selected', data)
  40. })
  41. }
  42. },
  43. resize: function(width, height) {
  44. // TODO: code to re-render the widget with a new size
  45. },
  46. update: function(data) {
  47. if (!chart) {
  48. console.error("The chart has not yet been initialized.")
  49. }
  50. let chartData = prepareChartData(data)
  51. chart.update(chartData)
  52. },
  53. chart: () => chart
  54. };
  55. }
  56. });
  57. if (HTMLWidgets.shinyMode) {
  58. Shiny.addCustomMessageHandler('frappeCharts:update', function({id, data}) {
  59. let el = document.getElementById(id)
  60. if (el.widget) {
  61. el.widget.update(data)
  62. }
  63. })
  64. }