]> source.dussan.org Git - redmine.git/commitdiff
Adds an optional description to attachments.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 29 Feb 2008 19:46:58 +0000 (19:46 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 29 Feb 2008 19:46:58 +0000 (19:46 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1180 e93f8b46-1217-0410-a6f0-8f06a7374b81

44 files changed:
app/controllers/application.rb
app/controllers/documents_controller.rb
app/helpers/application_helper.rb
app/views/attachments/_form.rhtml
app/views/attachments/_links.rhtml
app/views/common/_attachments_form.rhtml [deleted file]
app/views/documents/index.rhtml
app/views/documents/new.rhtml
app/views/documents/show.rhtml
app/views/issues/_edit.rhtml
app/views/issues/_form.rhtml
app/views/messages/_form.rhtml
app/views/projects/add_file.rhtml
app/views/projects/list_files.rhtml
app/views/wiki/show.rhtml
db/migrate/089_add_attachments_description.rb [new file with mode: 0644]
lang/bg.yml
lang/cs.yml
lang/de.yml
lang/en.yml
lang/es.yml
lang/fi.yml
lang/fr.yml
lang/he.yml
lang/it.yml
lang/ja.yml
lang/ko.yml
lang/lt.yml
lang/nl.yml
lang/pl.yml
lang/pt-br.yml
lang/pt.yml
lang/ro.yml
lang/ru.yml
lang/sr.yml
lang/sv.yml
lang/uk.yml
lang/zh-tw.yml
lang/zh.yml
public/javascripts/application.js
public/stylesheets/application.css
test/functional/documents_controller_test.rb
test/functional/issues_controller_test.rb
test/integration/issues_test.rb

index 3644c396a52bdabb7b2dc621635212edcb659bce..7510d503ee6ec5adca67606063fce9fbc0a27513 100644 (file)
@@ -160,16 +160,20 @@ class ApplicationController < ActionController::Base
   end
   
   # TODO: move to model
-  def attach_files(obj, files)
-    attachments = []
-    if files && files.is_a?(Array)
-      files.each do |file|
-        next unless file.size > 0
-        a = Attachment.create(:container => obj, :file => file, :author => User.current)
-        attachments << a unless a.new_record?
+  def attach_files(obj, attachments)
+    attached = []
+    if attachments && attachments.is_a?(Hash)
+      attachments.each_value do |attachment|
+        file = attachment['file']
+        next unless file && file.size > 0
+        a = Attachment.create(:container => obj, 
+                              :file => file,
+                              :description => attachment['description'].to_s.strip,
+                              :author => User.current)
+        attached << a unless a.new_record?
       end
     end
-    attachments
+    attached
   end
 
   # Returns the number of objects that should be displayed
index 93f25c4952f6e5766656ca71afb3967e1d07dce2..7e732b9b6e56d32622db370c9b2044d638f4f696 100644 (file)
@@ -21,6 +21,8 @@ class DocumentsController < ApplicationController
   before_filter :find_document, :except => [:index, :new]
   before_filter :authorize
   
+  helper :attachments
+  
   def index
     @sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category'
     documents = @project.documents.find :all, :include => [:attachments, :category]
index af493b034789ead3a0e81ca34d22c0ce311973db..b9318a3f73e34f28403326c07c3bc59162b2bf99 100644 (file)
@@ -396,7 +396,7 @@ module ApplicationHelper
   
   def labelled_tabular_form_for(name, object, options, &proc)
     options[:html] ||= {}
-    options[:html].store :class, "tabular"
+    options[:html][:class] = 'tabular' unless options[:html].has_key?(:class)
     form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
   end
   
index 18f08c6be7e3ac3c021e26f478f090e230a0c978..094668f9d251fe2b4080d15d404b13f1e37c5445 100644 (file)
@@ -1,4 +1,9 @@
-<p id="attachments_p"><label for="attachment_file"><%=l(:label_attachment)%>
-<%= image_to_function "add.png", "addFileField();return false" %></label>
-
-<%= file_field_tag 'attachments[]', :size => 30  %> <em>(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)</em></p>
+<span id="attachments_fields">
+<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil  -%>
+<%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %>
+<em><%= l(:label_optional_description) %></em>
+</span>
+<br />
+<small><%= link_to l(:label_add_another_file), {}, :onclick => 'addFileField(); return false;' %>
+(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
+</small>
index cce11292eb9513d9b7cf795ac96f37119afa4ae4..4d485548b57bc91cc17335857e9c660325f9305d 100644 (file)
@@ -1,12 +1,17 @@
 <div class="attachments">
 <% for attachment in attachments %>
-  <p><%= link_to attachment.filename, {:controller => 'attachments', :action => 'download', :id => attachment }, :class => 'icon icon-attachment' %>
-  (<%= number_to_human_size attachment.filesize %>)
-  <% unless options[:no_author] %>
-    <span class="author"><%= attachment.author.name %>, <%= format_date(attachment.created_on) %></span>
-  <% end %>
+<p><%= link_to attachment.filename, {:controller => 'attachments', :action => 'download', :id => attachment }, :class => 'icon icon-attachment' -%>
+<%= h(" - #{attachment.description}") unless attachment.description.blank? %>
+  <span class="size">(<%= number_to_human_size attachment.filesize %>)</span>
   <% if options[:delete_url] %>
-    <%= link_to image_tag('delete.png'), options[:delete_url].update({:attachment_id => attachment}), :confirm => l(:text_are_you_sure), :method => :post %>
+    <%= link_to image_tag('delete.png'), options[:delete_url].update({:attachment_id => attachment}),
+                                         :confirm => l(:text_are_you_sure),
+                                         :method => :post,
+                                         :class => 'delete',
+                                         :title => l(:button_delete) %>
+  <% end %>
+  <% unless options[:no_author] %>
+    <span class="author"><%= attachment.author %>, <%= format_time(attachment.created_on) %></span>
   <% end %>
   </p>
 <% end %>
diff --git a/app/views/common/_attachments_form.rhtml b/app/views/common/_attachments_form.rhtml
deleted file mode 100644 (file)
index 673f4a5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<p id="attachments_p">
-<label for="attachment_file"><%=l(:label_attachment)%>
-<%= image_to_function "add.png", "addFileField();return false" %></label>
-<%= file_field_tag 'attachments[]', :size => 30  %>
-<em>(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)</em>
-</p>
index ff58c2b2ff0aac0042d111335652d260b17ff56f..14d997360a099e4c09f7d8e17202f600cdf3f6ea 100644 (file)
@@ -10,7 +10,7 @@
 <% form_tag({:controller => 'documents', :action => 'new', :project_id => @project}, :class => "tabular", :multipart => true) do %>
 <%= render :partial => 'documents/form' %>
 <div class="box">
-<%= render :partial => 'common/attachments_form'%>
+<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
 </div>
 <%= submit_tag l(:button_create) %>
 <%= link_to l(:button_cancel), "#", :onclick => 'Element.hide("add-document")' %>
index 4f728da7920e01040cb6788cbbf8fe1867780c42..639b4f2922304aacef0d1ff482a2012d7d3cc101 100644 (file)
@@ -4,7 +4,7 @@
 <%= render :partial => 'documents/form' %>
 
 <div class="box">
-<%= render :partial => 'common/attachments_form'%>
+<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
 </div>
 
 <%= submit_tag l(:button_create) %>
index 3014387bdb057a011b62fec7269d8a845cd64c9f..aa90c551880538d7f3b72c0d538b12f823aa84cd 100644 (file)
 <div class="wiki">
 <%= textilizable @document.description, :attachments => @document.attachments %>
 </div>
-<br />
 
 <h3><%= l(:label_attachment_plural) %></h3>
-<ul class="documents">  
-<% for attachment in @attachments %>
-    <li>
-        <div class="contextual">
-        <%= link_to_if_authorized l(:button_delete), {:controller => 'documents', :action => 'destroy_attachment', :id => @document, :attachment_id => attachment}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
-        </div>
-        <%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %>
-        (<%= number_to_human_size attachment.filesize %>)<br />
-        <span class="author"><%= authoring attachment.created_on, attachment.author %></span><br />
-        <%= lwr(:label_download, attachment.downloads) %>
-    </li>
-<% end %>
-</ul>
-<br />
-
+<%= link_to_attachments @attachments, :delete_url => (authorize_for('documents', 'destroy_attachment') ? {:controller => 'documents', :action => 'destroy_attachment', :id => @document} : nil) %>
 
 <% if authorize_for('documents', 'add_attachment') %>
-<p><%= toggle_link l(:label_attachment_new), "add_attachment_form" %></p>
-  <% form_tag({ :controller => 'documents', :action => 'add_attachment', :id => @document }, :multipart => true, :class => "tabular", :id => "add_attachment_form", :style => "display:none;") do %>
-    <%= render :partial => 'attachments/form' %>
+<p><%= link_to l(:label_attachment_new), {}, :onclick => "Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;",
+                                             :id => 'attach_files_link' %></p>
+  <% form_tag({ :controller => 'documents', :action => 'add_attachment', :id => @document }, :multipart => true, :id => "add_attachment_form", :style => "display:none;") do %>
+  <div class="box">
+  <p><%= render :partial => 'attachments/form' %></p>
+  </div>
   <%= submit_tag l(:button_add) %>
   <% end %> 
 <% end %>
index f9b234d857f383883eeeff44d6547720ff1bee78..2e00ab520ce86121708b9439d77ccdfdc64112a3 100644 (file)
@@ -1,12 +1,12 @@
 <% labelled_tabular_form_for :issue, @issue,
                              :url => {:action => 'edit', :id => @issue},
                              :html => {:id => 'issue-form',
+                                       :class => nil,
                                        :multipart => true} do |f| %>
     <%= error_messages_for 'issue' %>
     <div class="box">
     <% if @edit_allowed || !@allowed_statuses.empty? %>
-        <fieldset>
-        <legend><%= l(:label_change_properties) %>
+        <fieldset class="tabular"><legend><%= l(:label_change_properties) %>
         <% if !@issue.new_record? && !@issue.errors.any? && @edit_allowed %>
         <small>(<%= link_to l(:label_more), {}, :onclick => 'Effect.toggle("issue_descr_fields", "appear", {duration:0.3}); return false;' %>)</small>
         <% end %>
@@ -15,7 +15,7 @@
         </fieldset>
     <% end %>
     <% if authorize_for('timelog', 'edit') %>
-    <fieldset><legend><%= l(:button_log_time) %></legend>
+        <fieldset class="tabular"><legend><%= l(:button_log_time) %></legend>
         <% fields_for :time_entry, @time_entry, { :builder => TabularFormBuilder, :lang => current_language} do |time_entry| %>
         <div class="splitcontentleft">
         <p><%= time_entry.text_field :hours, :size => 6, :label => :label_spent_time %> <%= l(:field_hours) %></p>
@@ -32,9 +32,7 @@
     <%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
     <%= wikitoolbar_for 'notes' %>
     
-    <p id="attachments_p"><label><%=l(:label_attachment_new)%>
-    <%= image_to_function 'add.png', 'addFileField();return false;' %></label>
-    <%= file_field_tag 'attachments[]', :size => 30  %> <em>(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)</em></p>
+    <p><%=l(:label_attachment_plural)%><br /><%= render :partial => 'attachments/form' %></p>
     </fieldset>
     </div>
     
index 20ca666c4ae27df23e139e0e47f4841c9958a902..1742d1391586ab17dd124273f4f30105720135d9 100644 (file)
@@ -44,9 +44,7 @@
 <%= render :partial => 'form_custom_fields', :locals => {:values => @custom_values} %>
 
 <% if @issue.new_record? %>
-<p id="attachments_p"><label for="attachment_file"><%=l(:label_attachment)%>
-<%= image_to_function "add.png", "addFileField();return false" %></label>
-<%= file_field_tag 'attachments[]', :size => 30  %> <em>(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)</em></p>
+<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
 <% end %>
 
 <%= wikitoolbar_for 'issue_description' %>
index aa035507012bf687eb9e9ca168afd66f1315155f..540811ec327eba7b7351a62adcc3e6f7db8fa04f 100644 (file)
@@ -4,7 +4,7 @@
 <div class="box">
 <!--[form:message]-->
 <p><label><%= l(:field_subject) %></label><br />
-<%= f.text_field :subject, :required => true, :size => 120 %>
+<%= f.text_field :subject, :size => 120 %>
 
 <% if !replying && User.current.allowed_to?(:edit_messages, @project) %>
     <label><%= f.check_box :sticky %> Sticky</label>
 <% end %>
 </p>
 
-<p><%= f.text_area :content, :required => true, :cols => 80, :rows => 15, :class => 'wiki-edit', :id => 'message_content' %></p>
+<p><%= f.text_area :content, :cols => 80, :rows => 15, :class => 'wiki-edit', :id => 'message_content' %></p>
 <%= wikitoolbar_for 'message_content' %>
 <!--[eoform:message]-->
 
-<span class="tabular">
-<%= render :partial => 'attachments/form' %>
-</span>
+<p><%= l(:label_attachment_plural) %><br />
+<%= render :partial => 'attachments/form' %></p>
 </div>
index 839275373f44c7c274e322abaa6d6b4dfc4a2888..0ee55083d8d8480a5df035249acb0bfac33c7355 100644 (file)
@@ -7,7 +7,7 @@
 <p><label for="version_id"><%=l(:field_version)%> <span class="required">*</span></label>
 <%= select_tag "version_id", options_from_collection_for_select(@versions, "id", "name") %></p>
 
-<%= render :partial => 'attachments/form' %>
+<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
 </div>
 <%= submit_tag l(:button_add) %>
 <% end %> 
\ No newline at end of file
index 47b262388d386951e290e26c23c711876e49e65f..e02077d8e928cfa85dae41bb3b7482da8d73a3fe 100644 (file)
@@ -23,7 +23,8 @@
   <% for file in version.attachments %>                
   <tr class="<%= cycle("odd", "even") %>">
     <td></td>
-    <td><%= link_to file.filename, :controller => 'versions', :action => 'download', :id => version, :attachment_id => file %></td>
+    <td><%= link_to(file.filename, {:controller => 'versions', :action => 'download', :id => version, :attachment_id => file},
+                                   :title => file.description) %></td>
     <td align="center"><%= format_date(file.created_on) %></td>
     <td align="center"><%= number_to_human_size(file.filesize) %></td>
     <td align="center"><%= file.downloads %></td>
index 6f1df124bb4dc2aa8069b5d833948aaf5716a91e..77d82884f1d7260acae64999a3a0469169bdb584 100644 (file)
 <%= link_to_attachments @page.attachments, :delete_url => (authorize_for('wiki', 'destroy_attachment') ? {:controller => 'wiki', :action => 'destroy_attachment', :page => @page.title} : nil) %>
 
 <% if authorize_for('wiki', 'add_attachment') %>
-<p><%= toggle_link l(:label_attachment_new), "add_attachment_form" %></p>
-<% form_tag({ :controller => 'wiki', :action => 'add_attachment', :page => @page.title }, :multipart => true, :class => "tabular", :id => "add_attachment_form", :style => "display:none;") do %>
-  <%= render :partial => 'attachments/form' %>
+<p><%= link_to l(:label_attachment_new), {}, :onclick => "Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;",
+                                             :id => 'attach_files_link' %></p>
+<% form_tag({ :controller => 'wiki', :action => 'add_attachment', :page => @page.title }, :multipart => true, :id => "add_attachment_form", :style => "display:none;") do %>
+  <div class="box">
+  <p><%= render :partial => 'attachments/form' %></p>
+  </div>
 <%= submit_tag l(:button_add) %>
+<%= link_to l(:button_cancel), {}, :onclick => "Element.hide('add_attachment_form'); Element.show('attach_files_link'); return false;" %>
 <% end %>
 <% end %>
 
diff --git a/db/migrate/089_add_attachments_description.rb b/db/migrate/089_add_attachments_description.rb
new file mode 100644 (file)
index 0000000..411dfe4
--- /dev/null
@@ -0,0 +1,9 @@
+class AddAttachmentsDescription < ActiveRecord::Migration
+  def self.up
+    add_column :attachments, :description, :string
+  end
+
+  def self.down
+    remove_column :attachments, :description
+  end
+end
index debb643cc6d5278e80f47661dc8adf3e2eddc2d9..64fff5ae9b35947dffcec4474058fcdcf93891d5 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index 2ff8623723d776ded54371fb6acc5a563a1ccf4d..6de5ee01b124545d2491f925c2e738297846baab 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index b12f558d0eab0b433a333334f05e51828185112e..f2b1c2023d3c138e7a51be936941b89f22e5290b 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index dadd0a4e58a7c86a7da65a6ef2e47460981ce457..b06977035290f31d0e5997638accb25e63b25d8e 100644 (file)
@@ -497,6 +497,8 @@ label_scm: SCM
 label_plugins: Plugins
 label_ldap_authentication: LDAP authentication
 label_downloads_abbr: D/L
+label_optional_description: Optional description
+label_add_another_file: Add another file
 
 button_login: Login
 button_submit: Submit
index 1fd355cd27cec9cf1f3b1cc406ec5de19ae10d06..9c72af18d6b67dda3338e3d3a659f158485224b0 100644 (file)
@@ -603,3 +603,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index 351c47c1b5a70d602c38d249a01347221c409270..350e5ba44118576c36a37ad74fc55109e48cdf58 100644 (file)
@@ -604,3 +604,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index 73d2e0af652df9d2b956c8d03881a88699e72a5d..c2baa3b7ece17180e5bff0fbb07269e9dc884dea 100644 (file)
@@ -497,6 +497,8 @@ label_scm: SCM
 label_plugins: Plugins
 label_ldap_authentication: Authentification LDAP
 label_downloads_abbr: D/L
+label_optional_description: Description facultative
+label_add_another_file: Ajouter un autre fichier
 
 button_login: Connexion
 button_submit: Soumettre
index d0071e26f789fa1fbb7da6c005dbd83b1fc30e43..680364714696fbf50b2c687407429eecd7cb29f4 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index 7c6f179862567520b22885e99acc2d8b28920d6c..b2eb1c9c6719b1cf21dca9c25d5a75cd145ae7fd 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index bc5303f8fa3aac4972985cdb09bb850580a0bdfd..2a742072d4e0ecf13907b4af161f9bf933dc80bf 100644 (file)
@@ -601,3 +601,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index bb112c25960f3fe08cc9e22784d608f12481426d..cce1480d857e8ce8cd5631a1a802dc80507f7b16 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index eb5a5d6e99b28bbe76eb2e2d0ba7581c0402a48a..7701280a0b3421f7383d27743cbfe164b8856d83 100644 (file)
@@ -601,3 +601,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index c9bd74db74e8b01322d680516b24a831d03bb99f..a0a5305e49b13955c62604358b0e1570687cd1a5 100644 (file)
@@ -601,3 +601,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index 927025ece77a4f89917c4d8b32d8a9ca85e9498f..6de13aea4325931c60b7bb6204429777c8cb3938 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index 003940ced2c0724c3c5f26a9fea4be54fc692194..83b640a4317f21c24728a3ffcd8b07c9fd3f0a45 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week\r
 label_yesterday: yesterday\r
 label_last_month: last month\r
+label_add_another_file: Add another file\r
+label_optional_description: Optional description\r
index 0649005e8c0ce3df833a6f4de204b285a14a3dba..e100d153e287d796f83e200de8c243318630b818 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index 7e71846b2116a6c6260012f6b1d95bb6956f50fa..142a2a84f6d5e6ebd68453ca639c01e69a89e9f4 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index d0c4ddef98d08a04353641a93198bf19a83d2f86..83e63115fca52591a2bc7aa842f6db3c74481a39 100644 (file)
@@ -604,3 +604,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index f1ed258827afb09e17a527baf480d2e0e803e967..2cd92607fbe0edb492f7bbe0a78c595b973843bd 100644 (file)
@@ -601,3 +601,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index 9bd7e0d4c1ceec2e58bfdd87e9dd500e1851e0ca..a9b30ae2f5c669cce745243d19472d58687ac96a 100644 (file)
@@ -601,3 +601,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index b0c73b85b8c4e8c8f7847c944883b7d195af908b..0be41cf04b8f5191433dac532213bb9199e85d3b 100644 (file)
@@ -602,3 +602,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index ab2947676706af259c2f15a81f9b42cb947f6f5d..c63e6c3bf3221e260d4e639752d3d4d77a30e679 100644 (file)
@@ -600,3 +600,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index ae2faf23cb8595ae55bea96fa050513011fecbd8..a50d8be488ac0a17cd98bcfc0f7cfb7828c0cc83 100644 (file)
@@ -603,3 +603,5 @@ label_date_range: Date range
 label_last_week: last week
 label_yesterday: yesterday
 label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
index d77362a060e06c565f4a8f98e59effc71c17d896..4e88498423ca90cd5d5bdbc3579898d0b2769793 100644 (file)
@@ -10,15 +10,24 @@ function checkAll (id, checked) {
        }
 }
 
+var fileFieldCount = 1;
+
 function addFileField() {
+    if (fileFieldCount >= 10) return false
+    fileFieldCount++;
     var f = document.createElement("input");
     f.type = "file";
-    f.name = "attachments[]";
+    f.name = "attachments[" + fileFieldCount + "][file]";
     f.size = 30;
-        
-    p = document.getElementById("attachments_p");
+    var d = document.createElement("input");
+    d.type = "text";
+    d.name = "attachments[" + fileFieldCount + "][description]";
+    d.size = 60;
+    
+    p = document.getElementById("attachments_fields");
     p.appendChild(document.createElement("br"));
     p.appendChild(f);
+    p.appendChild(d);
 }
 
 function showTab(name) {
index b3dcac6b020e3d101feb23a3d779d647902d6df4..83393748221b29b917542a26bcb8a18d8dd946da 100644 (file)
@@ -222,7 +222,11 @@ width: 200px;
 .required {color: #bb0000;}
 .summary {font-style: italic;}
 
+#attachments_fields input[type=text] {margin-left: 8px; }
+
 div.attachments p { margin:4px 0 2px 0; }
+div.attachments img { vertical-align: middle; }
+div.attachments span.author { font-size: 0.9em; color: #888; }
 
 /***** Flash & error messages ****/
 #errorExplanation, div.flash, .nodata {
index 7ba308ec5518db75565ad110fdded9dc89a8f4f9..f150a5b7a8693bc8fb658ab960a5ba993f24e4ed 100644 (file)
@@ -44,7 +44,7 @@ class DocumentsControllerTest < Test::Unit::TestCase
                :document => { :title => 'DocumentsControllerTest#test_post_new',
                               :description => 'This is a new document',
                               :category_id => 2},
-               :attachments => [ ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/testfile.txt', 'text/plain') ]
+               :attachments => {'1' => {'file' => test_uploaded_file('testfile.txt', 'text/plain')}}
                
     assert_redirected_to 'projects/ecookbook/documents'
     
index 4f28ab22452e491262ff65da173bbdc6e1c4c4e9..34b030d989359bcf850f09bcc47da89554d24152 100644 (file)
@@ -300,7 +300,7 @@ class IssuesControllerTest < Test::Unit::TestCase
     post :edit,
          :id => 1,
          :notes => '',
-         :attachments => [ test_uploaded_file('testfile.txt', 'text/plain') ]
+         :attachments => {'1' => {'file' => test_uploaded_file('testfile.txt', 'text/plain')}}
     assert_redirected_to 'issues/show/1'
     j = Issue.find(1).journals.find(:first, :order => 'id DESC')
     assert j.notes.blank?
index eda4ef676c0ce83be1e66fd3f3ba727e3b9dde13..facd7c630639d20b24f87ce54c6c8b87696f87a5 100644 (file)
@@ -50,13 +50,14 @@ class IssuesTest < ActionController::IntegrationTest
 
     post 'issues/edit/1',
          :notes => 'Some notes',
-         :attachments => ([] << ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/testfile.txt', 'text/plain'))
+         :attachments => {'1' => {'file' => test_uploaded_file('testfile.txt', 'text/plain'), 'description' => 'This is an attachment'}}
     assert_redirected_to "issues/show/1"
     
     # make sure attachment was saved
     attachment = Issue.find(1).attachments.find_by_filename("testfile.txt")
     assert_kind_of Attachment, attachment
     assert_equal Issue.find(1), attachment.container
+    assert_equal 'This is an attachment', attachment.description
     # verify the size of the attachment stored in db
     #assert_equal file_data_1.length, attachment.filesize
     # verify that the attachment was written to disk