dashboards_controller.rb 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. module Blazer
  2. class DashboardsController < BaseController
  3. before_action :set_dashboard, only: [:show, :edit, :update, :destroy]
  4. def index
  5. @dashboards = Blazer::Dashboard.order(:name)
  6. end
  7. def new
  8. @dashboard = Blazer::Dashboard.new
  9. end
  10. def create
  11. @dashboard = Blazer::Dashboard.new
  12. if update_dashboard(@dashboard)
  13. redirect_to dashboard_path(@dashboard)
  14. else
  15. render :new
  16. end
  17. end
  18. def show
  19. @queries = @dashboard.dashboard_queries.order(:position).preload(:query).map(&:query)
  20. @queries.each do |query|
  21. process_vars(query.statement)
  22. end
  23. @bind_vars ||= []
  24. @smart_vars = {}
  25. @sql_errors = []
  26. data_sources = @queries.map { |q| Blazer.data_sources[q.data_source] }.uniq
  27. @bind_vars.each do |var|
  28. data_sources.each do |data_source|
  29. query = data_source.smart_variables[var]
  30. if query
  31. rows, error, cached_at = data_source.run_statement(query)
  32. ((@smart_vars[var] ||= []).concat(rows.map { |v| v.values.reverse })).uniq!
  33. @sql_errors << error if error
  34. end
  35. end
  36. end
  37. end
  38. def edit
  39. end
  40. def update
  41. if update_dashboard(@dashboard)
  42. redirect_to dashboard_path(@dashboard, variable_params)
  43. else
  44. render :edit
  45. end
  46. end
  47. def destroy
  48. @dashboard.destroy
  49. redirect_to dashboards_path
  50. end
  51. protected
  52. def dashboard_params
  53. params.require(:dashboard).permit(:name)
  54. end
  55. def set_dashboard
  56. @dashboard = Blazer::Dashboard.find(params[:id])
  57. end
  58. def update_dashboard(dashboard)
  59. dashboard.assign_attributes(dashboard_params)
  60. Blazer::Dashboard.transaction do
  61. if params[:query_ids].is_a?(Array)
  62. query_ids = params[:query_ids].map(&:to_i)
  63. @queries = Blazer::Query.find(query_ids).sort_by { |q| query_ids.index(q.id) }
  64. end
  65. if dashboard.save
  66. if @queries
  67. @queries.each_with_index do |query, i|
  68. dashboard_query = dashboard.dashboard_queries.where(query_id: query.id).first_or_initialize
  69. dashboard_query.position = i
  70. dashboard_query.save!
  71. end
  72. if dashboard.persisted?
  73. dashboard.dashboard_queries.where.not(query_id: query_ids).destroy_all
  74. end
  75. end
  76. true
  77. end
  78. end
  79. end
  80. end
  81. end