From 93633bde81469dc4c6b715c009f128df90d4087c Mon Sep 17 00:00:00 2001 From: Tudor Pavel Date: Wed, 26 Feb 2014 15:43:27 +0200 Subject: [PATCH] Upload a file to an issue + feature tests --- app/assets/stylesheets/generic/issue_box.scss | 8 +++ app/assets/stylesheets/sections/issues.scss | 6 ++ app/controllers/files_controller.rb | 6 +- app/controllers/projects/issues_controller.rb | 9 +++ app/models/issue.rb | 9 ++- app/views/projects/issues/_form.html.haml | 32 +++++++++ .../issues/_issue_attachment.html.haml | 14 ++++ app/views/projects/issues/show.html.haml | 3 + config/routes.rb | 4 ++ .../20140224122008_add_attachment_to_issue.rb | 5 ++ db/schema.rb | 1 + features/project/issues/file_upload.feature | 40 +++++++++++ .../project/project_issue_file_upload.rb | 66 ++++++++++++++++++ features/support/insane-senior.jpg | Bin 0 -> 32448 bytes features/support/test_ss.ods | Bin 0 -> 7747 bytes 15 files changed, 199 insertions(+), 4 deletions(-) create mode 100644 app/views/projects/issues/_issue_attachment.html.haml create mode 100644 db/migrate/20140224122008_add_attachment_to_issue.rb create mode 100644 features/project/issues/file_upload.feature create mode 100644 features/steps/project/project_issue_file_upload.rb create mode 100644 features/support/insane-senior.jpg create mode 100644 features/support/test_ss.ods diff --git a/app/assets/stylesheets/generic/issue_box.scss b/app/assets/stylesheets/generic/issue_box.scss index 3db4d908d9c6..5460dcf029d6 100644 --- a/app/assets/stylesheets/generic/issue_box.scss +++ b/app/assets/stylesheets/generic/issue_box.scss @@ -95,6 +95,14 @@ padding: 0 25px 15px 25px; } + .issue-attachment { + @extend .context; + } + + .js-choose-issue-attachment-button { + margin-left: 15px; + } + .title, .context, .description { .clearfix { margin: 0; diff --git a/app/assets/stylesheets/sections/issues.scss b/app/assets/stylesheets/sections/issues.scss index d4f8c8108abd..88c3bb0815c9 100644 --- a/app/assets/stylesheets/sections/issues.scss +++ b/app/assets/stylesheets/sections/issues.scss @@ -143,3 +143,9 @@ form.edit-issue { border-color: #E5E5E5; } } + +.issue-image-attach { + @extend .col-md-4; + @extend .thumbnail; + margin-top: 5px; +} diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index bf30de565ed0..a61bfe00f872 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -1,10 +1,10 @@ class FilesController < ApplicationController def download - note = Note.find(params[:id]) - uploader = note.attachment + model = params[:type].capitalize.constantize.find(params[:id]) + uploader = model.attachment if uploader.file_storage? - if can?(current_user, :read_project, note.project) + if can?(current_user, :read_project, model.project) send_file uploader.file.path, disposition: 'attachment' else not_found! diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 9d97c820f384..f1da71ea15bd 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -96,6 +96,15 @@ def bulk_update redirect_to :back, notice: "#{result[:count]} issues updated" end + def delete_attachment + issue.remove_attachment! + issue.update_attribute(:attachment, nil) + + respond_to do |format| + format.js { render nothing: true } + end + end + protected def issue diff --git a/app/models/issue.rb b/app/models/issue.rb index a8dc6e5fd85a..8dbd222c1030 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -15,8 +15,12 @@ # milestone_id :integer # state :string(255) # iid :integer +# attachment :string(255) # +require 'carrierwave/orm/activerecord' +require 'file_size_validator' + class Issue < ActiveRecord::Base include Issuable include InternalId @@ -25,13 +29,16 @@ class Issue < ActiveRecord::Base belongs_to :project validates :project, presence: true + validates :attachment, file_size: { maximum: 10.megabytes.to_i } + + mount_uploader :attachment, AttachmentUploader scope :of_group, ->(group) { where(project_id: group.project_ids) } scope :of_user_team, ->(team) { where(project_id: team.project_ids, assignee_id: team.member_ids) } attr_accessible :title, :assignee_id, :position, :description, :milestone_id, :label_list, :author_id_of_changes, - :state_event + :state_event, :attachment acts_as_taggable_on :labels diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index dd091302c8ee..b91c69e84712 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -21,6 +21,19 @@ .col-sm-10 = f.text_area :description, class: "form-control js-gfm-input", rows: 14 %p.hint Issues are parsed with #{link_to "GitLab Flavored Markdown", help_markdown_path, target: '_blank'}. + .form-group + = f.label :attachment, class: 'control-label' do + %i.icon-paper-clip + File attachment + .col-sm-10 + = render partial: 'issue_attachment', locals: { deletable: true } + + %a.choose-btn.btn.js-choose-issue-attachment-button + %i.icon-paper-clip + %span Choose File ... +   + %span.file_name.js-attachment-filename File name... + = f.file_field :attachment, class: "js-issue-attachment-input hidden" %hr .form-group .issue-assignee @@ -61,6 +74,25 @@ :javascript + $(".js-issue-attachment-delete").on('confirm:complete', function(e, answer) { + if (answer) + $(this).closest(".issue-attachment").remove(); + }); + + $(".js-choose-issue-attachment-button").on('click', function(e) { + form = $(this).closest("form"); + form.find(".js-issue-attachment-input").click(); + }); + + // update the file name when an attachment is selected + $(".js-issue-attachment-input").on('change', function(e) { + form = $(this).closest("form"); + + // get only the basename + filename = $(this).val().replace(/^.*[\\\/]/, ""); + form.find(".js-attachment-filename").text(filename); + }); + $("#issue_label_list") .bind( "keydown", function( event ) { if ( event.keyCode === $.ui.keyCode.TAB && diff --git a/app/views/projects/issues/_issue_attachment.html.haml b/app/views/projects/issues/_issue_attachment.html.haml new file mode 100644 index 000000000000..121169d7bfb6 --- /dev/null +++ b/app/views/projects/issues/_issue_attachment.html.haml @@ -0,0 +1,14 @@ +- if @issue.attachment.url + .issue-attachment + .attachment + = link_to @issue.attachment.secure_url, target: "_blank" do + %i.icon-paper-clip + = @issue.attachment_identifier + - if deletable + = link_to delete_attachment_project_issue_path(@project, @issue), + title: "Delete this attachment", method: :delete, remote: true, data: { confirm: 'Are you sure you want to remove the attachment?' }, class: "danger js-issue-attachment-delete" do + %i.icon-trash.cred + - if @issue.attachment.image? + = link_to @issue.attachment.url, target: '_blank' do + = image_tag @issue.attachment.url, class: 'issue-image-attach' + .clearfix diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 124eb53571d2..b7962d0b9b15 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -48,6 +48,9 @@ .wiki = preserve do = markdown @issue.description + + = render partial: 'issue_attachment', locals: { deletable: false } + .context %cite.cgray = render partial: 'issue_context', locals: { issue: @issue } diff --git a/config/routes.rb b/config/routes.rb index fdca1e62661a..ea2074003e92 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -297,6 +297,10 @@ end resources :issues, constraints: {id: /\d+/}, except: [:destroy] do + member do + delete :delete_attachment + end + collection do post :bulk_update end diff --git a/db/migrate/20140224122008_add_attachment_to_issue.rb b/db/migrate/20140224122008_add_attachment_to_issue.rb new file mode 100644 index 000000000000..5bfeef3044b1 --- /dev/null +++ b/db/migrate/20140224122008_add_attachment_to_issue.rb @@ -0,0 +1,5 @@ +class AddAttachmentToIssue < ActiveRecord::Migration + def change + add_column :issues, :attachment, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 9f1de4d21203..4667a06441dd 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -84,6 +84,7 @@ t.integer "milestone_id" t.string "state" t.integer "iid" + t.string "attachment" end add_index "issues", ["assignee_id"], name: "index_issues_on_assignee_id", using: :btree diff --git a/features/project/issues/file_upload.feature b/features/project/issues/file_upload.feature new file mode 100644 index 000000000000..fe25548cf128 --- /dev/null +++ b/features/project/issues/file_upload.feature @@ -0,0 +1,40 @@ +Feature: Project Issue File Upload + Background: + Given I sign in as a user + And I own project "Shop" + And project "Shop" have "Release 0.4" open issue + And I visit issue page "Release 0.4" + + Scenario: I should see attachment button + And I click link "Edit" + Then I should see button "Choose File ..." + + Scenario: I can add and see filename in description + And I click link "Edit" + And I attach file "test_ss.ods" + And I click button "Save changes" + Then I should see link "test_ss.ods" + + Scenario: I should see filename in edit form + And issue "Release 0.4" has attachment "test_ss.ods" + And I click link "Edit" + Then I should see link "test_ss.ods" + + Scenario: I can add and see image in description + And I click link "Edit" + And I attach image "insane-senior.jpg" + And I click button "Save changes" + Then I should see image "insane-senior.jpg" + + Scenario: I should see image in edit form + And issue "Release 0.4" has attachment "insane-senior.jpg" + And I click link "Edit" + Then I should see image "insane-senior.jpg" + + @javascript + Scenario: I delete attachment + And issue "Release 0.4" has attachment "test_ss.ods" + And I click link "Edit" + And I click link "Delete" + And I visit issue page "Release 0.4" + Then I should not see link "test_ss.ods" diff --git a/features/steps/project/project_issue_file_upload.rb b/features/steps/project/project_issue_file_upload.rb new file mode 100644 index 000000000000..dec6635dafd1 --- /dev/null +++ b/features/steps/project/project_issue_file_upload.rb @@ -0,0 +1,66 @@ +class ProjectIssueFileUpload < Spinach::FeatureSteps + include SharedAuthentication + include SharedProject + include SharedPaths + + And 'project "Shop" have "Release 0.4" open issue' do + project = Project.find_by(name: "Shop") + create(:issue, + title: "Release 0.4", + project: project, + author: project.users.first, + description: "# Description header" + ) + end + + And 'I click link "Edit"' do + click_link "Edit" + end + + And 'I click button "Save changes"' do + click_button "Save changes" + end + + And 'I click link "Delete"' do + within(".issue-attachment") do + find(".js-issue-attachment-delete").trigger("click") + sleep 0.05 + end + end + + Then 'I should see button "Choose File ..."' do + page.should have_content "Choose File ..." + end + + And 'issue "Release 0.4" has attachment "test_ss.ods"' do + issue = Issue.find_by(title: "Release 0.4") + issue.attachment = File.open("#{Rails.root}/features/support/test_ss.ods") + issue.save! + end + + And 'issue "Release 0.4" has attachment "insane-senior.jpg"' do + issue = Issue.find_by(title: "Release 0.4") + issue.attachment = File.open("#{Rails.root}/features/support/insane-senior.jpg") + issue.save! + end + + And 'I attach file "test_ss.ods"' do + attach_file('issue_attachment', File.join(Rails.root, '/features/support/test_ss.ods')) + end + + And 'I attach image "insane-senior.jpg"' do + attach_file('issue_attachment', File.join(Rails.root, '/features/support/insane-senior.jpg')) + end + + Then 'I should see link "test_ss.ods"' do + page.should have_link "test_ss.ods" + end + + Then 'I should not see link "test_ss.ods"' do + page.should_not have_link "test_ss.ods" + end + + Then 'I should see image "insane-senior.jpg"' do + page.should have_xpath("//img[contains(@src, \"insane-senior.jpg\")]") + end +end diff --git a/features/support/insane-senior.jpg b/features/support/insane-senior.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a13a388ffd3d380454cfda4221a6adec532c5bfa GIT binary patch literal 32448 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 literal 0 HcmV?d00001 diff --git a/features/support/test_ss.ods b/features/support/test_ss.ods new file mode 100644 index 0000000000000000000000000000000000000000..5285e9245150c71f2e3eb3ce554a1c8307081ccd GIT binary patch literal 7747 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 literal 0 HcmV?d00001