changeset 591:9e866f13c984 feature_36

Author Autocomplete: Changes in the User/Authorship selection mechanism. Separated the search box from the name field.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Fri, 12 Aug 2011 16:21:35 +0100
parents 658cfb481618
children 68c6b060385c
files vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb vendor/plugins/redmine_bibliography/app/helpers/publications_helper.rb vendor/plugins/redmine_bibliography/app/models/authorship.rb vendor/plugins/redmine_bibliography/app/views/publications/_authorship_fields.rhtml vendor/plugins/redmine_bibliography/config/locales/en.yml
diffstat 5 files changed, 95 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb	Fri Aug 12 13:15:05 2011 +0100
+++ b/vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb	Fri Aug 12 16:21:35 2011 +0100
@@ -198,21 +198,24 @@
   def autocomplete_for_author
     @results = []
     
-    authors_list = Author.like(params[:q]).find(:all, :limit => 100)    
+    authorships_list = Authorship.like(params[:q]).find(:all, :limit => 100)
     users_list = User.active.like(params[:q]).find(:all, :limit => 100)
 
-    logger.debug "Query for \"#{params[:q]}\" returned \"#{authors_list.size}\" authors and \"#{users_list.size}\" users"
+    logger.debug "Query for \"#{params[:q]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
     
-    # need to subtract both lists
-    # give priority to the users    
+    # need to subtract both lists; give priority to the users    
     users_list.each do |user|      
       @results << user
+      logger.error { "Added USER #{user.id} to the results list" }
     end
     
-    authors_list.each do |author|      
-      @results << author unless users_list.include?(author.user)
+    authorships_list.each do |authorship|
+      unless users_list.include?(authorship.author.user)
+        @results << authorship 
+        logger.error { "Added AUTHORSHIP #{authorship.id} to the results list" }
+      end
     end
-                 
+
     render :layout => false
   end
 
@@ -253,7 +256,7 @@
       logger.error { "Cannot remove project from publication list" }      
     end
     
