Revision 1426:7367cd232b1e plugins/redmine_bibliography
| plugins/redmine_bibliography/app/controllers/publications_controller.rb | ||
|---|---|---|
| 15 | 15 |
# we'll always want a new publication to have its bibtex entry |
| 16 | 16 |
@publication.build_bibtex_entry |
| 17 | 17 |
|
| 18 |
# and at least one author |
|
| 19 |
# @publication.authorships.build.build_author |
|
| 20 |
@author_options = [["#{User.current.name} (@#{User.current.mail.partition('@')[2]})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
|
|
| 21 | 18 |
end |
| 22 | 19 |
|
| 23 | 20 |
def create |
| 24 | 21 |
@project = Project.find(params[:project_id]) |
| 25 | 22 |
|
| 26 |
@author_options = [] |
|
| 27 |
|
|
| 28 | 23 |
@publication = Publication.new(params[:publication]) |
| 29 | 24 |
@publication.projects << @project unless @project.nil? |
| 30 | 25 |
|
| ... | ... | |
| 91 | 86 |
@publication = Publication.find(params[:id]) |
| 92 | 87 |
@selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type |
| 93 | 88 |
|
| 94 |
@author_options = [] |
|
| 95 |
|
|
| 96 | 89 |
@bibtype_fields = BibtexEntryType.fields(@selected_bibtex_entry_type_id) |
| 97 | 90 |
end |
| 98 | 91 |
|
| 99 | 92 |
def update |
| 100 | 93 |
@publication = Publication.find(params[:id]) |
| 101 |
@author_options = [] |
|
| 102 | 94 |
|
| 103 | 95 |
if @publication.update_attributes(params[:publication]) |
| 104 | 96 |
flash[:notice] = "Successfully updated Publication." |
| ... | ... | |
| 176 | 168 |
@publication.bibtex_entry = @bentry |
| 177 | 169 |
@publication.save |
| 178 | 170 |
|
| 179 |
# what is this for??? |
|
| 180 |
# @created_publications << @publication.id |
|
| 181 |
|
|
| 182 | 171 |
# need to save all authors |
| 183 | 172 |
# and establish the author-publication association |
| 184 | 173 |
# via the authorships table |
| ... | ... | |
| 199 | 188 |
end |
| 200 | 189 |
end |
| 201 | 190 |
|
| 202 |
# parses the bibtex file |
|
| 203 |
def parse_bibtex_file |
|
| 204 |
|
|
| 205 |
end |
|
| 206 |
|
|
| 207 |
def import |
|
| 208 |
@publication = Publication.new |
|
| 209 |
|
|
| 210 |
|
|
| 211 |
end |
|
| 212 |
|
|
| 213 | 191 |
def autocomplete_for_project |
| 214 | 192 |
@publication = Publication.find(params[:id]) |
| 215 | 193 |
|
| ... | ... | |
| 225 | 203 |
@object_name = "publications[authorships_attributes][#{object_id}][search_results]"
|
| 226 | 204 |
|
| 227 | 205 |
# cc 20110909 -- revert to like instead of like_unique -- see #289 |
| 228 |
authorships_list = Authorship.like(params[:term]).find(:all, :limit => 100) |
|
| 206 |
authorships_list = Authorship.like(params[:term]).group('author_id').find(:all, :limit => 100)
|
|
| 207 |
|
|
| 208 |
authors_list = authorships_list.collect do |x| x.author end |
|
| 209 |
|
|
| 229 | 210 |
users_list = User.active.like(params[:term]).find(:all, :limit => 100) |
| 230 | 211 |
|
| 231 |
logger.debug "Query for \"#{params[:term]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
|
|
| 212 |
logger.debug "Query for \"#{params[:term]}\" returned \"#{authors_list.size}\" authors and \"#{users_list.size}\" users"
|
|
| 232 | 213 |
|
| 233 |
@results = users_list |
|
| 214 |
# will check if any of the members of the users list |
|
| 215 |
# doesn't belong to the authors list |
|
| 234 | 216 |
|
| 235 |
# TODO: can be optimized… |
|
| 236 |
authorships_list.each do |authorship| |
|
| 237 |
flag = true |
|
| 217 |
@results = authors_list |
|
| 238 | 218 |
|
| 239 |
users_list.each do |user| |
|
| 240 |
if authorship.name == user.name && authorship.email == user.mail && authorship.institution == user.institution |
|
| 241 |
Rails.logger.debug { "Rejecting Authorship #{authorship.id}" }
|
|
| 242 |
flag = false |
|
| 243 |
break |
|
| 244 |
end |
|
| 245 |
end |
|
| 246 |
|
|
| 247 |
@results << authorship if flag |
|
| 219 |
users_list.each do |user| |
|
| 220 |
@results << user unless authors_list.include?(user.author) |
|
| 248 | 221 |
end |
| 249 | 222 |
|
| 223 |
logger.debug { "Autocomplete_for_author results --> #{@results}" }
|
|
| 224 |
|
|
| 250 | 225 |
render :layout => false |
| 251 | 226 |
end |
| 252 | 227 |
|
| 253 |
def get_user_info |
|
| 254 |
object_id = params[:object_id] |
|
| 255 |
value = params[:value] |
|
| 256 |
classname = Kernel.const_get(value.split('_')[0])
|
|
| 257 |
|
|
| 258 |
item = classname.find(value.split('_')[1])
|
|
| 259 |
|
|
| 260 |
name_field = "publication_authorships_attributes_#{object_id}_name_on_paper".to_sym
|
|
| 261 |
email_field = "publication_authorships_attributes_#{object_id}_email".to_sym
|
|
| 262 |
institution_field = "publication_authorships_attributes_#{object_id}_institution".to_sym
|
|
| 263 |
|
|
| 264 |
yes_radio = "publication_authorships_attributes_#{object_id}_identify_author_yes".to_sym
|
|
| 265 |
|
|
| 266 |
respond_to do |format| |
|
| 267 |
format.js {
|
|
| 268 |
render(:update) {|page|
|
|
| 269 |
page[name_field].value = item.name |
|
| 270 |
page[email_field].value = item.mail |
|
| 271 |
page[institution_field].value = item.institution |
|
| 272 |
|
|
| 273 |
page[yes_radio].checked = true |
|
| 274 |
page[name_field].readOnly = true |
|
| 275 |
page[email_field].readOnly = true |
|
| 276 |
page[institution_field].readOnly = true |
|
| 277 |
} |
|
| 278 |
} |
|
| 279 |
end |
|
| 280 |
end |
|
| 281 |
|
|
| 282 | 228 |
def sort_author_order |
| 283 | 229 |
params[:authorships].each_with_index do |id, index| |
| 284 | 230 |
Authorship.update_all(['auth_order=?', index+1], ['id=?', id]) |
| ... | ... | |
| 303 | 249 |
end |
| 304 | 250 |
end |
| 305 | 251 |
|
| 306 |
|
|
| 307 | 252 |
def remove_project |
| 308 | 253 |
@project = Project.find(params[:project_id]) |
| 309 | 254 |
proj = Project.find(params[:remove_project_id]) |
| ... | ... | |
| 324 | 269 |
end |
| 325 | 270 |
|
| 326 | 271 |
def destroy |
| 327 |
find_project_by_project_id |
|
| 272 |
find_project_by_project_id unless params[:project_id].nil? |
|
| 273 |
@publication = Publication.find(params[:id]) |
|
| 328 | 274 |
|
| 329 | 275 |
@publication.destroy |
| 330 | 276 |
|
| plugins/redmine_bibliography/app/helpers/publications_helper.rb | ||
|---|---|---|
| 106 | 106 |
end |
| 107 | 107 |
end |
| 108 | 108 |
|
| 109 |
|
|
| 110 | 109 |
def show_bibtex_fields(bibtex_entry) |
| 111 | 110 |
s = "" |
| 112 | 111 |
bibtex_entry.attributes.keys.sort.each do |key| |
| ... | ... | |
| 125 | 124 |
end |
| 126 | 125 |
end |
| 127 | 126 |
|
| 127 |
|
|
| 128 |
def render_authorship_link(link_class, link_id) |
|
| 129 |
|
|
| 130 |
# Renders a link for an author used when adding authors for a publication |
|
| 131 |
# link_class can be either User or Author |
|
| 132 |
# link_id will be the id of the Author/User we wish to link |
|
| 133 |
|
|
| 134 |
s= "" |
|
| 135 |
|
|
| 136 |
if link_class == "Author" |
|
| 137 |
url = {:controller => 'authors', :action => 'show', :id => link_id}
|
|
| 138 |
s << link_to(h(Author.find(link_id).name), url) |
|
| 139 |
else |
|
| 140 |
url = {:controller => 'users', :action => 'show', :id => link_id}
|
|
| 141 |
s << link_to(h(User.find(link_id).name), url) |
|
| 142 |
end |
|
| 143 |
|
|
| 144 |
s.html_safe |
|
| 145 |
end |
|
| 146 |
|
|
| plugins/redmine_bibliography/app/models/author.rb | ||
|---|---|---|
| 18 | 18 |
} |
| 19 | 19 |
} |
| 20 | 20 |
|
| 21 |
def institution |
|
| 22 |
if self.authorships.first.nil? |
|
| 23 |
"" |
|
| 24 |
else |
|
| 25 |
self.authorships.first.institution |
|
| 26 |
end |
|
| 27 |
end |
|
| 28 |
|
|
| 29 |
def mail |
|
| 30 |
if self.authorships.first.nil? |
|
| 31 |
"" |
|
| 32 |
else |
|
| 33 |
self.authorships.first.mail |
|
| 34 |
end |
|
| 35 |
end |
|
| 36 |
|
|
| 37 |
# todo: need to fix the name getter |
|
| 38 |
def name |
|
| 39 |
if self.authorships.first.nil? |
|
| 40 |
"" |
|
| 41 |
else |
|
| 42 |
self.authorships.first.name |
|
| 43 |
end |
|
| 44 |
end |
|
| 45 |
|
|
| 21 | 46 |
end |
| plugins/redmine_bibliography/app/models/authorship.rb | ||
|---|---|---|
| 9 | 9 |
|
| 10 | 10 |
validates_presence_of :name_on_paper |
| 11 | 11 |
|
| 12 |
attr_accessor :search_author_class, :search_author_id, :search_name, :search_results, :identify_author |
|
| 12 |
attr_writer :search_author_id , :search_author_class |
|
| 13 |
attr_writer :search_author_tie |
|
| 13 | 14 |
|
| 14 |
before_create :associate_author_user |
|
| 15 |
### attr_accessor :search_results, :identify_author |
|
| 16 |
## attr_writer :search_author_class |
|
| 17 |
|
|
| 18 |
before_save :set_author |
|
| 15 | 19 |
before_update :delete_publication_cache |
| 16 | 20 |
|
| 17 | 21 |
# tod: review scope of ordering |
| ... | ... | |
| 34 | 38 |
} |
| 35 | 39 |
} |
| 36 | 40 |
|
| 41 |
def search_author_class |
|
| 42 |
# Authorship must always have an Author |
|
| 43 |
# unless it hasn't been saved yet |
|
| 44 |
# using default setter (attr_writer) |
|
| 45 |
|
|
| 46 |
if self.author.nil? |
|
| 47 |
aclass = "" |
|
| 48 |
else |
|
| 49 |
aclass = "Author" |
|
| 50 |
end |
|
| 51 |
|
|
| 52 |
@search_author_class || aclass |
|
| 53 |
end |
|
| 54 |
|
|
| 55 |
def search_author_id |
|
| 56 |
if self.author.nil? |
|
| 57 |
authid = "" |
|
| 58 |
else |
|
| 59 |
authid = author_id |
|
| 60 |
end |
|
| 61 |
|
|
| 62 |
@search_author_id || authid |
|
| 63 |
end |
|
| 64 |
|
|
| 65 |
def search_author_tie |
|
| 66 |
if self.author.nil? |
|
| 67 |
auth_tie = false |
|
| 68 |
else |
|
| 69 |
auth_tie = true |
|
| 70 |
end |
|
| 71 |
|
|
| 72 |
@search_author_tie || auth_tie |
|
| 73 |
end |
|
| 74 |
|
|
| 37 | 75 |
def name |
| 38 | 76 |
return self.name_on_paper |
| 39 | 77 |
end |
| ... | ... | |
| 54 | 92 |
Rails.cache.delete "publication-#{publication.id}-bibtex"
|
| 55 | 93 |
end |
| 56 | 94 |
|
| 57 |
def associate_author_user |
|
| 58 |
case self.search_author_class |
|
| 59 |
when "" |
|
| 60 |
logger.debug { "Unknown Author to be added..." }
|
|
| 61 |
when "User" |
|
| 95 |
private |
|
| 96 |
|
|
| 97 |
def set_author |
|
| 98 |
# do we want to associate the authorship |
|
| 99 |
# with an existing author/user? |
|
| 100 |
if @search_author_tie |
|
| 101 |
# if an author, simply associates with it |
|
| 102 |
# if an user, checks if it has already an author associated with it |
|
| 103 |
# if so, associates with that author |
|
| 104 |
# otherwise, creates a new author |
|
| 105 |
|
|
| 106 |
case @search_author_class |
|
| 107 |
when "" |
|
| 108 |
author = Author.new |
|
| 109 |
author.save |
|
| 110 |
|
|
| 111 |
when "User" |
|
| 112 |
user = User.find(@search_author_id) |
|
| 113 |
|
|
| 114 |
if user.author.nil? |
|
| 115 |
# User w/o author: |
|
| 116 |
# create new author and update user |
|
| 117 |
author = Author.new |
|
| 118 |
author.save |
|
| 119 |
user.author = author |
|
| 120 |
user.save |
|
| 121 |
else |
|
| 122 |
author = user.author |
|
| 123 |
end |
|
| 124 |
|
|
| 125 |
when "Author" |
|
| 126 |
author = Author.find(@search_author_id) |
|
| 127 |
end |
|
| 128 |
|
|
| 129 |
# if we don't want to associate with an existing author/user |
|
| 130 |
else |
|
| 131 |
# todo: should we delete any previously existing relationship? |
|
| 62 | 132 |
author = Author.new |
| 63 | 133 |
author.save |
| 64 |
self.author_id = author.id
|
|
| 134 |
end
|
|
| 65 | 135 |
|
| 66 |
when "Author" |
|
| 67 |
selected = self.search_results |
|
| 68 |
selected_classname = Kernel.const_get(self.search_author_class) |
|
| 69 |
selected_id = self.search_author_id |
|
| 70 |
object = selected_classname.find(selected_id) |
|
| 71 |
|
|
| 72 |
if object.respond_to? :name_on_paper |
|
| 73 |
# Authorship |
|
| 74 |
self.author_id = object.author.id |
|
| 75 |
else |
|
| 76 |
# User |
|
| 77 |
unless object.author.nil? |
|
| 78 |
self.author_id = object.author.id |
|
| 79 |
else |
|
| 80 |
author = Author.new |
|
| 81 |
object.author = author |
|
| 82 |
object.save |
|
| 83 |
self.author_id = object.author.id |
|
| 84 |
end |
|
| 85 |
end |
|
| 86 |
end |
|
| 136 |
self.author = author |
|
| 87 | 137 |
end |
| 88 | 138 |
end |
| plugins/redmine_bibliography/app/models/bibtex_entry_type.rb | ||
|---|---|---|
| 1 | 1 |
class BibtexEntryType < ActiveRecord::Base |
| 2 | 2 |
unloadable |
| 3 | 3 |
|
| 4 |
@@fields = Hash['article', ['journal', 'year', 'volume', 'number', 'pages', 'month', 'note' ],
|
|
| 4 |
@@fields = Hash['article', ['journal', 'year', 'volume', 'number', 'pages', 'month', 'note' ], |
|
| 5 | 5 |
'book' , [ 'editor', 'publisher', 'volume', 'series', 'address', 'edition', 'month', 'year', 'note' ], |
| 6 | 6 |
'booklet' , [ 'howpublished', 'address', 'year', 'month', 'note', 'key' ], |
| 7 | 7 |
'conference', [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ], |
| ... | ... | |
| 25 | 25 |
end |
| 26 | 26 |
|
| 27 | 27 |
def self.fields (type) |
| 28 |
@@fields[ self.find(type).name ]
|
|
| 28 |
@@fields[ self.find(type).name ] |
|
| 29 | 29 |
end |
| 30 | 30 |
end |
| plugins/redmine_bibliography/app/views/publications/_authorship_fields.html.erb | ||
|---|---|---|
| 1 | 1 |
<div id="authors" class="fields"> |
| 2 |
<div id="<%= form_tag_id( f.object_name, :search_author ) %>" > |
|
| 3 |
<p> |
|
| 4 |
<%= f.text_field :search_name, :size => 25, :class => "author_search" %> |
|
| 2 |
<div class="author_edit" id="<%= form_tag_id( f.object_name, :edit_author_info ) %>"> |
|
| 3 |
|
|
| 4 |
<p><%= f.label :name_on_paper %><%= f.text_field :name_on_paper, :class => "author_name_on_paper" -%></p> |
|
| 5 |
<p><%= f.label :institution %><%= f.text_field :institution -%></p> |
|
| 6 |
<p><%= f.label :email %><%= f.text_field :email -%></p> |
|
| 7 |
|
|
| 8 |
<p class="author_associated search_author_tie"> |
|
| 9 |
<%= f.check_box :search_author_tie, :label => '' -%> |
|
| 10 |
<span>Not associated with any SoundSoftware site user.</span> |
|
| 5 | 11 |
</p> |
| 6 | 12 |
|
| 7 |
<p style="margin-bottom: -2.5em; padding-bottom; 0"><label><%= l(:identify_author_question) %></label></p> |
|
| 8 |
|
|
| 9 |
<p class="author_identify"> |
|
| 10 |
<label class='inline'><%= radio_button_tag(:identify_author, "yes", false, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_yes )) %> <%= l(:identify_author_yes) %> </label><br /> |
|
| 11 |
|
|
| 12 |
<label class='inline'><%= radio_button_tag(:identify_author, "correct", false, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_corrections )) %> <%= l(:identify_author_correct) %> </label><br /> |
|
| 13 |
|
|
| 14 |
<label class='inline'><%= radio_button_tag(:identify_author, "no", true, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_no )) %> <%= l(:identify_author_no) %> </label><br /> |
|
| 15 |
</p> |
|
| 16 |
</div> |
|
| 17 |
|
|
| 18 |
<div class='author_edit' id="<%= form_tag_id( f.object_name, :edit_author_info ) %>"> |
|
| 19 |
<p><%= f.text_field :name_on_paper -%></p> |
|
| 20 |
<p class="description"><%= h l("text_author_name_on_paper") -%></p>
|
|
| 21 |
|
|
| 22 |
<p><%= f.text_field :institution -%></p> |
|
| 23 |
<p class="description"><%= h l("text_author_institution") %></p>
|
|
| 24 |
|
|
| 25 |
<p><%= f.text_field :email -%></p> |
|
| 26 |
<p class="description"><%= h l("text_author_email") %></p>
|
|
| 27 |
|
|
| 28 |
<%= hidden_field_tag(:search_author_class, '', :name => form_tag_name(f.object_name,:search_author_class ), :id => form_tag_id( f.object_name, :search_author_class )) -%> |
|
| 29 |
<%= hidden_field_tag(:search_author_id, '', :name => form_tag_name(f.object_name,:search_author_id ), :id => form_tag_id( f.object_name, :search_author_id )) -%> |
|
| 13 |
<%= f.hidden_field :search_author_class -%> |
|
| 14 |
<%= f.hidden_field :search_author_id -%> |
|
| 30 | 15 |
</div> |
| 31 | 16 |
|
| 32 | 17 |
<div> |
| 33 | 18 |
<p> |
| 34 | 19 |
<%= button_to_function l(:label_save_author), '', :id => form_tag_id(f.object_name, :edit_save_button), :class => 'author_save_btn' -%> |
| 35 | 20 |
|
| 36 |
<%= button_to_function l(:label_edit_author), '', :id => form_tag_id(f.object_name, :edit_button), :class => 'author_edit_btn' -%> |
|
| 21 |
<%= button_to_function l(:label_edit_author), '', :id => form_tag_id(f.object_name, :edit_button), :class => 'author_edit_btn', :style => "display:none;" -%>
|
|
| 37 | 22 |
|
| 38 | 23 |
<%= link_to_remove_fields l("remove_author"), f %>
|
| 39 | 24 |
</p> |
| 40 | 25 |
</div> |
| 41 |
</div> |
|
| 42 |
|
|
| 26 |
</div> |
|
| plugins/redmine_bibliography/app/views/publications/_bibtex_fields.html.erb | ||
|---|---|---|
| 1 | 1 |
<p> |
| 2 |
<label for="bibtex_entry_type"><%=l("field_entry_type")%> <span class="required">*</span></label>
|
|
| 2 |
<label for="publication_bibtex_entry_attributes_entry_type"><%=l("field_entry_type")%> <span class="required">*</span></label>
|
|
| 3 | 3 |
<%= f.collection_select :entry_type, |
| 4 | 4 |
BibtexEntryType.find(:all).reject { |x| x.redundant? },
|
| 5 | 5 |
:id, |
| ... | ... | |
| 8 | 8 |
</p> |
| 9 | 9 |
|
| 10 | 10 |
<p class="bibtex hol"> |
| 11 |
<%= f.text_field :year, :size => 4 %>
|
|
| 11 |
<%= f.label :year %><%= f.text_field :year, :size => 5 -%>
|
|
| 12 | 12 |
</p> |
| 13 | 13 |
<p class="bibtex hol"> |
| 14 |
<%= f.text_field :month, :size => 4%>
|
|
| 14 |
<%= f.label :month %><%= f.text_field :month, :size => 5 -%>
|
|
| 15 | 15 |
</p> |
| 16 | 16 |
<p class="bibtex hol"> |
| 17 |
<%= f.text_field :chapter, :size => 15%>
|
|
| 17 |
<%= f.label :chapter %><%= f.text_field :chapter, :size => 5 -%>
|
|
| 18 | 18 |
</p> |
| 19 | 19 |
<p class="bibtex hol"> |
| 20 |
<%= f.text_field :editor, :size => 33 %>
|
|
| 20 |
<%= f.label :editor %><%= f.text_field :editor -%>
|
|
| 21 | 21 |
</p> |
| 22 | 22 |
<p class="bibtex hol"> |
| 23 |
<%= f.text_field :booktitle, :size => 33 %>
|
|
| 23 |
<%= f.label :booktitle %><%= f.text_field :booktitle -%>
|
|
| 24 | 24 |
</p> |
| 25 | 25 |
<p class="bibtex hol"> |
| 26 |
<%= f.text_field :publisher,:size => 33 %>
|
|
| 26 |
<%= f.label :publisher %><%= f.text_field :publisher -%>
|
|
| 27 | 27 |
</p> |
| 28 | 28 |
<p class="bibtex hol"> |
| 29 |
<%= f.text_field :pages, :size => 12 %>
|
|
| 29 |
<%= f.label :pages %><%= f.text_field :pages, :size => 5 -%>
|
|
| 30 | 30 |
</p> |
| 31 | 31 |
<p class="bibtex hol"> |
| 32 |
<%= f.text_field :address %>
|
|
| 32 |
<%= f.label :address %><%= f.text_field :address -%>
|
|
| 33 | 33 |
</p> |
| 34 | 34 |
<p class="bibtex hol"> |
| 35 |
<%= f.text_field :annote %>
|
|
| 35 |
<%= f.label :annote %><%= f.text_field :annote -%>
|
|
| 36 | 36 |
</p> |
| 37 | 37 |
<p class="bibtex hol"> |
| 38 |
<%= f.text_field :crossref %>
|
|
| 38 |
<%= f.label :crossref %><%= f.text_field :crossref -%>
|
|
| 39 | 39 |
</p> |
| 40 | 40 |
<p class="bibtex hol"> |
| 41 |
<%= f.text_field :edition %>
|
|
| 41 |
<%= f.label :edition %><%= f.text_field :edition -%>
|
|
| 42 | 42 |
</p> |
| 43 | 43 |
<p class="bibtex hol"> |
| 44 |
<%= f.text_field :eprint %>
|
|
| 44 |
<%= f.label :eprint %><%= f.text_field :eprint -%>
|
|
| 45 | 45 |
</p> |
| 46 | 46 |
<p class="bibtex hol"> |
| 47 |
<%= f.text_field :howpublished %>
|
|
| 47 |
<%= f.label :howpublished %><%= f.text_field :howpublished -%>
|
|
| 48 | 48 |
</p> |
| 49 | 49 |
<p class="bibtex hol"> |
| 50 |
<%= f.text_field :journal %>
|
|
| 50 |
<%= f.label :journal %><%= f.text_field :journal -%>
|
|
| 51 | 51 |
</p> |
| 52 | 52 |
<p class="bibtex hol"> |
| 53 |
<%= f.text_field :key %>
|
|
| 53 |
<%= f.label :key %><%= f.text_field :key -%>
|
|
| 54 | 54 |
</p> |
| 55 | 55 |
<p class="bibtex hol"> |
| 56 |
<%= f.text_field :note %>
|
|
| 56 |
<%= f.label :note %><%= f.text_field :note -%>
|
|
| 57 | 57 |
</p> |
| 58 | 58 |
<p class="bibtex hol"> |
| 59 |
<%= f.text_field :number %>
|
|
| 59 |
<%= f.label :number %><%= f.text_field :number, :size => 5 -%>
|
|
| 60 | 60 |
</p> |
| 61 | 61 |
<p class="bibtex hol"> |
| 62 |
<%= f.text_field :organization %> |
|
| 62 |
<%= f.label :organization %><%= f.text_field :organization %>
|
|
| 63 | 63 |
</p> |
| 64 | 64 |
<p class="bibtex hol"> |
| 65 |
<%= f.text_field :school %> |
|
| 65 |
<%= f.label :school %><%= f.text_field :school %>
|
|
| 66 | 66 |
</p> |
| 67 | 67 |
<p class="bibtex hol"> |
| 68 |
<%= f.text_field :series %> |
|
| 68 |
<%= f.label :series %><%= f.text_field :series %>
|
|
| 69 | 69 |
</p> |
| 70 | 70 |
<p class="bibtex hol"> |
| 71 |
<%= f.text_field :type %> |
|
| 71 |
<%= f.label :type %><%= f.text_field :type %>
|
|
| 72 | 72 |
</p> |
| 73 | 73 |
<p class="bibtex hol"> |
| 74 |
<%= f.text_field :url %> |
|
| 74 |
<%= f.label :url %><%= f.text_field :url %>
|
|
| 75 | 75 |
</p> |
| 76 | 76 |
<p class="bibtex hol"> |
| 77 |
<%= f.text_field :volume %> |
|
| 77 |
<%= f.label :volume %><%= f.text_field :volume %>
|
|
| 78 | 78 |
</p> |
| plugins/redmine_bibliography/app/views/publications/_form.html.erb | ||
|---|---|---|
| 1 |
<h3><%= f.text_field :title, :required => true, :size => 70 %></h3> |
|
| 1 |
<h3><%= f.label :title %> <span class="required">*</span> <%= f.text_field :title, :required => true, :size => 70 %></h3>
|
|
| 2 | 2 |
|
| 3 | 3 |
<div class="splitcontentleft"> |
| 4 | 4 |
<h3><%= l(:label_publication_other_details) %></h3> |
| ... | ... | |
| 8 | 8 |
<%- end -%> |
| 9 | 9 |
|
| 10 | 10 |
<p> |
| 11 |
<%= f.text_field :external_url, :size => 70 %>
|
|
| 11 |
<%= f.label :external_url %><%= f.text_field :external_url -%>
|
|
| 12 | 12 |
<br /> |
| 13 |
<em><%= l(:text_external_url) %></em> |
|
| 13 |
<em><%= l(:text_external_url) -%></em>
|
|
| 14 | 14 |
</p> |
| 15 | 15 |
<p> |
| 16 |
<%= f.text_field :doi, :size => 70 %>
|
|
| 16 |
<%= f.label :doi %><%= f.text_field :doi -%>
|
|
| 17 | 17 |
<br /> |
| 18 | 18 |
<em><%= l(:text_doi) %></em> |
| 19 | 19 |
</p> |
| plugins/redmine_bibliography/app/views/publications/autocomplete_for_author.html.erb | ||
|---|---|---|
| 1 |
<%= raw @results.map {|result| {
|
|
| 1 |
<%= raw @results.map { |result|
|
|
| 2 |
{
|
|
| 2 | 3 |
'label' => result.name, |
| 3 | 4 |
'value' => result.name, |
| 4 | 5 |
'search_author_class' => result.class.name, |
| ... | ... | |
| 6 | 7 |
'name' => result.name, |
| 7 | 8 |
'institution' => result.institution, |
| 8 | 9 |
'email' => result.mail, |
| 10 |
'authorship_link' => " Keep associated with #{render_authorship_link(result.class.name, result.id)}"
|
|
| 9 | 11 |
} |
| 10 | 12 |
}.to_json %> |
| plugins/redmine_bibliography/app/views/publications/edit.html.erb | ||
|---|---|---|
| 16 | 16 |
dataType: 'script' |
| 17 | 17 |
}); return false; });" -%> |
| 18 | 18 |
|
| 19 |
<%= javascript_tag "authorship_autocomplete('#{url_for :controller => :publications, :action => :autocomplete_for_author}');" -%>
|
|
| 20 |
|
|
| 19 | 21 |
<% end %> |
| 20 | 22 |
|
| 21 | 23 |
<%= error_messages_for 'publication' %> |
| 22 | 24 |
|
| 23 | 25 |
<h2><%=l(:label_publication_show)%></h2> |
| 24 | 26 |
|
| 25 |
<%= labelled_form_for @publication, :url => { :project_id => @project, :action => :update } do |f| -%>
|
|
| 27 |
<%= form_for @publication, :url => { :project_id => @project, :action => :update } do |f| -%>
|
|
| 26 | 28 |
|
| 27 | 29 |
<%= render :partial => 'form', :locals => { :f => f } %>
|
| 28 | 30 |
|
| plugins/redmine_bibliography/app/views/publications/new.html.erb | ||
|---|---|---|
| 3 | 3 |
<%= stylesheet_link_tag 'bibliography', :plugin => 'redmine_bibliography' %> |
| 4 | 4 |
<%= javascript_include_tag 'bibliography', :plugin => 'redmine_bibliography' -%> |
| 5 | 5 |
<%= javascript_include_tag 'new_publication', :plugin => 'redmine_bibliography' -%> |
| 6 |
|
|
| 6 | 7 |
<%= javascript_tag " |
| 7 | 8 |
$('#publication_bibtex_entry_attributes_entry_type').live('change', function() {
|
| 8 | 9 |
$this = $(this); |
| ... | ... | |
| 17 | 18 |
return false; |
| 18 | 19 |
});"-%> |
| 19 | 20 |
|
| 21 |
<%= javascript_tag "authorship_autocomplete('#{url_for :controller => :publications, :action => :autocomplete_for_author}');" -%>
|
|
| 22 |
|
|
| 20 | 23 |
<% end %> |
| 21 | 24 |
|
| 22 | 25 |
<%= error_messages_for 'publication' %> |
| 23 | 26 |
|
| 24 | 27 |
<h2><%=l(:label_publication_new)%></h2> |
| 25 | 28 |
|
| 26 |
<%= labelled_form_for @publication, :url => { :project_id => @project, :action => :create } do |f| -%>
|
|
| 29 |
<%= form_for @publication, :url => { :project_id => @project, :action => :create } do |f| -%>
|
|
| 27 | 30 |
|
| 28 | 31 |
<%= render :partial => 'form', :locals => { :f => f } %>
|
| 29 | 32 |
|
| plugins/redmine_bibliography/assets/javascripts/authors.js | ||
|---|---|---|
| 10 | 10 |
$(link).closest(".fields").hide();
|
| 11 | 11 |
} |
| 12 | 12 |
|
| 13 |
$(".author_search").live('keyup.autocomplete', function(){
|
|
| 14 |
$this = $(this); |
|
| 13 |
function authorship_autocomplete(url){
|
|
| 14 |
$(".author_name_on_paper").live('keyup.autocomplete', function(){
|
|
| 15 |
$this = $(this); |
|
| 15 | 16 |
|
| 16 |
$this.autocomplete({
|
|
| 17 |
source: '/publications/autocomplete_for_author', |
|
| 18 |
minLength: 2, |
|
| 19 |
focus: function(event, ui) {
|
|
| 20 |
$this.val(ui.item.label); |
|
| 21 |
return false; |
|
| 22 |
}, |
|
| 23 |
select: function(event, ui){
|
|
| 24 |
$this.closest('div').next().find("input[id$='name_on_paper']").val(ui.item.name);
|
|
| 25 |
$this.closest('div').next().find("input[id$='institution']").val(ui.item.institution);
|
|
| 26 |
$this.closest('div').next().find("input[id$='email']").val(ui.item.email);
|
|
| 27 |
$this.closest('div').next().find("input[id$='search_author_class']").val(ui.item.search_author_class);
|
|
| 28 |
$this.closest('div').next().find("input[id$='search_author_id']").val(ui.item.search_author_id);
|
|
| 29 |
} |
|
| 30 |
}) |
|
| 31 |
.data( "autocomplete" )._renderItem = function( ul, item ) {
|
|
| 32 |
return $( "<li>" ) |
|
| 33 |
.data("item.autocomplete", item )
|
|
| 34 |
.append( "<a>" + item.label + "<br><em>" + item.email + "</em><br>" + item.intitution + "</a>" ) |
|
| 35 |
.appendTo(ul); |
|
| 36 |
}; |
|
| 37 |
}); |
|
| 17 |
$this.autocomplete({
|
|
| 18 |
source: url, |
|
| 19 |
minLength: 2, |
|
| 20 |
focus: function(event, ui) {
|
|
| 21 |
$this.val(ui.item.label); |
|
| 22 |
return false; |
|
| 23 |
}, |
|
| 24 |
select: function(event, ui){
|
|
| 25 |
$this.closest('div').find("input[id$='institution']").val(ui.item.institution);
|
|
| 26 |
$this.closest('div').find("input[id$='email']").val(ui.item.email);
|
|
| 38 | 27 |
|
| 28 |
$this.closest('div').find("input[id$='search_author_class']").val(ui.item. search_author_class);
|
|
| 29 |
$this.closest('div').find("input[id$='search_author_id']").val(ui.item. search_author_id);
|
|
| 39 | 30 |
|
| 40 |
$("input[id$='identify_author_yes']").live("click", function() {
|
|
| 41 |
console.log("aaaa");
|
|
| 42 |
}); |
|
| 31 |
$this.closest('div').find("input[id$='search_author_tie']").attr('checked', ' checked');
|
|
| 32 |
$this.closest('div').find("input[id$='search_author_tie']").next('span'). replaceWith(ui.item.authorship_link);
|
|
| 43 | 33 |
|
| 44 |
$("input[id$='identify_author_no']").live("click", function() {
|
|
| 45 |
$this.closest('div').next().find("input[id$='name_on_paper']").val('');
|
|
| 46 |
$this.closest('div').next().find("input[id$='institution']").val('');
|
|
| 47 |
$this.closest('div').next().find("input[id$='email']").val('');
|
|
| 48 |
$this.closest('div').next().find("input[id$='search_author_class']").val('');
|
|
| 49 |
}); |
|
| 50 |
|
|
| 34 |
// triggers the save button |
|
| 35 |
$this.closest('div').next('div').find('.author_save_btn').click();
|
|
| 36 |
} |
|
| 37 |
}) |
|
| 38 |
.data( "autocomplete" )._renderItem = function( ul, item ) {
|
|
| 39 |
return $( "<li>" ) |
|
| 40 |
.data("item.autocomplete", item )
|
|
| 41 |
.append( "<a>" + item.label + "<br><em>" + item.email + "</em><br>" + item. institution + "</a>" ) |
|
| 42 |
.appendTo(ul); |
|
| 43 |
}; |
|
| 44 |
}); |
|
| 45 |
} |
|
| plugins/redmine_bibliography/assets/javascripts/bibliography.js | ||
|---|---|---|
| 2 | 2 |
|
| 3 | 3 |
function disable_fields(){
|
| 4 | 4 |
$this = $(this); |
| 5 |
|
|
| 5 | 6 |
$author_info = $this.closest('div').prev();
|
| 6 |
$author_info.children('.description').toggle();
|
|
| 7 |
// $author_info.children('.description').toggle();
|
|
| 7 | 8 |
$author_info.find('p :input').attr("readonly", true);
|
| 8 | 9 |
$author_info.find('p :input').addClass('readonly');
|
| 9 | 10 |
|
| 11 |
// Always hides on save |
|
| 12 |
$this.closest('div').prev().find('p.search_author_tie').hide();
|
|
| 13 |
|
|
| 10 | 14 |
$this.siblings('.author_edit_btn').show();
|
| 11 | 15 |
$this.hide(); |
| 12 | 16 |
|
| ... | ... | |
| 15 | 19 |
|
| 16 | 20 |
function enable_fields(){
|
| 17 | 21 |
$this = $(this); |
| 22 |
|
|
| 18 | 23 |
$author_info = $this.closest('div').prev();
|
| 19 |
$author_info.children('.description').toggle();
|
|
| 24 |
// $author_info.children('.description').toggle();
|
|
| 20 | 25 |
$author_info.find('p :input').attr("readonly", false);
|
| 21 | 26 |
$author_info.find('p :input').removeClass('readonly');
|
| 22 | 27 |
|
| 28 |
// Always shows on edit |
|
| 29 |
$this.closest('div').prev().find('p.search_author_tie').show();
|
|
| 30 |
|
|
| 23 | 31 |
$this.siblings('.author_save_btn').show();
|
| 24 | 32 |
$this.hide(); |
| 25 | 33 |
|
| 26 | 34 |
return false; |
| 27 | 35 |
} |
| 36 |
|
|
| plugins/redmine_bibliography/assets/javascripts/new_publication.js | ||
|---|---|---|
| 4 | 4 |
// adds the events to the edit/save authorship button |
| 5 | 5 |
$('.author_save_btn').live('click', disable_fields);
|
| 6 | 6 |
$('.author_edit_btn').live('click', enable_fields);
|
| 7 |
|
|
| 8 |
|
|
| 7 | 9 |
}); |
| plugins/redmine_bibliography/assets/stylesheets/bibliography.css | ||
|---|---|---|
| 20 | 20 |
} |
| 21 | 21 |
|
| 22 | 22 |
.tabular .author_edit .description {
|
| 23 |
padding-top: 0; |
|
| 24 | 23 |
font-style: italic; |
| 24 |
font-size: small; |
|
| 25 | 25 |
} |
| 26 | 26 |
|
| 27 | 27 |
.publication_project {
|
| 28 | 28 |
margin-right: 18px; |
| 29 | 29 |
} |
| 30 | 30 |
|
| 31 |
#authors select {
|
|
| 32 |
min-width: 150px; |
|
| 33 |
} |
|
| 34 |
|
|
| 35 |
|
|
| 36 | 31 |
div#bibliography dd { margin-bottom: 1em; font-size: 0.9em; }
|
| 37 | 32 |
|
| 38 | 33 |
div#bibliography dd .authors { font-style: italic; }
|
| ... | ... | |
| 71 | 66 |
background-image: url(../../../images/loading.gif); |
| 72 | 67 |
} |
| 73 | 68 |
|
| 74 |
.author_edit_btn {
|
|
| 75 |
display:none; |
|
| 69 |
.search_author_tie {
|
|
| 70 |
display: none; |
|
| 71 |
float: left; |
|
| 76 | 72 |
} |
| 77 | 73 |
|
| 74 |
.author_edit_btn {
|
|
| 75 |
display: none; |
|
| 76 |
} |
|
Also available in: Unified diff