class ReportsController < ApplicationController before_action :set_report, only: %i[show edit update destroy work] # GET /reports def index @reports = Report.all end # GET /reports/1 def show respond_to do |format| format.html format.pdf format.xlsx do response.headers['Content-Disposition'] = %(attachment; filename="#{filename(@report, extension: 'xlsx')}") render end format.xml do response.headers['Content-Disposition'] = %(attachment; filename="#{filename(@report, extension: 'html')}") render formats: [:odt], layout: false end format.rtf do html = render_to_string(template: 'reports/show', formats: [:odt], layout: false) rtf = "{\\rtf1\n#{PandocRuby.html(html).to_rtf}}" send_data rtf, filename: filename(@report, extension: 'rtf') end format.odt do html = render_to_string(layout: false) odt = PandocRuby.html(html).to_odt send_data odt, filename: filename(@report, extension: 'odt') end format.docx do template = Sablon.template(Rails.root.join('lib/templates/docx/report.docx')) context = { person: OpenStruct.new(first_name: @report.name), skills: [], education: [], career: [], referees: [] } template.render_to_file(Rails.root.join('tmp/output.docx'), context) send_file Rails.root.join('tmp/output.docx'), filename: filename(@report, extension: 'docx'), type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' end end end # GET /reports/new def new @report = Report.new end # GET /reports/1/edit def edit end # POST /reports def create @report = Report.new(report_params) if @report.save redirect_to @report, notice: 'Report was successfully created.' else render :new, status: :unprocessable_entity end end # PATCH/PUT /reports/1 def update if @report.update(report_params) redirect_to @report, notice: 'Report was successfully updated.', status: :see_other else render :edit, status: :unprocessable_entity end end # DELETE /reports/1 def destroy @report.destroy! redirect_to reports_url, notice: 'Report was successfully destroyed.', status: :see_other end def work @report end private # Use callbacks to share common setup or constraints between actions. def set_report @report = Report.find(params[:id]) end # Only allow a list of trusted parameters through. def report_params params.require(:report).permit(:name, :comment_html) end def filename(report, extension: 'html') "#{report.name}-#{Time.current.strftime('%Y%m%d%H%M')}.#{extension}" end end