moduleCmAdminclassResourceController<ApplicationControllerincludePundit::AuthorizationincludePagy::BackendhelperCmAdmin::ViewHelpersdefcm_index(params)@current_action=CmAdmin::Models::Action.find_by(@model,name: 'index')# Based on the params the filter and pagination object to be set@ar_object=filter_by(params,nil,@model.filter_params(params))# resource_identifierrespond_todo|format|ifrequest.xhr?format.html{renderpartial: '/cm_admin/main/table'}elseformat.html{render'/cm_admin/main/'+action_name}endendenddefcm_show(params)@current_action=CmAdmin::Models::Action.find_by(@model,name: 'show')scoped_model="CmAdmin::#{@model.name}Policy::Scope".constantize.new(Current.user,@model.name.constantize).resolve@ar_object=scoped_model.find(params[:id])resource_identifierrespond_todo|format|format.html{render'/cm_admin/main/'+action_name}endenddefcm_new(params)@current_action=CmAdmin::Models::Action.find_by(@model,name: 'new')@ar_object=@model.ar_model.newresource_identifierrespond_todo|format|format.html{render'/cm_admin/main/'+action_name}endenddefcm_edit(params)@current_action=CmAdmin::Models::Action.find_by(@model,name: 'edit')@ar_object=@model.ar_model.name.classify.constantize.find(params[:id])resource_identifierrespond_todo|format|format.html{render'/cm_admin/main/'+action_name}endenddefcm_update(params)@ar_object=@model.ar_model.name.classify.constantize.find(params[:id])@ar_object.assign_attributes(resource_params(params))resource_identifierresource_responderenddefcm_create(params)@ar_object=@model.ar_model.name.classify.constantize.new(resource_params(params))resource_identifierresource_responderenddefcm_destroy(params)@ar_object=@model.ar_model.name.classify.constantize.find(params[:id])redirect_url=request.referrer||cm_admin.send("#{@model.name.underscore}_index_path")respond_todo|format|if@ar_object.destroyformat.html{redirect_backfallback_location: redirect_url,notice: "#{action_name.titleize}#{@ar_object.class.name.downcase} is successful"}elseformat.html{redirect_backfallback_location: redirect_url,notice: "#{action_name.titleize}#{@ar_object.class.name.downcase} is unsuccessful"}endendenddefimport@model=Model.find_by({name: controller_name.titleize})allowed_params=params.permit(file_import: [:associated_model_name,:import_file]).to_hfile_import=::FileImport.new(allowed_params[:file_import])file_import.added_by=Current.userrespond_todo|format|iffile_import.save!format.html{redirect_backfallback_location: cm_admin.send("#{@model.name.underscore}_index_path"),notice: "Your import is successfully queued."}endendenddefimport_form@model=Model.find_by({name: controller_name.titleize})respond_todo|format|format.html{render'/cm_admin/main/import_form'}endenddefcm_custom_method(params)scoped_model="CmAdmin::#{@model.name}Policy::Scope".constantize.new(Current.user,@model.name.constantize).resolveresource_identifierrespond_todo|format|if@action.action_type==:customif@action.child_recordsifrequest.xhr?format.html{renderpartial: '/cm_admin/main/associated_table'}elseformat.html{render@action.layout}endelsif@action.display_type==:pagedata=@action.parent=="index"?@ar_object.data:@ar_objectformat.html{render@action.partial}elsear_object=@action.code_block.call(@ar_object)ifar_object.errors.empty?redirect_url=@model.current_action.redirection_url||@action.redirection_url||request.referrer||"/cm_admin/#{@model.ar_model.table_name}/#{@ar_object.id}"format.html{redirect_toredirect_url,notice: "#{@action.name.titleize} is successful"}elseerror_messages=ar_object.errors.full_messages.map{|error_message|"<li>#{error_message}</li>"}.joinformat.html{redirect_torequest.referrer,alert: "<b>#{@action.name.titleize} is unsuccessful</b><br /><ul>#{error_messages}</ul>"}endendendendenddefresource_identifier@ar_object,@associated_model,@associated_ar_object=custom_controller_action(action_name,params.permit!)if!@ar_object.present?&¶ms[:id].present?authorizecontroller_name.classify.constantize,policy_class: "CmAdmin::#{controller_name.classify}Policy".constantizeifdefined?"CmAdmin::#{controller_name.classify}Policy".constantizeaar_model=request.url.split('/')[-2].classify.constantizeifparams[:aar_id]@associated_ar_object=aar_model.find(params[:aar_id])ifparams[:aar_id]nested_tables=@model.available_fields[:new].except(:fields).keysnested_tables+=@model.available_fields[:edit].except(:fields).keys@reflections=@model.ar_model.reflect_on_all_associationsnested_tables.eachdo|table_name|reflection=@reflections.select{|x|xifx.name==table_name}.firstifreflection.macro==:has_many@ar_object.send(table_name).buildifaction_name=="new"||action_name=="edit"elsifaction_name=="new"@ar_object.send(('build_'+table_name.to_s).to_sym)endendenddefresource_responderrespond_todo|format|ifparams["referrer"]redirect_url=params["referrer"]elseredirect_url=CmAdmin::Engine.mount_path+"/#{@model.name.underscore.pluralize}/#{@ar_object.id}"endif@ar_object.saveformat.html{redirect_toredirect_url,notice: "#{action_name.titleize}#{@ar_object.class.name.downcase} is successful"}elseformat.html{render'/cm_admin/main/new',notice: "#{action_name.titleize}#{@ar_object.class.name.downcase} is unsuccessful"}endendenddefcustom_controller_action(action_name,params)@current_action=CmAdmin::Models::Action.find_by(@model,name: action_name.to_s)returnunless@current_action@ar_object=@model.ar_model.name.classify.constantize.find(params[:id])return@ar_objectunless@current_action.child_recordschild_records=@ar_object.send(@current_action.child_records)@reflection=@model.ar_model.reflect_on_association(@current_action.child_records)@associated_model=if@reflection.klass.column_names.include?('type')CmAdmin::Model.find_by(name: @reflection.plural_name.classify)elseCmAdmin::Model.find_by(name: @reflection.klass.name)end@associated_ar_object=ifchild_records.is_a?ActiveRecord::Relationfilter_by(params,child_records,@associated_model.filter_params(params))elsechild_recordsendreturn@ar_object,@associated_model,@associated_ar_objectenddeffilter_by(params,records,filter_params={},sort_params={})filtered_result=OpenStruct.newsort_column="created_at"sort_direction=%w[asc desc].include?(sort_params[:sort_direction])?sort_params[:sort_direction]:"asc"sort_params={sort_column: sort_column,sort_direction: sort_direction}records="CmAdmin::#{@model.name}Policy::Scope".constantize.new(Current.user,@model.name.constantize).resolveifrecords.nil?records=records.order("#{@current_action.sort_column}#{@current_action.sort_direction}")final_data=CmAdmin::Models::Filter.filtered_data(filter_params,records,@associated_model?@associated_model.filters:@model.filters)pagy,records=pagy(final_data)filtered_result.data=recordsfiltered_result.pagy=pagy# filtered_result.facets = paginate(page, raw_data.size)# filtered_result.sort = sort_params# filtered_result.facets.sort = sort_paramsreturnfiltered_resultenddefresource_params(params)permittable_fields=@permitted_fields||@model.ar_model.columns.map(&:name).reject{|i|CmAdmin::REJECTABLE_FIELDS.include?(i)}.map(&:to_sym)permittable_fields+=@model.ar_model.name.constantize.reflect_on_all_associations.map{|x|nextifx.options[:polymorphic]ifx.class.name.include?('HasOne')x.name.to_s.gsub('_attachment','').gsub('rich_text_','').to_symelsifx.class.name.include?('HasMany')Hash[x.name.to_s.gsub('_attachment',''),[]]end}.compactnested_tables=@model.available_fields[:new].except(:fields).keysnested_tables+=@model.available_fields[:edit].except(:fields).keysnested_fields=nested_tables.uniq.map{|table|Hash[table.to_s+'_attributes',table.to_s.classify.constantize.columns.map(&:name).reject{|i|CmAdmin::REJECTABLE_FIELDS.include?(i)}.map(&:to_sym)+[:id,:_destroy]]}permittable_fields+=nested_fields@model.ar_model.columns.map{|col|permittable_fields<<col.name.split('_cents')ifcol.name.include?('_cents')}params.require(@model.name.underscore.to_sym).permit(*permittable_fields)endendend