# frozen_string_literal: true # Copyright (c) 2008-2013 Michael Dvorkin and contributors. # # Fat Free CRM is freely distributable under the terms of MIT license. # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php #------------------------------------------------------------------------------ class ContactsController < EntitiesController before_action :get_accounts, only: %i[new create edit update] # GET /contacts #---------------------------------------------------------------------------- def index @contacts = get_contacts(page: page_param, per_page: per_page_param) respond_with @contacts do |format| format.xls { render layout: 'header' } format.csv { render csv: @contacts } end end # GET /contacts/1 # AJAX /contacts/1 #---------------------------------------------------------------------------- def show @stage = Setting.unroll(:opportunity_stage) @comment = Comment.new @timeline = timeline(@contact) respond_with(@contact) end # GET /contacts/new #---------------------------------------------------------------------------- def new @contact.attributes = { user: current_user, access: Setting.default_access, assigned_to: nil } @account = Account.new(user: current_user) if params[:related] model, id = params[:related].split('_') if related = model.classify.constantize.my(current_user).find_by_id(id) instance_variable_set("@#{model}", related) else respond_to_related_not_found(model) && return end end respond_with(@contact) end # GET /contacts/1/edit AJAX #---------------------------------------------------------------------------- def edit @account = @contact.account || Account.new(user: current_user) @previous = Contact.my(current_user).find_by_id(detect_previous_id) || detect_previous_id if detect_previous_id respond_with(@contact) end # POST /contacts #---------------------------------------------------------------------------- def create @comment_body = params[:comment_body] respond_with(@contact) do |_format| if @contact.save_with_account_and_permissions(params.permit!) @contact.add_comment_by_user(@comment_body, current_user) @contacts = get_contacts if called_from_index_page? else @account = guess_related_account(params[:account][:id], request.referer, current_user) if params[:account] @opportunity = Opportunity.my(current_user).find(params[:opportunity]) unless params[:opportunity].blank? end end end # PUT /contacts/1 #---------------------------------------------------------------------------- def update respond_with(@contact) do |_format| @account = @contact.account || Account.new(user: current_user) unless @contact.update_with_account_and_permissions(params.permit!) end end # DELETE /contacts/1 #---------------------------------------------------------------------------- def destroy @contact.destroy respond_with(@contact) do |format| format.html { respond_to_destroy(:html) } format.js { respond_to_destroy(:ajax) } end end # PUT /contacts/1/attach #---------------------------------------------------------------------------- # Handled by EntitiesController :attach # POST /contacts/1/discard #---------------------------------------------------------------------------- # Handled by EntitiesController :discard # POST /contacts/auto_complete/query AJAX #---------------------------------------------------------------------------- # Handled by ApplicationController :auto_complete # GET /contacts/redraw AJAX #---------------------------------------------------------------------------- def redraw current_user.pref[:contacts_per_page] = per_page_param if per_page_param # Sorting and naming only: set the same option for Leads if the hasn't been set yet. if params[:sort_by] current_user.pref[:contacts_sort_by] = Contact.sort_by_map[params[:sort_by]] current_user.pref[:leads_sort_by] ||= Lead.sort_by_map[params[:sort_by]] if Lead.sort_by_fields.include?(params[:sort_by]) end if params[:naming] current_user.pref[:contacts_naming] = params[:naming] current_user.pref[:leads_naming] ||= params[:naming] end @contacts = get_contacts(page: 1, per_page: per_page_param) # Start on the first page. set_options # Refresh options respond_with(@contacts) do |format| format.js { render :index } end end private #---------------------------------------------------------------------------- alias get_contacts get_list_of_records #---------------------------------------------------------------------------- def list_includes %i[account tags].freeze end #---------------------------------------------------------------------------- def get_accounts @accounts = Account.my(current_user).order('name') end def set_options super @naming = (current_user.pref[:contacts_naming] || Contact.first_name_position) unless params[:cancel].true? end #---------------------------------------------------------------------------- def respond_to_destroy(method) if method == :ajax if called_from_index_page? @contacts = get_contacts if @contacts.blank? @contacts = get_contacts(page: current_page - 1) if current_page > 1 render(:index) && return end else self.current_page = 1 end # At this point render destroy.js else self.current_page = 1 flash[:notice] = t(:msg_asset_deleted, @contact.full_name) redirect_to contacts_path end end ActiveSupport.run_load_hooks(:fat_free_crm_contacts_controller, self) end