From 89a9647c2504d6339735c120306c802f6d185b31 Mon Sep 17 00:00:00 2001 From: Nicolas Bally Date: Thu, 20 Oct 2016 18:24:38 +0200 Subject: [PATCH] suite contacts --- app/assets/javascripts/admin.coffee | 2 + .../javascripts/note_files/note_files.js | 15 ++- .../admin/contact_files_controller.rb | 60 +++++++++ app/controllers/admin/contacts_controller.rb | 50 ++++++- app/models/contact.rb | 2 + app/models/contact_file.rb | 16 +++ app/uploaders/contact_file_uploader.rb | 59 ++++++++ .../contact_actions/_contact_action.html.haml | 4 +- .../contact_files/_contact_file.html.haml | 18 +++ app/views/admin/contact_files/create.js.erb | 4 + app/views/admin/contacts/destroy.js.erb | 2 +- app/views/admin/contacts/show.html.haml | 127 +++++++++++++++++- config/routes.rb | 8 +- .../20161007154739_create_contact_files.rb | 14 ++ ...161020160659_add_infos_sups_to_contacts.rb | 6 + db/schema.rb | 18 ++- public/provenance/2.png | Bin 0 -> 25683 bytes test/fixtures/contact_files.yml | 15 +++ test/models/contact_file_test.rb | 7 + 19 files changed, 412 insertions(+), 15 deletions(-) create mode 100644 app/controllers/admin/contact_files_controller.rb create mode 100644 app/models/contact_file.rb create mode 100644 app/uploaders/contact_file_uploader.rb create mode 100644 app/views/admin/contact_files/_contact_file.html.haml create mode 100644 app/views/admin/contact_files/create.js.erb create mode 100644 db/migrate/20161007154739_create_contact_files.rb create mode 100644 db/migrate/20161020160659_add_infos_sups_to_contacts.rb create mode 100644 public/provenance/2.png create mode 100644 test/fixtures/contact_files.yml create mode 100644 test/models/contact_file_test.rb diff --git a/app/assets/javascripts/admin.coffee b/app/assets/javascripts/admin.coffee index de53fc0..ced06d9 100644 --- a/app/assets/javascripts/admin.coffee +++ b/app/assets/javascripts/admin.coffee @@ -17,6 +17,8 @@ #= require vendor/jquery.fileupload-process #= require vendor/select2.min +#= require note_files/note_files + #= require manager #= require image_files diff --git a/app/assets/javascripts/note_files/note_files.js b/app/assets/javascripts/note_files/note_files.js index f4113fd..85ad701 100644 --- a/app/assets/javascripts/note_files/note_files.js +++ b/app/assets/javascripts/note_files/note_files.js @@ -1,8 +1,9 @@ -function init_note_upload_fields(note_id){ - drop = $('#note_'+note_id+' .fileupload').closest(".bottom") +function init_contact_upload_fields(contact_id){ + alert("t"); + drop = $('#contact_'+contact_id+' .fileupload').closest(".bottom") - $('#note_'+note_id+' .fileupload').fileupload({ + $('#contact_'+contact_id+' .fileupload').fileupload({ url: $(this).attr("action"), dropZone: drop, autoUpload: true, @@ -20,17 +21,17 @@ function init_note_upload_fields(note_id){ drop: function (e, data) { - $('#note_'+note_id+' .fileupload').closest(".bottom").css("background", "rgb(255, 255, 204)"); + $('#contact_'+contact_id+' .fileupload').closest(".bottom").css("background", "rgb(255, 255, 204)"); } }); - $(".note .bottom").bind('dragover', function (e) { + $(".contact .bottom").bind('dragover', function (e) { $(this).css("background", "#B7DF63"); }); - $(".note .bottom").bind('dragleave', function (e) { + $(".contact .bottom").bind('dragleave', function (e) { $(this).css("background", "rgb(255, 255, 204)"); }); @@ -44,7 +45,7 @@ function init_note_upload_fields(note_id){ $(document).ready(function () { - $("body").on("click", ".note .add_files",function(){ + $("body").on("click", ".contact .add_files",function(){ $(this).next('input').click(); return false; diff --git a/app/controllers/admin/contact_files_controller.rb b/app/controllers/admin/contact_files_controller.rb new file mode 100644 index 0000000..56ab5ca --- /dev/null +++ b/app/controllers/admin/contact_files_controller.rb @@ -0,0 +1,60 @@ +# -*- encoding : utf-8 -*- + class Admin::ContactFilesController < ApplicationController + before_filter :auth_admin + + + layout "admin" + + def index + params[:file_folder_id] = params[:file_folder_id] || 1 + + @file_folder = FileFolder.find(params[:file_folder_id]) + @file_folders = FileFolder.all(:order => :name) + @contact_files = DataFile.all(:order => "created_at DESC", :conditions => {:file_folder_id => @file_folder.id}) + @contact_file = DataFile.new(:file_folder_id => @file_folder.id) + if request.xhr? + render :layout => false + end + end + + def new + end + + def edit + end + + def create + @contact_file_create = true + @contact_file = ContactFile.new(:name => params[:files].original_filename, :contact_id => params[:contact_id], :file =>params[:files]) + + if @contact_file.save + + else + + end + + + end + + def update + @contact_file = DataFile.find(params[:id]) + if @contact_file.update_attributes(params.require(:contact_file).permit!) + + else + + end + end + + def destroy + @contact_file = DataFile.find(params[:id]) + @contact_file.destroy + + flash[:notice] = "Le fichier à bien été supprimée." + end + + def show + @contact_file = DataFile.find(params[:id]) + + end + +end diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index d1602ae..7bd3044 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -1,8 +1,8 @@ class Admin::ContactsController < ApplicationController layout "admin" - before_filter :auth_admin - + before_filter :auth_admin, :except => :api + skip_before_filter :verify_authenticity_token, :only => :api def index @contacts = Contact.order("created_at DESC") @@ -69,6 +69,52 @@ class Admin::ContactsController < ApplicationController end + + def api + + contact_api_params = { + :name => params[:name], + + :address => params[:address], + + :address2 => params[:address2], + + :cp => params[:cp], + + :city => params[:city], + + :tel => params[:tel], + + :email => params[:mail], + + :place => params[:place], + + :sheet_type => params[:type], + + :owner => params[:owner], + + :message => params[:message] + + } + + @contact = Contact.new(contact_api_params) + @contact.provenance_id = 2 + if @contact.save(:validate => false) + render :inline => "ok" + puts "OK" + else + render :inline => "erreur" + puts "ERREUR" + @contact.errors.each do |error| + puts error + end + end + + + end + + + private def contact_params params.require(:contact).permit! diff --git a/app/models/contact.rb b/app/models/contact.rb index 08b528e..19c7162 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -6,5 +6,7 @@ class Contact < ActiveRecord::Base validates :email, :presence => true, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i validates :message, :presence => true validates :tel, :presence => true + + has_many :contact_files end diff --git a/app/models/contact_file.rb b/app/models/contact_file.rb new file mode 100644 index 0000000..87f5b4b --- /dev/null +++ b/app/models/contact_file.rb @@ -0,0 +1,16 @@ +class ContactFile < ActiveRecord::Base + mount_uploader :file, ContactFileUploader + + belongs_to :admin + belongs_to :contact + + def file_type + + + mime = `file --mime -br "#{self.file.path}"`.strip.split(';')[0] + mime + + end + + +end diff --git a/app/uploaders/contact_file_uploader.rb b/app/uploaders/contact_file_uploader.rb new file mode 100644 index 0000000..b7c2ed8 --- /dev/null +++ b/app/uploaders/contact_file_uploader.rb @@ -0,0 +1,59 @@ +# -*- encoding : utf-8 -*- + +class ContactFileUploader < CarrierWave::Uploader::Base + + # Include RMagick or ImageScience support: + # include CarrierWave::RMagick + # include CarrierWave::ImageScience + + # Choose what kind of storage to use for this uploader: + storage :file + # storage :s3 + + # Override the directory where uploaded files will be stored. + # This is a sensible default for uploaders that are meant to be mounted: + def store_dir + "#{Rails.root}/private_medias/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + end + + def url + "/download_data_files/#{model.token}" + + end + + # Provide a default URL as a default if there hasn't been a file uploaded: + def default_url + "/images/fallback/" + [version_name, "default.png"].compact.join('_') + + end + + # Process files as they are uploaded: + # process :scale => [200, 300] + # + # def scale(width, height) + # # do something + # end + + # Create different versions of your uploaded files: + # version :thumb do + # process :scale => [50, 50] + # end + + # Add a white list of extensions which are allowed to be uploaded. + # For images you might use something like this: + # def extension_white_list + # %w(jpg jpeg gif png) + # end + + # Override the filename of the uploaded files: + # def filename + # "something.jpg" if original_filename + # end + + def filename + File.basename(original_filename, File.extname(original_filename)).to_s.to_slug + File.extname(original_filename).to_s if original_filename + + + end + +end diff --git a/app/views/admin/contact_actions/_contact_action.html.haml b/app/views/admin/contact_actions/_contact_action.html.haml index 801d5be..89c84a8 100644 --- a/app/views/admin/contact_actions/_contact_action.html.haml +++ b/app/views/admin/contact_actions/_contact_action.html.haml @@ -1,7 +1,7 @@ -.contact_action#contact_action{:id => contact_action.id, :style => "border-color:#{contact_action.admin.color};"} +.contact_action#contact_action{:id => contact_action.id, :style => ("border-color:#{contact_action.admin.color};" if contact_action.admin)} %p.name - -if contact_action.contact.admin + -if contact_action.admin %span{:style => "background:#{contact_action.admin.color};padding:5px 10px;color:white"} =contact_action.admin.username %p diff --git a/app/views/admin/contact_files/_contact_file.html.haml b/app/views/admin/contact_files/_contact_file.html.haml new file mode 100644 index 0000000..b07c5de --- /dev/null +++ b/app/views/admin/contact_files/_contact_file.html.haml @@ -0,0 +1,18 @@ +- if contact_file.file? + + + %tr#contact_file.contact_file{:id => contact_file.id, :class => ("new" if @contact_file_create)} + + %td{:style => "width:32px;text-align:center;"} + -ext = File.extname(contact_file.file.path)[1..-1] + =image_tag "file_types/"+ext+".png", :style => "height:30px;" + %td + =contact_file.name + %td{:style => "width:300px;"} + + + =contact_file.file_type + %td{:style => "width:100px;"} + = link_to i(:"trash-o"), admin_contact_file_path(:id => contact_file.id, :manager => params[:manager], :multiple => params[:multiple]), :data => {:confirm => 'Voulez-vous vraiment supprimer cette pièce jointe ?'}, :method => :delete, :remote => true + =link_to i(:"download"), contact_file.file.url + diff --git a/app/views/admin/contact_files/create.js.erb b/app/views/admin/contact_files/create.js.erb new file mode 100644 index 0000000..98d8326 --- /dev/null +++ b/app/views/admin/contact_files/create.js.erb @@ -0,0 +1,4 @@ +$("#contact_files").prepend("<%= escape_javascript(render(@contact_file)) %>"); +$('#contact_file_<%=@contact_file.id %>').addClass('active'); + +<%= flash_js %> diff --git a/app/views/admin/contacts/destroy.js.erb b/app/views/admin/contacts/destroy.js.erb index f6f6315..bb6b32a 100644 --- a/app/views/admin/contacts/destroy.js.erb +++ b/app/views/admin/contacts/destroy.js.erb @@ -1 +1 @@ -$('#admin_row_<%= @admin.id %>').remove(); \ No newline at end of file +$('#contact_<%= @contact.id %>').remove(); \ No newline at end of file diff --git a/app/views/admin/contacts/show.html.haml b/app/views/admin/contacts/show.html.haml index c332ad9..abda07d 100644 --- a/app/views/admin/contacts/show.html.haml +++ b/app/views/admin/contacts/show.html.haml @@ -7,9 +7,134 @@ -= link_to 'Ajouter une action', new_admin_contact_action_path(:contact_id => @contact.id, :test => "test"), :class => "btn btn-success", :style => "float:right;", :remote => true +%h2 Fichiers + + +%form#fileupload{:action => admin_contact_files_path(:contact_id => @contact.id ),:method=>"POST", :enctype=>"multipart/form-data", :style => "display:inline;"} + %input{:name => "redirect", :type => "hidden", :value => "/"}/ + + + + .fileupload-progress.fade{:style => "float:left;"} + #upload_details{:style => ""} + .content + .fileupload-buttonbar + %button.btn.btn-warning.cancel{:type => "reset"} + %i.icon-ban-circle.icon-white + %span Cancel upload + %span.fileupload-loading + + %table.table.table-striped{:role => "presentation"} + %tbody.ulpoad_files + + + + .progress-extended{:style => "float:left;padding: 10px;font-size:14px;line-height:20px;"} + + + .progress.progress-success.progress-striped.active{"aria-valuemax" => "100", "aria-valuemin" => "0", :role => "progressbar",:style => "width:200px;float:left;margin: 10px;height:20px;"} + .bar{:style => "width:0%;"} + + + + + + + + + .right + %a.btn.btn-primary{:href => "#", :onclick => "$(this).next('input').click();"} + %span.fileinput-button{} + %i.icon-plus.icon-white + %span Ajouter des fichiers + %input{:multiple => "", :name => "files[]", :type => "file", :style => "display:none;"} + %br + %br + + + + + + + + + :plain + + + + + + + + +:coffeescript + $('#fileupload').fileupload({ + paramName:"files", + dataType:"script", + autoUpload:true, + filesContainer:".ulpoad_files" + + }).bind('fileuploadadded',(e, data)-> + $("#upload_details").show(); + ).bind('fileuploadfinished',(e, data)-> + $("#upload_details").hide(); + ) + + +.clear +%br +%br +%table#contact_files.table.table-stripped{:style => "width:100%;"} + =render @contact.contact_files +%br +%br + + + += link_to 'Ajouter une action', new_admin_contact_action_path(:contact_id => @contact.id, :test => "test"), :class => "btn btn-success", :style => "float:right;", :remote => true + %h2 Interactions diff --git a/config/routes.rb b/config/routes.rb index 06345ef..a78c608 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -90,7 +90,13 @@ CMSnb::Application.routes.draw do end namespace :admin do - resources :contacts + + resources :contact_files + resources :contacts do + collection do + post :api + end + end resources :contact_actions resources :student_groups resources :note_files diff --git a/db/migrate/20161007154739_create_contact_files.rb b/db/migrate/20161007154739_create_contact_files.rb new file mode 100644 index 0000000..384be43 --- /dev/null +++ b/db/migrate/20161007154739_create_contact_files.rb @@ -0,0 +1,14 @@ +class CreateContactFiles < ActiveRecord::Migration + def change + create_table :contact_files do |t| + t.references :admin, index: true + t.references :contact, index: true + t.string :name + t.text :description + t.string :file + t.string :token + + t.timestamps + end + end +end diff --git a/db/migrate/20161020160659_add_infos_sups_to_contacts.rb b/db/migrate/20161020160659_add_infos_sups_to_contacts.rb new file mode 100644 index 0000000..007d3d3 --- /dev/null +++ b/db/migrate/20161020160659_add_infos_sups_to_contacts.rb @@ -0,0 +1,6 @@ +class AddInfosSupsToContacts < ActiveRecord::Migration + def change + add_column :contacts, :sheet_type, :string + add_column :contacts, :owner, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 998899b..70d6c25 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161007085559) do +ActiveRecord::Schema.define(version: 20161020160659) do create_table "admins", force: true do |t| t.string "name" @@ -167,6 +167,20 @@ ActiveRecord::Schema.define(version: 20161007085559) do add_index "contact_actions", ["contact_id"], name: "index_contact_actions_on_contact_id", using: :btree + create_table "contact_files", force: true do |t| + t.integer "admin_id" + t.integer "contact_id" + t.string "name" + t.text "description" + t.string "file" + t.string "token" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "contact_files", ["admin_id"], name: "index_contact_files_on_admin_id", using: :btree + add_index "contact_files", ["contact_id"], name: "index_contact_files_on_contact_id", using: :btree + create_table "contacts", force: true do |t| t.string "name" t.string "email" @@ -187,6 +201,8 @@ ActiveRecord::Schema.define(version: 20161007085559) do t.integer "admin_id" t.boolean "archived", default: false t.integer "provenance_id", default: 1 + t.string "sheet_type" + t.string "owner" end create_table "content_types", force: true do |t| diff --git a/public/provenance/2.png b/public/provenance/2.png new file mode 100644 index 0000000000000000000000000000000000000000..e49fb00d45242393be09fa84c1f6f876ca168ca5 GIT binary patch literal 25683 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/contact_files.yml b/test/fixtures/contact_files.yml new file mode 100644 index 0000000..3fe1894 --- /dev/null +++ b/test/fixtures/contact_files.yml @@ -0,0 +1,15 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + admin_id: + contact_id: + name: MyString + description: MyText + file: MyString + +two: + admin_id: + contact_id: + name: MyString + description: MyText + file: MyString diff --git a/test/models/contact_file_test.rb b/test/models/contact_file_test.rb new file mode 100644 index 0000000..271d18b --- /dev/null +++ b/test/models/contact_file_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ContactFileTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end