# encoding: utf-8 # # Redmine - project management software # Copyright (C) 2006-2013 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. module WatchersHelper def watcher_tag(object, user, options={}) ActiveSupport::Deprecation.warn "#watcher_tag is deprecated and will be removed in Redmine 3.0. Use #watcher_link instead." watcher_link(object, user) end ###################modified by liuping, nyan def watcher_link(objects, user, options=[]) return '' unless user && user.logged? objects = Array.wrap(objects) watched = objects.any? {|object| object.watched_by?(user)} @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or objects.first.instance_of?(Contest) or (objects.first.instance_of?(Bid))) css = @watch_flag ? ([watcher_css(objects), watched ? 'icon ' : 'icon '].join(' ') << options[0].to_s) : ([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s) text = @watch_flag ? (watched ? l(:button_unfollow) : l(:button_follow)) : (watched ? l(:button_unwatch) : l(:button_watch)) url = watch_path( :object_type => objects.first.class.to_s.underscore, :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) ) method = watched ? 'delete' : 'post' link_to text, url, :remote => true, :method => method, :class => css end def watcher_link_issue(objects, user, options=[]) return '' unless user && user.logged? objects = Array.wrap(objects) watched = objects.any? {|object| object.watched_by?(user)} @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or objects.first.instance_of?(Contest) or (objects.first.instance_of?(Bid))) css = @watch_flag ? ([watcher_css(objects), watched ? 'talk_edit ' : 'talk_edit '].join(' ') << options[0].to_s) : ([watcher_css(objects), watched ? 'talk_edit fr ' : 'talk_edit fr '].join(' ') << options[0].to_s) text = @watch_flag ? (watched ? l(:button_unfollow) : l(:button_follow)) : (watched ? l(:button_unwatch) : l(:button_watch)) url = watch_path( :object_type => objects.first.class.to_s.underscore, :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) ) method = watched ? 'delete' : 'post' link_to text, url, :remote => true, :method => method, :class => css end def watcher_link_with_id(objects, user, options=[]) return '' unless user && user.logged? objects = Array.wrap(objects) watched = objects.any? {|object| object.watched_by?(user)} @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or objects.first.instance_of?(Contest) or (objects.first.instance_of?(Bid))) css = options[:class] text = @watch_flag ? (watched ? l(:button_unfollow) : l(:button_follow)) : (watched ? l(:button_unwatch) : l(:button_watch)) url = watch_path( :object_type => objects.first.class.to_s.underscore, :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) ) method = watched ? 'delete' : 'post' link_to text, url, :remote => true, :method => method, :class => css,:id=>options[:id] end ############## added by linchun def new_watcher_link(objects, user, options=[]) return '' unless user && user.logged? objects = Array.wrap(objects) watched = objects.any? {|object| object.watched_by?(user)} @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or (objects.first.instance_of?(Contest))) css = @watch_flag ? ([watcher_css(objects), watched ? 'icon ' : 'icon '].join(' ') << options[0].to_s) : ([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s) text = @watch_flag ? (watched ? l(:button_unfollow) : l(:button_follow)) : (watched ? l(:button_unwatch) : l(:button_watch)) url = watch_path( :object_type => objects.first.class.to_s.underscore, :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) ) method = watched ? 'delete' : 'post' link_to text, url, :remote => true, :method => method, :class => css, :onclick => "location.reload()" end # add by nwb # 关注课程 def new_course_watcher_link(objects, user, options=[]) return '' unless user && user.logged? objects = Array.wrap(objects) watched = objects.any? {|object| object.watched_by?(user)} @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or (objects.first.instance_of?(Contest))) css = @watch_flag ? ([watcher_css(objects), watched ? 'icon ' : 'icon '].join(' ') << options[0].to_s) : ([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s) text = @watch_flag ? (watched ? l(:button_unfollow) : l(:button_follow)) : (watched ? l(:button_unwatch) : l(:button_watch)) url = watch_path( :object_type => objects.first.class.to_s.underscore, :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) ) method = watched ? 'delete' : 'post' link_to text, url, :remote => true, :method => method, :class => css end # added by fq, modify nyan # Somebody may use option params def join_in_course(course, user, options=[]) return '' unless user && user.logged? # modify by nwb # 主讲教师不允许退出课程 return '' if user.id == course.tea_id joined = course.members.map{|m| m.user}.include? user text = joined ? l(:label_exit_course) : l(:label_new_join) url = joined ? join_path(:object_id => course.id) : try_join_path(:object_id => course.id) method = joined ? 'delete' : 'post' if joined link_to text, url, :remote => true, :method => method, :id => "#{course.id}", :confirm => l(:text_are_you_sure_out), :class => []+options else link_to text, url, :remote => true, :method => method, :id => "#{course.id}", :class => []+options end end def join_in_course_group(course, group, user, options=[]) return '' unless user && user.logged? && user.member_of_course?(course) joined = user.member_of_course_group?(group) unless joined text = l(:label_join_group) form_tag({:controller => "courses", :action => "join_group", :object_id => "#{group.id}"},:id => 'join_coursegroup_form', :method => 'post') do link_to text, 'javascript:void(0)', :class => 'sy_btn_green fl mr10', :onclick => "$('#join_coursegroup_form').submit();" end end end # 用户是否允许加入课程判断 # add by nwb def join_in_course_for_list(course, user, options=[]) return '' unless user && user.logged? # modify by nwb # 主讲教师不允许退出课程 return '' if user.id == course.tea_id joined = user.member_of_course?(course) text = joined ? l(:label_exit_course) : l(:label_join_course) url_t = join_path(:object_id => course.id) url_f = try_join_path(:object_id => course.id) method = joined ? 'delete' : 'post' if joined link_to text, url_t, :remote => true, :method => method, :id => "#{course.id}", :confirm => l(:text_are_you_sure_out), :class => []+options else link_to text, url_f, :remote => true, :method => method, :id => "#{course.id}", :class => []+options end end #added by bai def join_in_contest(bid, user, options=[]) if bid.reward_type == 2 return '' unless user && user.logged? joined = user.join_in_contest?(bid) text = joined ? l(:label_exit_contest) : l(:label_join_contest) url_t = join_in_contest_path(:id => bid.id) url_f = try_join_in_contest_path(:id => bid.id) # url = join_in_contest_path(:id => bid.id) method = joined ? 'delete' : 'post' if joined link_to text, url_t, :remote => true, :method => method, :id => "#{bid.id}", :confirm => l(:text_are_you_sure_out), :class => []+options else link_to text, url_f, :remote => true, :method => method, :id => "#{bid.id}", :class => []+options end end end ##new add by linchun def join_in_contest(contest, user, options=[]) return '' unless user && user.logged? joined = user.join_in_contest?(contest) text = joined ? l(:label_exit_contest) : l(:label_join_contest) url_t = join_in_contest_path(:id => contest.id) url_f = try_join_in_contest_path(:id => contest.id) # url = join_in_contest_path(:id => contest.id) method = joined ? 'delete' : 'post' if joined link_to text, url_t, :remote => true, :method => method, :id => "#{contest.id}", :confirm => l(:text_are_you_sure_out), :class => []+options else link_to text, url_f, :remote => true, :method => method, :id => "#{contest.id}", :class => []+options end end # liuwanwei 的需求, 新竞赛 # 新路由命名为 competition def join_in_competition(competition, user) return '' unless user && user.logged? joined = JoinInCompetition.where('competition_id = ? AND user_id = ?', competition.id, user.id).count>0 text = joined ? l(:label_exit_contest) : l(:label_join_contest) url_f = new_join_contests_path(:id => competition.id) url_t = unjoin_in_contest_contests_path(:id => competition.id) method = joined ? 'delete' : 'post' if joined # 退出竞赛用 link_to text, url_t, :remote => true, :method => method, :id => "#{competition.id}", :confirm => l(:text_are_you_sure_out) else # 加入竞赛用 link_to text, url_f, :remote => true, :method => method, :id => "#{competition.id}" end end # Returns the css class used to identify watch links for a given +object+ def watcher_css(objects) objects = Array.wrap(objects) id = (objects.size == 1 ? objects.first.id : 'bulk') "#{objects.first.class.to_s.underscore}-#{id}-watcher" end # Returns a comma separated list of users watching the given object def watchers_list(object) remove_allowed = User.current.allowed_to?("delete_#{object.class.name.underscore}_watchers".to_sym, object.project) content = ''.html_safe lis = object.watcher_users.collect do |user| s = ''.html_safe s << avatar(user, :size => "16").to_s s << link_to_user(user, :class => 'user') if remove_allowed url = {:controller => 'watchers', :action => 'destroy', :object_type => object.class.to_s.underscore, :object_id => object.id, :user_id => user} s << ' ' s << link_to(image_tag('delete.png'), url, :remote => true, :method => 'delete', :class => "delete") end content << content_tag('li', s, :class => "user-#{user.id}") end content.present? ? content_tag('ul', content, :class => 'watchers') : content end #用户关注、取消关注 def watcher_link_for_user(target, user, type=0, className="") return '' unless user && user.logged? watched = target.watched_by?(user) text = watched ? '取消关注' : '关注' if type == 0 url = watched ? unwatch_path(:object_type => 'user', :object_id => target.id, :target_id => target.id, :className => className) : watch_path(:object_type => 'user', :object_id => target.id, :target_id => target.id, :className => className) else url = watched ? unwatch_path(:object_type => 'user', :object_id => target.id, :target_id => target.id, :search => 1) : watch_path(:object_type => 'user', :object_id => target.id, :target_id => target.id, :search => 1) end method = watched ? 'post' : 'post' id = watched ? 'cancel_watch' : '' title = watched ? '取消关注' : '关注' if target != user if type == 0 link_to text, url, :remote => true, :method => method, :class => className,:id => id, :title => title else link_to text, url, :remote => true, :method => method, :class => "white-btn orange-btn focus-on",:id => "cancel_watch_#{target.id}", :title => title end else link_to "关注", "javascript:void(0)", :remote => true, :method => method, :class => "user_default_btn user_watch user_private_btn fl mr20", :id => id end end # 缺陷跟踪者列表复选框生成 def watchers_checkboxes(object, users, checked=nil) if users.nil? else # tag = check_box_tag 'issue[watcher_user_ids][]', user.id, c, :id => nil # content_tag 'label', "#{tag} #{h(user)}".html_safe, # :id => "issue_watcher_user_ids_#{user.id}", # :class => "floating" users.map do |user| c = checked.nil? ? object.watched_by?(user) : checked s = content_tag(:ul, content_tag(:li, "#{check_box_tag 'issue[watcher_user_ids][]', user.id, c, :id => nil } #{h link_to user.userInfo, user_path( user.id)}".html_safe, :id=>"issue_watcher_user_ids_#{user.id}",:style=>"float: left;width: 175px;margin: 0px 20px 10px 0px; overflow: hidden; line-height:1.6em;" ), :class => "mb10 ml80") end.join.html_safe # scope = users.sort # watchers = paginateHelper scope,10 # s = content_tag('ul', issue_watcher_check_box_tags_ex('issue[watcher_user_ids][]', watchers), :class => 'mb10 ml80') # links = pagination_links_full(@obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true){|text, parameters, options| # link_to text, watchers_autocomplete_for_user_path(@users, parameters.merge(:q => params[:q],:format => 'js',:flag => 'ture')), :remote => true # } # s + content_tag('ul', links,:class => 'wlist', :style =>"float:left;margin-top:0px;") end end def applied_css(project) id = project.id "#{project.class.to_s.underscore}-#{id}-applied" end def applied_link(project, user, options=[]) return '' unless user && user.logged? applied = project.applied_projects.find_by_user_id(user.id) text = applied ? l(:label_unapply_project) : l(:label_apply_project) @applied_flag = project.instance_of?(Project) css = @applied_flag ? ([applied_css(project), applied ? 'icon ' : 'icon '].join(' ') << options[0].to_s) : ([applied_css(project), applied ? 'icon icon-applied ' : 'icon icon-applied-off '].join(' ') << options[0].to_s) if applied appliedid = applied.id end url = appliedproject_path( :id=>appliedid, :user_id => user.id, :project_id => project.id ) method = applied ? 'delete' : 'post' link_to text, url, :remote => true, :method => method , :class => css end def exit_project_link(project) link_to(l(:label_exit_project),exit_cur_project_path(project.id), :remote => true, :confirm => l(:lable_sure_exit_project), :class => "pro_new_topbtn_left fl" ) end #项目关注、取消关注 #REDO:项目样式确定后方法需要对CSS变量进行改进 def watcher_link_for_project(objects, user, options=[]) return '' unless user && user.logged? objects = Array.wrap(objects) watched = objects.any? {|object| object.watched_by?(user)} watched = true if user.id == @project.user_id @watch_flag = objects.first.instance_of?(Project) id = watcher_css(objects) text = @watch_flag ? (watched ? l(:button_unfollow) : l(:label_button_following)) : (watched ? l(:button_unwatch) : l(:label_button_following)) url = watch_path(:object_type => objects.first.class.to_s.underscore, :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort)) method = watched ? 'delete' : 'post' if user.id != @project.user_id link_to text, url, :remote => true, :method => method, :class => "pro_new_topbtn_left fl" ,:id => id else link_to "关注", "javascript:void(0)", :remote => true, :method => method, :class => "pro_new_grey_topbtn_left fl" , :id => id end end def store_project_link project_id, user_id collected = Member.where(:project_id => project_id, :user_id => user_id).first.try(:is_collect) text = collected == 1 ? l(:label_project_collect_cancel) : l(:label_project_collect) url = store_mine_project_path(project_id) method = 'post' link = link_to(text, url, :remote => true, :method => method, :id => "#{project_id}", :class => "pro_new_topbtn_left fl", :title => "#{collected == 1 ? '点击将其从左侧导航的项目列表中移除' : '点击将其添加至左侧导航的项目列表中'}") # link.html_safe end # 申请加入项目 def join_in_project_link(project, user, options=[]) applied = project.applied_projects.find_by_user_id(user.id) text = applied && applied.try(:status) != 2 ? l(:label_unapply_project) : l(:label_apply_project) url = applied_join_project_path(:object_id => project.id) method = 'post' @applied_flag = project.instance_of?(Project) if applied link = "#{text}" else link = link_to(text, url, :remote => true, :method => method, :id => "#{project.id}", :class => "task-btn-orange shixun-task-btn fl") end link.html_safe # if applied # appliedid = applied.id # end # id = applied_css(project) # url = appliedproject_path( # :id=>appliedid, # :user_id => user.id, # :project_id => project.id) # method = applied ? 'delete' : 'post' # link_to text, url, :remote => true, :method => method , :class => "pr_join_a",:id => id end def paginateHelper obj, pre_size=20 @obj_count = obj.count @obj_pages = Redmine::Pagination::Paginator.new @obj_count, pre_size, params['page'] if obj.kind_of? ActiveRecord::Base or obj.kind_of? ActiveRecord::Relation obj.limit(@obj_pages.per_page).offset(@obj_pages.offset) elsif obj.kind_of? Array obj[@obj_pages.offset, @obj_pages.per_page] else logger.error "[ApplicationController] Error : application_controller#paginateHelper ===> unknow category: #{obj.class}" raise RuntimeError, 'unknow type, Please input you type into this helper.' end end end