-    logger.error { "CURRENT projectr name#{proj.name} and wanna delete #{@project.name}" }
+    logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
         
     render(:update) {|page| 
       page.replace_html "list_projects", :partial => 'list_projects', :id  => @publication
@@ -269,10 +272,6 @@
     redirect_to :controller => :publications, :action => 'index', :project_id => @project
   end
 
-  def identify_author
-    
-  end
-
   private
 
 end
--- a/vendor/plugins/redmine_bibliography/app/helpers/publications_helper.rb	Fri Aug 12 13:15:05 2011 +0100
+++ b/vendor/plugins/redmine_bibliography/app/helpers/publications_helper.rb	Fri Aug 12 16:21:35 2011 +0100
@@ -9,52 +9,71 @@
     s 
   end
   
-  def identify_author(author)
+  def generate_autofill_suggestions(item)
+
+    logger.error { "Generate Autofill Suggestions for #{item.class} #{item.id}" }
 
     link_text = ''
     suffix = ''
-    user = nil
+    
+    if item.respond_to? :name_on_paper
+      # if it walks like a duck, than it's an Authorship
+      Rails.logger.debug { "Identify Author (Authorship): class - #{item.class} id - #{item.id}" }
 
-    if author.class == User
+      item_info = { 
+        :name_on_paper => item.name_on_paper, 
+        :author_user_id => item.author_id,
+        :is_user  => '0',
+        :institution => item.institution,
+        :email => item.email
+      }
+      
+      link_text = h(item.name_on_paper)  
 
-      Rails.logger.debug { "Identify Author: USER" }
+    else
+      Rails.logger.debug { "Identify Author (User): class - #{item.class} id - #{item.id}" }
 
       # fc defined in the users_author_patch
-      author_info = author.get_author_info
+      item_info = item.get_author_info
+      
+      link_text = h(item.name)
+
+    end
+
+
+    suffix << '<em>' + h(item_info[:institution]) 
+    suffix << '&nbsp;' + h(item_info[:is_user]) + '</em>'
+
+    link_to_function(link_text, "update_author_info(this," + item_info.to_json + ")") + '&nbsp;' + suffix
+  end
   
-    elsif author.class == Author    
+  def choose_author_link(name, items)
+    s = ''    
+    list = []
 
-      Rails.logger.debug { "Identify Author: AUTHOR" }
+    items.sort.each do |item|
+      if item.respond_to? :name_on_paper
+        logger.error { "CHOOSE AUTHOR LINK - Authorship #{item.id}" }
+        list << item      
+      else 
+        logger.error { "CHOOSE AUTHOR LINK: USER #{item.id}" }
+  
+        list << item
+        unless item.author.nil? 
+          unless item.author.authorships.nil?
+            list << item.author.authorships 
+            list.flatten!
+          end
+        end
+      end
+    end
 
-      author_info = { 
-        :name_on_paper => author.name, 
-        :author_user_id => '',
-        :is_user  => '0',
-        :institution => "",
-        :email => ""
-      }
-      
-      link_text = h(author.name)      
-
-      if author.user.nil?
-        author_info[:author_user_id] = author.id
-        # TODO: AUTHORSHIPS INFORMATION
-#     else
-#       author_info[:email] = author.user.mail
-#       author_info[:institution] = author.user.institution_name
+    if list.length > 0    
+      list.each do |element|
+        s << "<li>#{generate_autofill_suggestions element}</li>"
       end
     end
     
-    suffix = '<em>' + h(author_info[:institution]) + '</em>'
-
-    link_to_function(link_text, "update_author_info(this," + author_info.to_json + ")") + ' ' + suffix
-  end
-  
-  def choose_author_link(name, authors_users)
-    s = ''
-    authors_users.sort.each do |author_user|
-      s << "<li>#{identify_author author_user}</li>"
-    end
     s 
   end
 
--- a/vendor/plugins/redmine_bibliography/app/models/authorship.rb	Fri Aug 12 13:15:05 2011 +0100
+++ b/vendor/plugins/redmine_bibliography/app/models/authorship.rb	Fri Aug 12 16:21:35 2011 +0100
@@ -7,8 +7,20 @@
   accepts_nested_attributes_for :author
   accepts_nested_attributes_for :publication
   
-  attr_accessor :is_user, :author_user_id 
+  attr_accessor :is_user, :author_user_id, :search_name
   before_save :associate_author_user
+
+  named_scope :like, lambda {|q| 
+    s = "%#{q.to_s.strip.downcase}%"
+    {:conditions => ["LOWER(name_on_paper) LIKE :s", {:s => s}],
+     :order => 'name_on_paper'
+    }
+  }
+  
+  
+  def <=>(authorship)
+    name_on_paper.downcase <=> authorship.name_on_paper.downcase
+  end
   
   protected 
   def associate_author_user 
--- a/vendor/plugins/redmine_bibliography/app/views/publications/_authorship_fields.rhtml	Fri Aug 12 13:15:05 2011 +0100
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_authorship_fields.rhtml	Fri Aug 12 16:21:35 2011 +0100
@@ -2,16 +2,24 @@
 
   <h4><%= l("label_author_1") %></h4>
 
+  <p>
+	<%= f.text_field :search_name, :size => 25 %>
+	
+	<%= observe_field( form_tag_id(f.object_name, :search_name), :frequency => 0.5, :update => form_tag_id(f.object_name, :identify_author), :url => { :controller => 'publications', :action => 'autocomplete_for_author' }, :with => 'q') %>
+	 
+	<%= link_to_function l(:label_author_is_me), "update_author_info(this," + User.current.get_author_info.to_json + ")", :id => "add_me_as_author" %>
+	<br />
+	<em><%= h l("text_author_search") %></em>
+  </p>
+
+  <p>
+    <div id="<%= form_tag_id(f.object_name, :identify_author) %>">
+    </div>	
+  </p>
+  
   <p>        
     <%= f.text_field :name_on_paper, :size => 25 %> 
-    <%= link_to_function l(:label_author_is_me), "update_author_info(this," + User.current.get_author_info.to_json + ")", :id => "add_me_as_author" %><br />
     <em><%= h l("text_author_name_on_paper") %></em><br />
-
-    <%= observe_field( form_tag_id(f.object_name, :name_on_paper), :frequency => 0.5, :update => form_tag_id(f.object_name, :identify_author), :url => { :controller => 'publications', :action => 'autocomplete_for_author' }, :with => 'q')
-    %>
-
-    <div id="<%= form_tag_id(f.object_name, :identify_author) %>">
-    </div>
       
     <p>
     <%= f.text_field :institution, :size => 35 %><br />
--- a/vendor/plugins/redmine_bibliography/config/locales/en.yml	Fri Aug 12 13:15:05 2011 +0100
+++ b/vendor/plugins/redmine_bibliography/config/locales/en.yml	Fri Aug 12 16:21:35 2011 +0100
@@ -26,6 +26,7 @@
   label_add_me_as_author: "Add me as an author"
   label_add_an_author: "Add an author"
   label_add_another_author: "Add another author"
+  field_search_name: "Search author"
 
   remove_author: "Remove this author"
   
@@ -42,7 +43,9 @@
   
   text_author_email: "Author's email address as on the paper."
   text_author_institution: "Author's institution name as on paper."
-  text_author_name_on_paper: "Name of the author as it appears on paper. (In case it applies, please use the autocomplete suggestions.)"
+  text_author_name_on_paper: "Name of the author as it appears on paper."
+  
+  text_author_search: "Search existing authors"
   
   # authorships model
   field_institution: "Institution"