This commit is contained in:
z9hang 2015-03-07 15:36:16 +08:00
commit 0f2ded4d25
29 changed files with 812 additions and 501 deletions

View File

@ -22,7 +22,7 @@ gem 'spreadsheet'
gem 'ruby-ole' gem 'ruby-ole'
#gem 'email_verifier', path: 'lib/email_verifier' #gem 'email_verifier', path: 'lib/email_verifier'
gem 'rufus-scheduler' gem 'rufus-scheduler'
gem 'dalli', path: 'lib/dalli-2.7.2' #gem 'dalli', path: 'lib/dalli-2.7.2'
group :development do group :development do
gem 'grape-swagger' gem 'grape-swagger'
gem 'grape-swagger-ui', git: 'https://github.com/guange2015/grape-swagger-ui.git' gem 'grape-swagger-ui', git: 'https://github.com/guange2015/grape-swagger-ui.git'

View File

@ -249,7 +249,7 @@ class ProjectsController < ApplicationController
# Author lizanle # Author lizanle
# Description 项目动态展示方法,删除了不必要的代码 # Description 项目动态展示方法,删除了不必要的代码
def show def show
=begin
# 试图跳转到请求的按钮 # 试图跳转到请求的按钮
if params[:login] if params[:login]
login = params[:login] login = params[:login]
@ -265,7 +265,7 @@ class ProjectsController < ApplicationController
if params[:jump] && redirect_to_project_menu_item(@project, params[:jump]) if params[:jump] && redirect_to_project_menu_item(@project, params[:jump])
return return
end end
=begin
cond = @project.project_condition(Setting.display_subprojects_issues?) cond = @project.project_condition(Setting.display_subprojects_issues?)
has = { has = {
"show_issues" => true , "show_issues" => true ,
@ -332,18 +332,23 @@ class ProjectsController < ApplicationController
@wiki ||= @project.wiki @wiki ||= @project.wiki
end end
def send_mail_to_member
unless params[:mail].nil?
email = params[:mail]
Mailer.send_invite_in_project(email, @project, User.current).deliver
end
end
#发送邮件邀请新用户 #发送邮件邀请新用户
def invite_members_by_mail def invite_members_by_mail
respond_to do |format|
format.html
format.js
end
end end
# 邀请Trustie注册用户 # 邀请Trustie注册用户
def invite_members_had_loged def invite_members
@member ||= @project.members.new @member ||= @project.members.new
respond_to do |format|
format.js
end
end end
def edit def edit

View File

@ -442,16 +442,24 @@ class UsersController < ApplicationController
watcher.push(User.current) watcher.push(User.current)
activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc') activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc')
else else
activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc') activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc')
end end
activity = activity.reject { |e|
!User.current.admin? &&
(((e.act_type == "Issue") && !e.act.project.visible?(User.current)) ||
(e.act_type == "Bid" && e.act.courses.first.is_public == 0 && !User.current.member_of_course?(e.act.courses.first)) ||
(e.act_type == "Journal" && e.act.respond_to?("Project") && !e.act.project.visible?(User.current)) ||
(e.act_type == "News" && ((!e.act.project.nil? && !e.act.project.visible?(User.current)) || (!e.act.course.nil? && e.act.course.is_public == 0 && !User.current.member_of_course?(e.act.course)))) ||
(e.act_type == "Message" && !e.act.board.nil? && ((!e.act.board.project.nil? && !e.act.board.project.visible?(User.current)) || (!e.act.board.course.nil? && e.act.board.course.is_public == 0 && !User.current.member_of_course?(e.act.board.course)))))
}
@activity_count = activity.count @activity_count = activity.count
@activity_pages = Paginator.new @activity_count, pre_count, params['page'] @activity_pages = Paginator.new @activity_count, pre_count, params['page']
@activity = activity.slice(@activity_pages.offset,@activity_pages.per_page ) @activity = activity.slice(@activity_pages.offset,@activity_pages.per_page)
@activity = @activity.reject { |e| # @activity = @activity.reject { |e|
((e.act_type=="Issue") && ( !e.act.visible?(User.current))) || # ((e.act_type=="Issue") && ( !e.act.visible?(User.current))) ||
((e.act_type == "Journal") && (!e.act.project.visible?(User.current))) || # ((e.act_type == "Journal") && (!e.act.project.visible?(User.current))) ||
((e.act_type == "Bid") && ((!User.current.member_of_course?(e.act.courses.first) || !User.current.admin?))) # ((e.act_type == "Bid") && ((!User.current.member_of_course?(e.act.courses.first) || !User.current.admin?)))
} # }
@state = 0 @state = 0
end end

View File

@ -31,7 +31,7 @@ module WatchersHelper
watched = objects.any? {|object| object.watched_by?(user)} 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))) @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) : 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) ([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s)
text = @watch_flag ? text = @watch_flag ?
@ -283,6 +283,6 @@ module WatchersHelper
def exit_project_link(project) def exit_project_link(project)
link_to(l(:label_exit_project),exit_cur_project_path(project.id), link_to(l(:label_exit_project),exit_cur_project_path(project.id),
:remote => true, :confirm => l(:lable_sure_exit_project), :style => "color: #fff; display:block; padding: 0px 5px;margin-right:10px;height:20px;text-aligh:center;" ) :remote => true, :confirm => l(:lable_sure_exit_project), :style => "color: #fff; display:block; padding: 0px 5px;margin-right:10px;height:22px;background:none repeat scroll 0% 0% #64BDD9;TES" )
end end
end end

View File

@ -31,10 +31,11 @@ class Mailer < ActionMailer::Base
# 发送邀请未注册用户加入项目邮件 # 发送邀请未注册用户加入项目邮件
# 功能: 在加入项目的同时自动注册用户 # 功能: 在加入项目的同时自动注册用户
def send_invite_in_project(email, project, invitor) def send_invite_in_project(email, project, invitor)
@email = email
@subject = "#{invitor.name} #{l(:label_invite_project)} #{project.name} " @subject = "#{invitor.name} #{l(:label_invite_project)} #{project.name} "
password = newpass(6) @password = newpass(6)
@project_url = url_for(:controller => 'projects', :action => 'show', :id => project.id, @project_url = url_for(:controller => 'projects', :action => 'show', :id => project.id,
:password => password, :login => email) :password => @password, :login => email)
mail :to => email, :subject => @subject mail :to => email, :subject => @subject
end end

View File

@ -9,9 +9,8 @@
</script> </script>
<div id="add-message" class="add_frame" style="display:none;"> <div id="add-message" class="add_frame" style="display:none;">
<% if User.current.logged? %> <% if User.current.logged? %>
s <div class="project_r_h">
<div class="add_frame_header"> <h2 class="project_h2"><%= l(:label_message_new) %></h2>
<%= l(:label_message_new) %>
</div> </div>
<%= form_for @message, :url => new_board_message_path(@board), :html => {:multipart => true, :id => 'message-form'} do |f| %> <%= form_for @message, :url => new_board_message_path(@board), :html => {:multipart => true, :id => 'message-form'} do |f| %>
<%= render :partial => 'messages/form', :locals => {:f => f} %> <%= render :partial => 'messages/form', :locals => {:f => f} %>
@ -46,7 +45,7 @@
<%= link_to @topic_count,:controller => 'boards',:action => 'index' %> <%= link_to @topic_count,:controller => 'boards',:action => 'index' %>
个贴子 个贴子
</span> </span>
<% if @project.enabled_modules.where("name = 'boards'").count > 0 %> <% if @project.enabled_modules.where("name = 'boards'").count > 0 && User.current.member_of?(@project) %>
<span> <span>
<%= link_to l(:label_message_new), <%= link_to l(:label_message_new),
new_board_message_path(@board), new_board_message_path(@board),

View File

@ -1,250 +0,0 @@
<!-- <h3> --><!-- %=l(:label_attachment_plural)%></h3 -->
<div id="resource_list">
<% if @isproject %>
<%= render :partial => 'project_file', locals: {project: @project} %>
<% else %>
<%= render :partial => 'course_file', locals: {course: @course} %>
<% end %>
</div>
<script type='text/javascript'>
var slideHeight = 29;
function readmore(aNode) {
// console.log(aNode)
// var $td_tags_area = $(aNode).parent().parent();
var $td_tags_area = $(aNode).parent().parent().parent().parent();
var $tags_area = $td_tags_area.find('.tags_area')
var $tags_gradint = $td_tags_area.find('.tags_gradint')
var $read_more = $td_tags_area.find('.read-more')
var $read_more_a = $td_tags_area.find('.read-more a')
var $tags = $td_tags_area.find('#tags')
var $icona = $td_tags_area.find('.tags_icona')
var slideHeight = 13; //px
var defHeight = $tags.height();
var curHeight = $tags_area.height();
if (curHeight == slideHeight) {
$tags_area.animate({
height: defHeight
}, 'normal');
$read_more_a.html('隐藏');
$icona.html('<%=image_tag "/images/sidebar/minus.png"%>')
$tags_gradint.fadeOut();
} else {
$tags_area.animate({
height: slideHeight
}, 'normal');
$read_more_a.html('更多');
$icona.html('<%=image_tag "/images/sidebar/add.png"%>')
$tags_gradint.fadeIn();
}
;
}
$(function () {
var slideHeight = 20; //px
var defHeight = $('.tags_area').height();
if (defHeight >= slideHeight) {
$('.tags_area').css('height', slideHeight + 'px');
}
;
});
function eval_ajax(xhr, textStatus) {
if (textStatus == 'success') {
eval(xhr.responseText);
} else if (textStatus == 'error') {
alert('error');
}
}
function attachment_contenttypes_searchex(value) {
<% if @project%>
$.ajax({
url: '<%=getattachtype_project_files_path(project_id: @project)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: encodeURIComponent(value)
}
}).complete(eval_ajax);
<%end%>
}
function attachtype_edit(value) {
<% if @project%>
$.ajax({
url: '<%=getattachtype_project_files_path(project_id: @project)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: encodeURIComponent(value)
}
}).complete(eval_ajax);
<%end%>
}
function attachmenttypes_searchex(value) {
<% if @project%>
$.ajax({
url: '<%=getattachtype_project_files_path(project_id: @project)%>',
type: "POST",
data: {
type: encodeURIComponent(value),
contentType: $('#attach_sufix_browse').val()
}
}).complete(eval_ajax);
<%end%>
}
function course_attachmenttypes_searchex(value) {
<% if @course%>
$.ajax({
url: '<%=getattachtype_course_files_path(course_id: @course)%>',
type: "POST",
data: {
type: encodeURIComponent(value),
contentType: $('#attach_sufix_browse').val()
}
}).complete(eval_ajax);
<%end%>
}
function course_attachment_contenttypes_searchex(value) {
<% if @course%>
$.ajax({
url: '<%=getattachtype_course_files_path(course_id: @course)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: encodeURIComponent(value)
}
}).complete(eval_ajax);
<%end%>
}
function course_attachtype_edit(value) {
<% if @course%>
$.ajax({
url: '<%=getattachtype_course_files_path(course_id: @course)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: encodeURIComponent(value)
}
}).complete(eval_ajax);
<%end%>
}
function attachmenttypes_change(id, type) {
<% if @project%>
$.ajax({
url: '<%=updateType_attachments_path%>',
type: "POST",
data: {
attachmentid: encodeURIComponent(id),
newtype: encodeURIComponent(type)
}
}).complete(function (xhr, textStatus) {
if (textStatus == 'success') {
$.ajax({
url: '<%=getattachtype_project_files_path(project_id: @project)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: $('#attach_sufix_browse').val()
}
}).error(function () {
alert('error');
});
} else if (textStatus == 'error') {
alert('An error has occurred');
}
});
<%end%>
}
function course_attachmenttypes_change(id, type) {
<% if @course%>
$.ajax({
url: '<%=updateType_attachments_path%>',
type: "POST",
data: {
attachmentid: encodeURIComponent(id),
newtype: encodeURIComponent(type)
}
}).complete(function (xhr, textStatus) {
if (textStatus == 'success') {
$.ajax({
url: '<%=getattachtype_course_files_path(course_id: @course)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: $('#attach_sufix_browse').val()
}
}).error(function () {
alert('error');
});
} else if (textStatus == 'error') {
alert('An error has occurred');
}
});
<%end%>
}
// 编辑文件密级
function file_dense_edit(id, type) {
$.ajax({
url: '<%=updateFileDense_attachments_path%>',
type: "POST",
remote:"true",
data: {
attachmentid: encodeURIComponent(id),
newtype: encodeURIComponent(type)
}
}).complete(function (xhr, textStatus) {
});
}
</script>
<script type='text/javascript'>
function tagAddClick(divid, objId, objTag) {
alert("OK");
$.ajax({
type: "POST",
url: '/users/tag_saveEx',
data: {
tagname: $('tag_name').value,
obj_id: encodeURIComponent(objId),
obj_flag: encodeURIComponent(objTag)
},
success: function (data, textStatus) {
alert("OK");
$(divid).empty();
$(divid).html('123');
$("#" + divid + " #name").val("");
}
})
}
</script>

View File

@ -1 +1,249 @@
<%= render :partial => 'files/newfile_index' %> <div id="resource_list">
<% if @isproject %>
<%= render :partial => 'project_file', locals: {project: @project} %>
<% else %>
<%= render :partial => 'course_file', locals: {course: @course} %>
<% end %>
</div>
<script type='text/javascript'>
var slideHeight = 29;
function readmore(aNode) {
// console.log(aNode)
// var $td_tags_area = $(aNode).parent().parent();
var $td_tags_area = $(aNode).parent().parent().parent().parent();
var $tags_area = $td_tags_area.find('.tags_area')
var $tags_gradint = $td_tags_area.find('.tags_gradint')
var $read_more = $td_tags_area.find('.read-more')
var $read_more_a = $td_tags_area.find('.read-more a')
var $tags = $td_tags_area.find('#tags')
var $icona = $td_tags_area.find('.tags_icona')
var slideHeight = 13; //px
var defHeight = $tags.height();
var curHeight = $tags_area.height();
if (curHeight == slideHeight) {
$tags_area.animate({
height: defHeight
}, 'normal');
$read_more_a.html('隐藏');
$icona.html('<%=image_tag "/images/sidebar/minus.png"%>')
$tags_gradint.fadeOut();
} else {
$tags_area.animate({
height: slideHeight
}, 'normal');
$read_more_a.html('更多');
$icona.html('<%=image_tag "/images/sidebar/add.png"%>')
$tags_gradint.fadeIn();
}
;
}
$(function () {
var slideHeight = 20; //px
var defHeight = $('.tags_area').height();
if (defHeight >= slideHeight) {
$('.tags_area').css('height', slideHeight + 'px');
}
;
});
function eval_ajax(xhr, textStatus) {
if (textStatus == 'success') {
eval(xhr.responseText);
} else if (textStatus == 'error') {
alert('error');
}
}
function attachment_contenttypes_searchex(value) {
<% if @project%>
$.ajax({
url: '<%=getattachtype_project_files_path(project_id: @project)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: encodeURIComponent(value)
}
}).complete(eval_ajax);
<%end%>
}
function attachtype_edit(value) {
<% if @project%>
$.ajax({
url: '<%=getattachtype_project_files_path(project_id: @project)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: encodeURIComponent(value)
}
}).complete(eval_ajax);
<%end%>
}
function attachmenttypes_searchex(value) {
<% if @project%>
$.ajax({
url: '<%=getattachtype_project_files_path(project_id: @project)%>',
type: "POST",
data: {
type: encodeURIComponent(value),
contentType: $('#attach_sufix_browse').val()
}
}).complete(eval_ajax);
<%end%>
}
function course_attachmenttypes_searchex(value) {
<% if @course%>
$.ajax({
url: '<%=getattachtype_course_files_path(course_id: @course)%>',
type: "POST",
data: {
type: encodeURIComponent(value),
contentType: $('#attach_sufix_browse').val()
}
}).complete(eval_ajax);
<%end%>
}
function course_attachment_contenttypes_searchex(value) {
<% if @course%>
$.ajax({
url: '<%=getattachtype_course_files_path(course_id: @course)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: encodeURIComponent(value)
}
}).complete(eval_ajax);
<%end%>
}
function course_attachtype_edit(value) {
<% if @course%>
$.ajax({
url: '<%=getattachtype_course_files_path(course_id: @course)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: encodeURIComponent(value)
}
}).complete(eval_ajax);
<%end%>
}
function attachmenttypes_change(id, type) {
<% if @project%>
$.ajax({
url: '<%=updateType_attachments_path%>',
type: "POST",
data: {
attachmentid: encodeURIComponent(id),
newtype: encodeURIComponent(type)
}
}).complete(function (xhr, textStatus) {
if (textStatus == 'success') {
$.ajax({
url: '<%=getattachtype_project_files_path(project_id: @project)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: $('#attach_sufix_browse').val()
}
}).error(function () {
alert('error');
});
} else if (textStatus == 'error') {
alert('An error has occurred');
}
});
<%end%>
}
function course_attachmenttypes_change(id, type) {
<% if @course%>
$.ajax({
url: '<%=updateType_attachments_path%>',
type: "POST",
data: {
attachmentid: encodeURIComponent(id),
newtype: encodeURIComponent(type)
}
}).complete(function (xhr, textStatus) {
if (textStatus == 'success') {
$.ajax({
url: '<%=getattachtype_course_files_path(course_id: @course)%>',
type: "POST",
data: {
type: $('#attachment_browse').val(),
contentType: $('#attach_sufix_browse').val()
}
}).error(function () {
alert('error');
});
} else if (textStatus == 'error') {
alert('An error has occurred');
}
});
<%end%>
}
// 编辑文件密级
function file_dense_edit(id, type) {
$.ajax({
url: '<%=updateFileDense_attachments_path%>',
type: "POST",
remote:"true",
data: {
attachmentid: encodeURIComponent(id),
newtype: encodeURIComponent(type)
}
}).complete(function (xhr, textStatus) {
});
}
</script>
<script type='text/javascript'>
function tagAddClick(divid, objId, objTag) {
alert("OK");
$.ajax({
type: "POST",
url: '/users/tag_saveEx',
data: {
tagname: $('tag_name').value,
obj_id: encodeURIComponent(objId),
obj_flag: encodeURIComponent(objTag)
},
success: function (data, textStatus) {
alert("OK");
$(divid).empty();
$(divid).html('123');
$("#" + divid + " #name").val("");
}
})
}
</script>

View File

@ -1,2 +0,0 @@
alert("eeee");
$('#content').html('<%= escape_javascript(render :partial => 'issues/newissue_index') %>');

View File

@ -4,13 +4,15 @@
<div class="problem_top"> <div class="problem_top">
<% if @project.enabled_modules.where("name = 'issue_tracking'").count > 0 %> <% if @project.enabled_modules.where("name = 'issue_tracking'").count > 0 %>
<span> <span>
<%= link_to l(:label_issue_new), {:controller => 'issues', :action => 'new', :copy_from => nil}, :param => :project_id, :caption => :label_issue_new, <% if User.current.member_of?(@project) %>
<%= link_to l(:label_issue_new), {:controller => 'issues', :action => 'new', :copy_from => nil}, :param => :project_id, :caption => :label_issue_new,
:html => {:accesskey => Redmine::AccessKeys.key_for(:new_issue)}, :class => 'icon icon-add' %> :html => {:accesskey => Redmine::AccessKeys.key_for(:new_issue)}, :class => 'icon icon-add' %>
<% end %>
<%= link_to l(:label_query), '#', :class => 'icon icon-help', <%= link_to l(:label_query), '#', :class => 'icon icon-help',
:onclick => '$("#custom_query").slideToggle(400); ' if true || User.current.logged? %> :onclick => '$("#custom_query").slideToggle(400); ' if true || User.current.logged? %>
</span> </span>
<% end %> <% end %>
<span class="problem_p fr">问题总数:<span>100</span> 未解决:<span>20</span></span> <span class="problem_p fr">问题总数:<span><%= @project.issues.count %></span> 未解决:<span><%= @project.issues.where('status_id in (1,2,4,6)').count %></span></span>
</div> </div>
<div class="contextual"> <div class="contextual">
<% if !@query.new_record? && @query.editable_by?(User.current) %> <% if !@query.new_record? && @query.editable_by?(User.current) %>

View File

@ -1,5 +1,5 @@
<div class="project_r_h"> <div class="project_r_h">
<h2 class="project_h2">问题跟踪</h2> <h2 class="project_h2"><%= l(:label_issue_plural) %></h2>
</div> </div>
<%# html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> <%# html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
<% html_title "#{@issue.tracker.name} #{@issue.source_from}'#'#{@issue.project_index}: #{@issue.subject}" %> <% html_title "#{@issue.tracker.name} #{@issue.source_from}'#'#{@issue.project_index}: #{@issue.subject}" %>

View File

@ -103,7 +103,11 @@
</div> </div>
<!-- 项目得分 --> <!-- 项目得分 -->
<div class="cl"></div> <div class="cl"></div>
<div class="pr_info_name><%= link_to @project.name, project_path(@project) %><span class="img_private ">私有</span></div> <div class="pr_info_name><%= link_to @project.name, project_path(@project) %>
<% if !@project.is_public? %>
<span class="img_private ">私有</span>
<% end %>
</div>
<div class="cl"></div> <div class="cl"></div>
<div class="pr_info_score"> <div class="pr_info_score">
<% if @project.project_type == 0 %> <% if @project.project_type == 0 %>
@ -123,15 +127,15 @@
</div><!--项目信息 end--> </div><!--项目信息 end-->
<div class="subNavBox"> <div class="subNavBox">
<% if User.current.member_of?(@project) %>
<div class="subNav currentDd currentDt subNav_jiantou">邀请</div> <div class="subNav currentDd currentDt subNav_jiantou">邀请</div>
<ul class="navContent " style="display:block; padding-left: 0px; margin-top:0px;"> <ul class="navContent " style="display:block; padding-left: 0px; margin-top:0px;">
<li><a href="#">发送邮件邀请新用户</a></li> <li><%= link_to "发送邮件邀请新用户", :controller=>"projects", :action=>"invite_members_by_mail", :id => @project %></li>
<li><a href="#">邀请Trustie注册用户</a></li> <li><%= link_to "邀请Trustie注册用户", :controller=>"projects", :action=>"invite_members", :id => @project %></li>
</ul> </ul>
<% end %>
<div class="subNav"> <div class="subNav">
<%= link_to "动态", {:controller => 'projects', :action => 'show', :id => @project.id}, <%= link_to "动态", {:controller => 'projects', :action => 'show', :id => @project.id}, :style => "color:#3CA5C6" %>
:remote => "true",
:style => "color:#3CA5C6" %>
</div> </div>
<div class="subNav"> <div class="subNav">
<%= link_to "问题跟踪", project_issues_path(@project), :style => "color:#3CA5C6" %><span class="subnav_num">(<%= @project.issues.count %>)</span> <%= link_to "问题跟踪", project_issues_path(@project), :style => "color:#3CA5C6" %><span class="subnav_num">(<%= @project.issues.count %>)</span>
@ -144,7 +148,7 @@
<%= link_to "讨论区", project_boards_path(@project), :style => "color:#3CA5C6" %> <%= link_to "讨论区", project_boards_path(@project), :style => "color:#3CA5C6" %>
<span class="subnav_num">(<%= @project.boards.first.topics.count %>)</span> <span class="subnav_num">(<%= @project.boards.first.topics.count %>)</span>
<% if User.current.logged? && User.current.member_of?(@project) %> <% if User.current.logged? && User.current.member_of?(@project) %>
<%= link_to "+发贴", new_board_message_path(@project.boards.first, @project), :layout => 'base_projects',:style => "font-size:12px;color:#fff; padding:1px 3px 3px 3px;height:18px;margin-top:4px;background:#28be6c;float:right;line-height:20px;" %> <%= link_to "+发贴", new_board_message_path(@project.boards.first), :layout => 'base_projects',:style => "font-size:12px;color:#fff; padding:1px 3px 3px 3px;height:18px;margin-top:4px;background:#28be6c;float:right;line-height:20px;" %>
<% end %> <% end %>
</div> </div>
<div class="subNav"> <div class="subNav">

View File

@ -6,6 +6,10 @@
<span style="float: left; width: 526px"> <span style="float: left; width: 526px">
<p><%= @subject %> </p> <p><%= @subject %> </p>
<p> <%= link_to @project_url, @project_url%></p> <p> <%= link_to @project_url, @project_url%></p>
<p>点击链接后,将自动为您注册账号</p>
<p>您的账号为:<%= @email %></p>
<p>密码为: <%= @password %></p>
</span> </span>
</li> </li>

View File

@ -5,7 +5,7 @@
<% @nav_dispaly_forum_label = 1%> <% @nav_dispaly_forum_label = 1%>
<!-- <h1>New memo</h1> --> <!-- <h1>New memo</h1> -->
<%= javascript_include_tag "ckeditor/ckeditor.js" %> <%= javascript_include_tag "ckeditor/ckeditor.js" %>
<div class="top-content"> <div class="top-content">
<table> <table>
<tr> <tr>
<td class="info_font" style="width: 240px; color: #15bccf">软件项目托管社区</td> <td class="info_font" style="width: 240px; color: #15bccf">软件项目托管社区</td>
@ -19,7 +19,7 @@
<td style="padding-left: 8px"><%= link_to request.host()+"/forums", forums_path %></td> <td style="padding-left: 8px"><%= link_to request.host()+"/forums", forums_path %></td>
<td><p class="top-content-list"><%=link_to l(:label_home),home_path %> > <%=link_to '公共贴吧', :controller => 'forums', :action => 'index' %> > <%=link_to @forum.name %></p></td> <td><p class="top-content-list"><%=link_to l(:label_home),home_path %> > <%=link_to '公共贴吧', :controller => 'forums', :action => 'index' %> > <%=link_to @forum.name %></p></td>
</tr> </tr>
</table> </table>
</div> </div>
<h3><%=l(:label_memo_new)%></h3> <h3><%=l(:label_memo_new)%></h3>
<div class="box tabular"> <div class="box tabular">

View File

@ -1,3 +1,6 @@
<div class="project_r_h">
<h2 class="project_h2"><%= l(:label_news) %></h2>
</div>
<script type="text/javascript"> <script type="text/javascript">
function regexTitle() function regexTitle()
{ {
@ -66,15 +69,11 @@
label_tips = l(:label_news) label_tips = l(:label_news)
end end
%> %>
<% if @project.enabled_modules.where("name = 'news'").count > 0 && User.current.member_of?(@project) %>
<span style="font-size: 16px; border-bottom:1px solid #f0f0f0; margin-right: 15px;"> <%= link_to(btn_tips,
<%= label_tips %> new_project_news_path(@project),
</span> :class => 'icon icon-add',
<% if @project.enabled_modules.where("name = 'news'").count > 0 %> :onclick => 'showAndScrollTo("add-news", "news_title"); return false;') %>
<%= link_to(btn_tips,
new_project_news_path(@project),
:class => 'icon icon-add',
:onclick => 'showAndScrollTo("add-news", "news_title"); return false;') %>
<% end %> <% end %>
<% if @project && User.current.allowed_to?(:manage_news, @project) %> <% if @project && User.current.allowed_to?(:manage_news, @project) %>
<div id="add-news" class="add_frame" style="display:none;"> <div id="add-news" class="add_frame" style="display:none;">

View File

@ -1,3 +1,6 @@
<div class="project_r_h">
<h2 class="project_h2"><%= l(:label_news) %></h2>
</div>
<script type="text/javascript"> <script type="text/javascript">
function regexTitle() function regexTitle()
{ {

View File

@ -0,0 +1,18 @@
<div class="project_r_h">
<h2 class="project_h2">邀请加入</h2>
</div>
<div class="floatbox" style="margin:120px;">
<div ><a href="#" class="box_close"></a></div>
<div class="cl"></div>
<div class="box_main">
<h3 class="box_h3">发送邮件邀请新用户</h3>
<p class="box_p">输入好友邮箱地址Trustie帮您免费发送</p>
<p style="padding-lef:20px;"><%= form_tag('send_mail_to_member', :controller => 'projects',:action => 'send_mail_to_member', method: 'get',:remote=>true) do %></p>
<%= text_field_tag 'mail', '邮箱', :class => "fb_item fl" %>
<div class="cl"></div>
<%= submit_tag '免费发送', :style=> "display:block; width:80px; text-align:center; color:#fff; height:26px; padding-top:3px; margin-bottom:10px;" %>
<% end %>
</div>
</div>

View File

@ -3,6 +3,9 @@
<%= link_to l(:label_settings), settings_project_path(@project) %> <%= link_to l(:label_settings), settings_project_path(@project) %>
<% end %> <% end %>
</li> </li>
<li>
<%= link_to l(:field_user_active_news), project_news_index_path(@project) %>
</li>
<li> <li>
<%= link_to l(:project_module_wiki), project_wiki_path(@project) %> <%= link_to l(:project_module_wiki), project_wiki_path(@project) %>
</li> </li>

View File

@ -0,0 +1,67 @@
<div class="project_r_h">
<h2 class="project_h2">邀请加入</h2>
</div>
<%= error_messages_for 'member' %>
<%
roles = Role.givable.all
if @project.project_type == Project::ProjectType_course
roles = roles[3..5]
else
roles = roles[0..2]
end
members = @project.member_principals.includes(:roles, :principal).all.sort
%>
<div style="margin-left: 30px" >
<div class="floatbox" style="margin:100px;">
<div ><a href="#" class="box_close"></a></div>
<div class="cl"></div>
<div class="box_main">
<h3 class="box_h3">邀请Trustie注册用户</h3>
<% if roles.any? %>
<%= form_for(@member, {:as => :membership, :url => project_memberships_path(@project), :remote => true, :method => :post}) do |f| %>
<div class="invi_search">
<%= label_tag "principal_search", l(:label_principal_search) %>
<%= text_field_tag 'principal_search', nil %>
<%= javascript_tag "observeSearchfield('principal_search', null, '#{ escape_javascript autocomplete_project_memberships_path(@project, :format => 'js') }')" %>
<div id="principals_for_new_member">
<%= render_principals_for_new_members(@project) %>
</div>
<p style="padding-top: 5px">
<%= l(:label_role_plural) %>:
<% roles.each do |role| %>
<label>
<%= check_box_tag 'membership[role_ids][]', role.id %>
<%= h role %>
</label>
<% end %>
</p>
<p>
<%= submit_tag l(:label_invite_members), :id => 'member-add-submit', :style => 'display:block; width:80px; text-align:center; color:#fff; height:26px; padding-top:3px; margin-bottom:10px;' %>
</p>
<% end %>
<% end %>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function () {
var collection=$("#principals_for_new_member").children("#principals").children("label");
collection.css("text-overflow","ellipsis");
collection.css("white-space","nowrap");
collection.css("width","200px");
collection.css("overflow","hidden");
for(i=0;i<collection.length;i++){ //增加悬浮显示
var label=collection[i];
var text=$(label).text();
$(label).attr("title",text);
}
});
</script>

View File

@ -0,0 +1 @@
<%= render :partial => "invite_members_by_mail"%>

View File

@ -0,0 +1,10 @@
$('#ajax-modal').html('<%= escape_javascript(render :partial => 'invite_members_by_mail') %>');
showModal('ajax-modal', '513px');
$('#ajax-modal').css('height','569px');
$('#ajax-modal').siblings().remove();
$('#ajax-modal').before("<span style='float: right;cursor:pointer;padding-left: 513px;'>" +
"<a href='#' onclick='hidden_homework_atert_form();'><img src='/images/bid/close.png' width='26px' height='26px' /></a></span>");
$('#ajax-modal').parent().removeClass("alert_praise");
$('#ajax-modal').parent().css("top","").css("left","");
$('#ajax-modal').parent().addClass("alert_box");

View File

@ -1,177 +1,183 @@
<%= javascript_include_tag "jquery.infinitescroll.js" %> <div class="project_r_h">
<script> <h2 class="project_h2"><%= l(:label_activity) %></h2>
/* $(document).ready(function (){ //别忘了加这句除非你没学Jquery </div>
$("#container").infinitescroll({ <%= javascript_include_tag "jquery.infinitescroll.js" %>
navSelector: "#paginator", //页面分页元素--成功后自动隐藏 <script>
nextSelector: "#paginator a[rel='next']", //下一页的按钮,但是貌似这个选不中 /* $(document).ready(function (){ //别忘了加这句除非你没学Jquery
itemSelector: ".scroll " , $("#container").infinitescroll({
path: function(current){ var page = parseInt(current)+1; navSelector: "#paginator", //页面分页元素--成功后自动隐藏
var project_id = <%= @project.id %>; nextSelector: "#paginator a[rel='next']", //下一页的按钮,但是貌似这个选不中
return "/projects/"+project_id+"?page="+page itemSelector: ".scroll " ,
}, //下一页的路径 path: function(current){ var page = parseInt(current)+1;
animate: true, var project_id = <%= @project.id %>;
maxPage: 500 return "/projects/"+project_id+"?page="+page
}); }, //下一页的路径
});*/ animate: true,
</script> maxPage: 500
<div id="container"> });
<div class="scroll"> });*/
<% unless @events_pages.empty? %> </script>
<% @events_pages.each do |e| -%> <div id="container">
<% act = e.forge_act %> <div class="scroll">
<% if e.forge_act_type == "Issue" %> <% unless @events_pages.empty? %>
<div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;"> <% @events_pages.each do |e| -%>
<div class="activity-avatar" style="float: left; margin:3px; height: 100%;"> <% act = e.forge_act;
<%= image_tag(url_to_avatar(act.author), :class => "avatar") %> next if act.nil? %>
</div> <% if e.forge_act_type == "Issue" %>
<div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;margin-top: 10px;">
<div class="activity-content" style="padding:5px 5px 5px 70px;"> <div class="activity-avatar" style="float: left; margin:3px; height: 100%;">
<strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong> <%= image_tag(url_to_avatar(act.author), :class => "avatar") %>
<span class="activity-title font_lighter"> </div>
<%= link_to_user(act.author) %>
<%= l(:label_new_activity) %> <div class="activity-content" style="padding:5px 5px 5px 70px;">
</span> <strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong>
<%= link_to format_activity_title("#{act.source_from}##{act.project_issues_index} (#{act.status}): #{act.tracker.name} #{act.subject}"), <span class="activity-title font_lighter">
{:controller => 'issues', <%= link_to_user(act.author) %>
:action => 'show', <%= l(:label_new_activity) %>
:id => act.id} %> </span>
<div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;"> <%= link_to format_activity_title("#{act.source_from}##{act.project_issues_index} (#{act.status}): #{act.tracker.name} #{act.subject}"),
<%= textAreailizable act,:description %> {:controller => 'issues',
</div> :action => 'show',
<div class="activity_status" style="position:relative; padding-top: 3px;"> :id => act.id} %>
<span class="font_lighter"> <%= l :label_activity_time %> <div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;">
&nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span> <%= textAreailizable act,:description %>
<div class="" style="display:inline-block;position:absolute; right:2%;"> </div>
<span> <%= link_to l(:label_find_all_comments), issue_path(act.id) %> </span><span class="font_lighter"><%= l(:label_comments_count, :count => act.journals.count) %></span> <div class="activity_status" style="position:relative; padding-top: 3px;">
</div> <span class="font_lighter"> <%= l :label_activity_time %>
</div> &nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span>
</div> <div class="" style="display:inline-block;position:absolute; right:2%;">
</div> <span> <%= link_to l(:label_find_all_comments), issue_path(act.id) %> </span><span class="font_lighter"><%= l(:label_comments_count, :count => act.journals.count) %></span>
<% elsif e.forge_act_type == "Journal" %> </div>
<div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;"> </div>
<div class="activity-avatar" style="float: left; margin:3px; height: 100%;"> </div>
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> </div>
</div> <% elsif e.forge_act_type == "Journal" %>
<div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;">
<div class="activity-content" style="padding:5px 5px 5px 70px;"> <div class="activity-avatar" style="float: left; margin:3px; height: 100%;">
<strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong> <%= image_tag(url_to_avatar(e.user), :class => "avatar") %>
<span class="activity-title font_lighter"> </div>
<%= link_to(h(e.user), user_path(e.user_id)) %>
<%= l(:label_new_activity) %> <div class="activity-content" style="padding:5px 5px 5px 70px;">
</span> <strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong>
<%= link_to(l(:label_activity_project)+act.issue.project.name, project_path(act.issue.project.id)) %> <span class="activity-title font_lighter">
<%= link_to format_activity_title("#{act.issue.tracker} ##{act.issue.project_issues_index}: #{act.issue.subject}"), <%= link_to(h(e.user), user_path(e.user_id)) %>
{:controller => 'issues', :action => 'show', :id => act.issue.id, :anchor => "change-#{act.id}"} %> <%= l(:label_new_activity) %>
<div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;"> </span>
<%= textAreailizable act,:notes %> <%= link_to(l(:label_activity_project)+act.issue.project.name, project_path(act.issue.project.id)) %>
</div> <%= link_to format_activity_title("#{act.issue.tracker} ##{act.issue.project_issues_index}: #{act.issue.subject}"),
<div class="activity_status" style="position:relative; padding-top: 3px;"> {:controller => 'issues', :action => 'show', :id => act.issue.id, :anchor => "change-#{act.id}"} %>
<span class="font_lighter"> <%= l :label_activity_time %> <div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;">
&nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span> <%= textAreailizable act,:notes %>
</div> </div>
</div> <div class="activity_status" style="position:relative; padding-top: 3px;">
</div> <span class="font_lighter"> <%= l :label_activity_time %>
<% elsif e.forge_act_type == "Message" %> &nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span>
<div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;"> </div>
<div class="activity-avatar" style="float: left; margin:3px; height: 100%;"> </div>
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> </div>
</div> <% elsif e.forge_act_type == "Message" %>
<div class="activity-content" style="padding:5px 5px 5px 70px;"> <div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;">
<strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong> <div class="activity-avatar" style="float: left; margin:3px; height: 100%;">
<span class="activity-title font_lighter"> <%= image_tag(url_to_avatar(e.user), :class => "avatar") %>
<%= link_to(h(e.user), user_path(e.user_id)) %> </div>
<%= l(:label_new_activity) %> <div class="activity-content" style="padding:5px 5px 5px 70px;">
</span> <strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong>
<%= link_to format_activity_title("#{act.board.name}: #{act.subject}"), <span class="activity-title font_lighter">
{:controller => 'messages', <%= link_to(h(e.user), user_path(e.user_id)) %>
:action => 'show', <%= l(:label_new_activity) %>
:board_id => act.board_id}.merge(act.parent_id.nil? ? {:id => act.id} : {:id => act.parent_id, :r => act.id, :anchor => "message-#{act.id}"}) %> </span>
<div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;"> <%= link_to format_activity_title("#{act.board.name}: #{act.subject}"),
<%= textAreailizable act,:content %> {:controller => 'messages',
</div> :action => 'show',
<div class="activity_status" style="position:relative; padding-top: 3px;"> :board_id => act.board_id}.merge(act.parent_id.nil? ? {:id => act.id} : {:id => act.parent_id, :r => act.id, :anchor => "message-#{act.id}"}) %>
<span class="font_lighter"> <%= l :label_activity_time %> <div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;">
&nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span> <%= textAreailizable act,:content %>
</div> </div>
</div> <div class="activity_status" style="position:relative; padding-top: 3px;">
</div> <span class="font_lighter"> <%= l :label_activity_time %>
<% elsif e.forge_act_type == "News" %> &nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span>
<div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;"> </div>
<div class="activity-avatar" style="float: left; margin:3px; height: 100%;"> </div>
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> </div>
</div> <% elsif e.forge_act_type == "News" %>
<div class="activity-content" style="padding:5px 5px 5px 70px;"> <div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;">
<strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong> <div class="activity-avatar" style="float: left; margin:3px; height: 100%;">
<span class="activity-title font_lighter"> <%= image_tag(url_to_avatar(e.user), :class => "avatar") %>
<%= link_to(h(e.user), user_path(e.user_id)) %> </div>
<%= l(:label_new_activity) %> <div class="activity-content" style="padding:5px 5px 5px 70px;">
</span> <strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong>
<%= link_to format_activity_title("#{l(:label_news)}: #{act.title}"), {:controller => 'news', :action => 'show', :id => act.id} %> <span class="activity-title font_lighter">
<div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;"> <%= link_to(h(e.user), user_path(e.user_id)) %>
<%= textAreailizable act,:description %> <%= l(:label_new_activity) %>
</div> </span>
<div class="activity_status" style="position:relative; padding-top: 3px;"> <% unless act.nil? %>
<span class="font_lighter"> <%= l :label_activity_time %> <%= link_to format_activity_title("#{l(:label_news)}: #{act.title}"), {:controller => 'news', :action => 'show', :id => act.id} %>
&nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span> <% end %>
<div class="" style="display:inline-block;position:absolute; right:2%;"> <div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;">
<span> <%= textAreailizable act,:description %>
<%= link_to l(:label_find_all_comments), {:controller => 'news', :action => 'show', :id => act.id} %> </div>
</span> <div class="activity_status" style="position:relative; padding-top: 3px;">
<span class="font_lighter"> <span class="font_lighter"> <%= l :label_activity_time %>
<%= l(:label_comments_count, :count => act.comments_count) %> &nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span>
</span> <div class="" style="display:inline-block;position:absolute; right:2%;">
</div> <span>
</div> <%= link_to l(:label_find_all_comments), {:controller => 'news', :action => 'show', :id => act.id} %>
</div> </span>
</div> <span class="font_lighter">
<% elsif e.forge_act_type == "Document" %> <%= l(:label_comments_count, :count => act.comments_count) %>
<div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;"> </span>
<div class="activity-avatar" style="float: left; margin:3px; height: 100%;"> </div>
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> </div>
</div> </div>
<div class="activity-content" style="padding:5px 5px 5px 70px;"> </div>
<strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong> <% elsif e.forge_act_type == "Document" %>
<span class="activity-title font_lighter"> <div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;">
<%= link_to(h(e.user), user_path(e.user_id)) %> <div class="activity-avatar" style="float: left; margin:3px; height: 100%;">
<%= l(:label_new_activity) %> <%= image_tag(url_to_avatar(e.user), :class => "avatar") %>
</span> </div>
<%= link_to format_activity_title("#{l(:label_document)}: #{act.title}"), {:controller => 'documents', :action => 'show', :id => act.id} %> <div class="activity-content" style="padding:5px 5px 5px 70px;">
<div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;"> <strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong>
<%= textAreailizable act,:description %> <span class="activity-title font_lighter">
</div> <%= link_to(h(e.user), user_path(e.user_id)) %>
<div class="activity_status" style="position:relative; padding-top: 3px;"> <%= l(:label_new_activity) %>
<span class="font_lighter"> <%= l :label_activity_time %> </span>
&nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span> <%= link_to format_activity_title("#{l(:label_document)}: #{act.title}"), {:controller => 'documents', :action => 'show', :id => act.id} %>
<div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;">
</div> <%= textAreailizable act,:description %>
</div> </div>
</div> <div class="activity_status" style="position:relative; padding-top: 3px;">
<% elsif e.forge_act_type == "Attachment" %> <span class="font_lighter"> <%= l :label_activity_time %>
<div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;"> &nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span>
<div class="activity-avatar" style="float: left; margin:3px; height: 100%;">
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> </div>
</div> </div>
<div class="activity-content" style="padding:5px 5px 5px 70px;"> </div>
<strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong> <% elsif e.forge_act_type == "Attachment" %>
<span class="activity-title font_lighter"> <div class="activity-item underline-evreycontent" style="font-size: 14px;line-height:1.5em;width: 100%;word-wrap: break-word;word-break: break-all;">
<%= link_to(h(e.user), user_path(e.user_id)) %> <div class="activity-avatar" style="float: left; margin:3px; height: 100%;">
<%= l(:label_new_activity) %> <%= image_tag(url_to_avatar(e.user), :class => "avatar") %>
</span> </div>
<%= link_to format_activity_title("#{l(:label_attachment)}: #{act.filename}"), {:controller => 'attachments', :action => 'show', :id => act.id} %> <div class="activity-content" style="padding:5px 5px 5px 70px;">
<div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;"> <strong> <%= h(e.project) if @project.nil? || @project.id != e.project_id %></strong>
<%= textAreailizable act,:description %> <span class="activity-title font_lighter">
</div> <%= link_to(h(e.user), user_path(e.user_id)) %>
<div class="activity_status" style="position:relative; padding-top: 3px;"> <%= l(:label_new_activity) %>
<span class="font_lighter"> <%= l :label_activity_time %> </span>
&nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span> <%= link_to format_activity_title("#{l(:label_attachment)}: #{act.filename}"), {:controller => 'attachments', :action => 'show', :id => act.id} %>
<div class="activity_description info-break" style="font-size: 13px;width: 100%;word-break: break-all;word-wrap: break-word;">
</div> <%= textAreailizable act,:description %>
</div> </div>
</div> <div class="activity_status" style="position:relative; padding-top: 3px;">
<% end %> <span class="font_lighter"> <%= l :label_activity_time %>
<% end %> &nbsp; <%= format_activity_day(act.created_on) %> <%= format_time(act.created_on, false) %></span>
<% end %>
</div> </div>
</div> </div>
</div>
<% end %>
<% end %>
<% end %>
</div>
</div>
<%= paginate @events_pages %> <%= paginate @events_pages %>

View File

@ -1 +0,0 @@
$('#content').html('<%= escape_javascript(render :partial => 'projects/newproject_show') %>');

View File

@ -1,20 +1,20 @@
<div id="tags_show"> <div id="tags_show">
<%= render :partial => "tags/tag_name",:locals => {:obj => obj,:non_list_all => false ,:object_flag => object_flag} %> <%= render :partial => "tags/tag_name",:locals => {:obj => obj,:non_list_all => false ,:object_flag => object_flag} %>
</div> </div>
<% if User.current.logged? %> <% if User.current.logged? %>
<span> <%= toggle_link ("+ 添加标签"), 'put-tag-form', {:focus => 'tags_name'} %> </span> <span> <%= toggle_link ("+ 添加标签"), 'put-tag-form', {:focus => 'tags_name'} %> </span>
<% end %> <% end %>
<div id="put-tag-form" style="display: none"> <div id="put-tag-form" style="display: none;text-align: center">
<%= form_for "tag_for_save",:remote=>true,:url=>tag_path, <%= form_for "tag_for_save",:remote=>true,:url=>tag_path,
:update => "tags_show", :update => "tags_show",
:complete => '$("#put-tag-form").slideUp();' do |f| %> :complete => '$("#put-tag-form").slideUp();' do |f| %>
<%= f.text_field :name ,:id => "tags_name",:size=>"20", <%= f.text_field :name ,:id => "tags_name",:size=>"20",
:require=>true, :require=>true,
:maxlength => Setting.tags_max_length, :maxlength => Setting.tags_max_length,
:minlength=>Setting.tags_min_length %> :minlength=>Setting.tags_min_length %>
<%= f.text_field :object_id,:value=> obj.id,:style=>"display:none"%> <%= f.text_field :object_id,:value=> obj.id,:style=>"display:none"%>
<%= f.text_field :object_flag,:value=> object_flag,:style=>"display:none"%> <%= f.text_field :object_flag,:value=> object_flag,:style=>"display:none"%>
<a href="#" onclick='$("#tags_name").parent().submit();' type="button" class="submit f_l"></a> <a href="#" onclick='$("#tags_name").parent().submit();' type="button" class="submit f_l" style="margin-top: 10px;"></a>
<% end %> <% end %>
</div> </div>

View File

@ -23,10 +23,10 @@
Kaminari.configure do |config| Kaminari.configure do |config|
# config.default_per_page = 25 # config.default_per_page = 25
# config.max_per_page = nil # config.max_per_page = nil
# config.window = 4 config.window = 2
# config.outer_window = 3 # config.outer_window = 3
# config.left = 0 # config.left = 2
# config.right = 0 # config.right = 2
# config.page_method_name = :page # config.page_method_name = :page
# config.param_name = :page # config.param_name = :page
end end

View File

@ -1928,6 +1928,7 @@ zh:
label_bids_task_list: 作业列表 label_bids_task_list: 作业列表
label_join_course: 加入 label_join_course: 加入
label_invite_project: 邀请您加入项目 label_invite_project: 邀请您加入项目
label_invite_members: 邀请用户
label_exit_course: 退出 label_exit_course: 退出
label_exit_group: 退出当前分班 label_exit_group: 退出当前分班
label_new_join: 加入 label_new_join: 加入

View File

@ -368,6 +368,9 @@ RedmineApp::Application.routes.draw do
get 'feedback', :action => 'feedback', :as => 'project_feedback' get 'feedback', :action => 'feedback', :as => 'project_feedback'
get 'watcherlist', :action=> 'watcherlist' get 'watcherlist', :action=> 'watcherlist'
get 'invite_members', :action=> 'invite_members'
get 'invite_members_by_mail', :action=> 'invite_members_by_mail'
get 'send_mail_to_member', :action => 'send_mail_to_member'
match 'user_watcherlist', :to => 'projects#watcherlist', :via => :get, :as => "watcherlist" #add by huang match 'user_watcherlist', :to => 'projects#watcherlist', :via => :get, :as => "watcherlist" #add by huang
get 'homework', :action => 'homework', :as => 'homework' get 'homework', :action => 'homework', :as => 'homework'
get 'new_homework', :action => 'new_homework', :as => 'new_homework' get 'new_homework', :action => 'new_homework', :as => 'new_homework'

View File

@ -67,7 +67,7 @@ a:hover.subnav_green{ background:#14ad5a;}
.lg-foot:hover{ color:#787b7e;} .lg-foot:hover{ color:#787b7e;}
/*右侧内容--动态*/ /*右侧内容--动态*/
.project_r_h{ height:40px; background:#eaeaea;} .project_r_h{ height:40px; background:#eaeaea; margin-bottom: 5px;}
.project_h2{ background:#64bdd9; color:#fff; height:30px; width:90px; text-align:center; font-weight:normal; padding-top:3px; font-size:16px; padding-top:9px;} .project_h2{ background:#64bdd9; color:#fff; height:30px; width:90px; text-align:center; font-weight:normal; padding-top:3px; font-size:16px; padding-top:9px;}
.project_r_box{ border:1px solid #e2e1e1; width:670px; margin-top:10px;} .project_r_box{ border:1px solid #e2e1e1; width:670px; margin-top:10px;}
.project_h3 { color:#646464; font-size:14px; padding:0 10px; border-bottom:1px solid #e2e1e1;} .project_h3 { color:#646464; font-size:14px; padding:0 10px; border-bottom:1px solid #e2e1e1;}
@ -91,7 +91,7 @@ a:hover.more{ color:#64bdd9;}
.box_close{ display:block; float:right; width:16px; height:16px; background:url(../images/img_floatbox.png) 0 0 no-repeat;} .box_close{ display:block; float:right; width:16px; height:16px; background:url(../images/img_floatbox.png) 0 0 no-repeat;}
.box_close:hover{background:url(../images/img_floatbox.png) -22px 0 no-repeat;} .box_close:hover{background:url(../images/img_floatbox.png) -22px 0 no-repeat;}
/*邮件邀请*/ /*邮件邀请*/
.box_main{ width:345px; margin:0 auto;} .box_main{ width:345px; margin:0 auto;padding-left:40px;}
.box_h3{ color:#15bccf; text-align:center; font-size:16px;} .box_h3{ color:#15bccf; text-align:center; font-size:16px;}
.box_p{ color:#404040; margin-bottom:5px;} .box_p{ color:#404040; margin-bottom:5px;}
.fb_item{ color:#919191; border:1px solid #919191; height:28px; margin-bottom:10px; padding-left:5px; width:290px;} .fb_item{ color:#919191; border:1px solid #919191; height:28px; margin-bottom:10px; padding-left:5px; width:290px;}
@ -102,7 +102,7 @@ a:hover.more{ color:#64bdd9;}
.btn_free{ background:#ff5722; display:block; width:80px; text-align:center; color:#fff; height:26px; padding-top:3px; margin-bottom:10px;} .btn_free{ background:#ff5722; display:block; width:80px; text-align:center; color:#fff; height:26px; padding-top:3px; margin-bottom:10px;}
.btn_free:hover{ background:#d63502;} .btn_free:hover{ background:#d63502;}
/*成员邀请*/ /*成员邀请*/
.invi_search{ width:230px; margin:0 auto;} .invi_search{ width:295px; margin:0 auto;}
.invi_search_input{ border:1px solid #15bccf; width:180px; height:24px; color:#9b9b9b; padding-left:5px; margin-bottom:10px;} .invi_search_input{ border:1px solid #15bccf; width:180px; height:24px; color:#9b9b9b; padding-left:5px; margin-bottom:10px;}
.invi_search_btn{ background:#15bccf; color:#fff; text-align: center; width:40px; height:22px;border:1px solid #15bccf; padding-top:2px; cursor:pointer;} .invi_search_btn{ background:#15bccf; color:#fff; text-align: center; width:40px; height:22px;border:1px solid #15bccf; padding-top:2px; cursor:pointer;}
.invi_search_btn:hover{ background:#0da1b2; border:1px solid #0da1b2;} .invi_search_btn:hover{ background:#0da1b2; border:1px solid #0da1b2;}

View File

@ -0,0 +1,182 @@
@charset "utf-8";
/* CSS Document */
body{ font-size:12px; font-family:"微软雅黑","宋体"; line-height:1.9; background:#eaebec; font-style:normal;}
div,html,img,ul,li,p,body,h1,h2,h3,h4,p,a,table,tr,td,fieldset,input,span,ol{ margin:0; padding:0;}
div,img,tr,td,table{ border:0;}
table,tr,td{border:0;cellspacing:0; cellpadding:0;}
ol,ul,li{ list-style-type:none}
.cl{ clear:both; overflow:hidden; }
a{ text-decoration:none; cursor:pointer;}
.ml10{ margin-left:10px;}
.ml20{ margin-left:20px;}
.mr10{ margin-right:10px;}
.mb5{ margin-bottom:5px;}
.mb10{ margin-bottom:10px;}
.fl{ float: left;}
.fr{ float:right;}
.project_h4{ font-size:14px; color:#3b3b3b;}
.project_content{ width:940px; margin:10px auto;}
.project_left{ float:left;}
.project_right{ width:670px; float:left;background:#fff; padding:10px;}
/*项目信息*/
.project_info{ background:#fff; padding:10px;width:222px; padding-right:8px;}
.pr_info_id{ width:137px; color:#5a5a5a; font-size:14px;}
.pr_info_join{}
.pr_info_join a{ color:#fff; display:block; padding:0 5px; margin-right:10px; float:left; height:22px; background:#64bdd9; text-align:center; }
.pr_info_join a:hover{ background:#41a8c8;}
a.pr_info_name{ color:#3e4040; font-size:14px; line-height:1.5;}
a:hover.pr_info_name{ color:#3ca5c6;}
.pr_info_score{ font-size:14px; color:#3e4040; }
.pr_info_score a{ color:#ff7143;}
.pr_info_score a:hover{ color:#64bdd9;}
.img_private{ background:url(../images/img_project.png) 0 0 no-repeat; width:32px; height:16px; color:#fff; font-size:12px; padding-left:7px; }
a.info_foot_num{ font-weight: bold; color:#3ca5c6; }
.pr_info_foot{ color:#7f7f7f; margin-top:5px; }
a:hover.info_foot_num{ color:#2390b2;}
/*左侧导航*/
.subNavBox{width:240px; background:#fff;margin:10px 10px 0 0;}
.subNav{border-bottom:solid 1px #e5e3da;cursor:pointer;font-weight:bold;font-size:14px;color:#3ca5c6;line-height:28px;padding-left:10px;background-color:#fff;}
.subNav_jiantou{background:url(../images/jiantou1.jpg) no-repeat;background-position:95% 50%; background-color:#fff;}
.subNav_jiantou:hover{color:#0781b4; }
.currentDd{color:#0781b4; }
.currentDt{background-color:#fff; }
.navContent{display: none;border-bottom:solid 1px #e5e3da; }
.navContent li a{display:block;width:240px;heigh:28px;text-align:center;font-size:12px;line-height:28px;color:#333}
.navContent li a:hover{color:#fff;background-color:#b3e0ee}
.subnav_num{ font-weight:normal; color:#ff7143; font-size:12px;}
a.subnav_green{ background:#28be6c; color:#fff; font-size:12px; font-weight:normal;height:20px; padding:0px 5px; text-align:center; margin-top:5px; margin-left:82px;}
a.ml95{ margin-left:97px;}
a.ml105{ margin-left:120px;}
a:hover.subnav_green{ background:#14ad5a;}
/*简介*/
.project_intro{ width:220px; padding:10px; background:#fff; margin-top:10px; padding-top:5px; color:#6d6d6d;}
.lg-foot{ border:1px solid #e8eef2; color: #929598; text-align:center; width:220px; height:23px; cursor:pointer;}
.lg-foot:hover{ color:#787b7e;}
/****标签(和资源库的tag样式一致)***/
.project_Label{ width:220px; padding:10px; background:#fff; margin-top:10px; padding-top:5px;}
a.yellowBtn{ display:inline-block;color:#0d90c3; height:22px;}
.submit{height:21px;border:0; cursor:pointer; background:url(../images/btn.png) no-repeat 0 0;width:42px; margin-top:2px; margin-left:3px; }
.isTxt{background:#fbfbfb url(../images/inputBg.png) repeat-x left top;height:22px;line-height:22px;border:1px solid #c1c1c1;padding:0 5px;color:#666666;}
.re_tag{ width: auto; padding:0 5px; height:22px; border:1px solid #f8df8c; background:#fffce6; margin-right:5px; }
.re_tag a{ color:#0d90c3;}
.tag_h span,.tag_h a{ margin-bottom:5px;}
/*右侧内容--动态*/
.project_r_h{ width:670px; height:40px; background:#eaeaea;}
.project_h2{ background:#64bdd9; color:#fff; height:37px; width:90px; text-align:center; font-weight:normal; padding-top:3px; font-size:16px;}
.project_r_box{ border:1px solid #e2e1e1; width:670px; margin-top:10px;}
.project_h3 { color:#646464; font-size:14px; padding:0 10px; border-bottom:1px solid #e2e1e1;}
a.more{ float:right; font-size:12px; font-weight:normal; color:#a9a9a9; margin-top:3px;}
a:hover.more{ color:#64bdd9;}
.project_box_ul{ padding:0 10px;}
.project_box_list{ padding:10px 0; border-bottom:1px dashed #e2e1e1; padding-left:30px; color:#6f6c6c;}
.img_problem{ background:url(../images/img_project.png) 0 -20px no-repeat;}
.img_talk{ background:url(../images/img_project.png) 0 -62px no-repeat;}
.img_ziyuan{ background:url(../images/img_project.png) 0 -115px no-repeat;}
.img_edition{ background:url(../images/img_project.png) 0 -167px no-repeat;}
.project_name{ color:#058c42;}
.project_name:hover{ color:#016f33;}
.project_txt{ color:#0781b4; width:445px; display:block; float:left; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;}
.project_txt02{ color:#0781b4; width:618px; display:block; float:left; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;}
.project_txt:hover{ color:#066e9a;}
.noline{ border-bottom:none;}
/*弹框*/
.floatbox{ width:420px; border:3px solid #15bccf; background:#fff; padding:5px;}
.box_close{ display:block; float:right; width:16px; height:16px; background:url(../images/img_floatbox.png) 0 0 no-repeat;}
.box_close:hover{background:url(../images/img_floatbox.png) -22px 0 no-repeat;}
/*邮件邀请*/
.box_main{ width:345px; margin:0 auto;}
.box_h3{ color:#15bccf; text-align:center; font-size:16px;}
.box_p{ color:#404040; margin-bottom:5px;}
.fb_item{ color:#919191; border:1px solid #919191; height:28px; margin-bottom:10px; padding-left:5px; width:290px;}
.icon_addm{ background:url(../images/img_floatbox.png) 0 -33px no-repeat; width:16px; height:16px; display:block; margin:5px 0 0 5px;}
.icon_addm:hover{background:url(../images/img_floatbox.png) 0 -61px no-repeat; }
.icon_removem{ background:url(../images/img_floatbox.png) -22px -33px no-repeat;width:16px; height:16px; display:block; margin:5px 0 0 5px}
.icon_removem:hover{background:url(../images/img_floatbox.png) -22px -61px no-repeat;}
.btn_free{ background:#ff5722; display:block; width:80px; text-align:center; color:#fff; height:26px; padding-top:3px; margin-bottom:10px;}
.btn_free:hover{ background:#d63502;}
/*成员邀请*/
.invi_search{ width:230px; margin:0 auto;}
.invi_search_input{ border:1px solid #15bccf; width:180px; height:24px; color:#9b9b9b; padding-left:5px; margin-bottom:10px;}
.invi_search_btn{ background:#15bccf; color:#fff; text-align: center; width:40px; height:22px;border:1px solid #15bccf; padding-top:2px; cursor:pointer;}
.invi_search_btn:hover{ background:#0da1b2; border:1px solid #0da1b2;}
/*问题跟踪*/
.problem_top{ margin:10px 0 ;}
.problem_search_input{ border:1px solid #64bdd9; width:180px; height:24px; color:#9b9b9b; padding-left:5px; margin-bottom:10px;}
.problem_search_btn{ background:#64bdd9; color:#fff; text-align: center; width:40px; height:22px;border:1px solid #64bdd9; padding-top:2px; cursor:pointer;}
.problem_search_btn:hover{ background:#3da1c1; border:1px solid #3da1c1;}
.problem_new_btn{ margin-left:10px; border:1px solid #ff7143; color:#ff7143; width:60px; height:22px; font-size:12px; text-align:center; padding-top:2px;}
.problem_new_btn:hover{ background:#ff7143; color:#fff;}
.problem_p{ color:#535252; margin-top:5px;}
.problem_p span{ color:#ff3e00;}
.problem_pic{ display:block; width:42px; height:42px; padding:3px; border:1px solid #e3e3e3; margin-top:5px;}
.problem_pic:hover{border:1px solid #64bdd9;}
.problem_txt{ width:610px; margin-left:10px; color:#777777;}
.problem_name{ color:#ff5722;}
.problem_name:hover{ color:#d33503;}
.problem_tit{ color:#0781b4; width:430px; display:block; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;}
.problem_tit:hover{ color:#09658c; }
.problem_main{ border-bottom:1px dashed #d4d4d4; padding-bottom:10px; margin-bottom:10px;}
/****翻页***/
.wlist{}
.wlist a{ float:right; border:1px solid #64bdd9; padding:0 5px; margin-left:3px; color:#64bdd9;}
.wlist a:hover{border:1px solid #64bdd9; background-color:#64bdd9; color:#fff; text-decoration:none;}
.wlist_select a { background-color:#48aac9; color:#fff;}
/****讨论区***/
.talk_top{ margin:10px 0; font-size:14px; color:#4c4c4c;}
.talk_top span{ color:#ff7143;}
.talk_txt{ width:460px; margin-left:10px; color:#676868;}
.talk_up{ color:#f63c00;}
.talk_pic{width:32px; height:32px; padding:2px;}
.talk_btn{ background:#64bdd9; width:50px; height:22px; color:#fff; text-align:center; margin-top:12px; padding-top:2px;}
.talk_btn:hover{ background:#2a9dc1;}
/****讨论区内页***/
.mt0{ margin-top:0px;}
.talk_info{ color:#7d7d7d; margin-left:50px; margin-top:10px;}
.talk_edit{ color:#426e9a; margin-right:5px;}
.talk_edit:hover{ color:#ff5722;}
.talk_reply { background:#eeeeee; padding:10px; margin-bottom:10px;}
.talk_text{ border:1px solid #64bdd9; width:600px; color:#7d7d7d; padding:5px; margin:10px 0 10px 50px;}
/****资源库***/
.f_l{ float:left;}
.f_r{ float:right;}
.resource a{ text-align:center;}
.b_lblue{ background:#64bdd9;}
.b_dblue{ background:#55a1b9; cursor:pointer;}
.f_b{ font-weight: bold;}
.c_blue{ color:#64bdd9;}
.c_grey{ color:#999999;}
.c_grey02{ color:#666666;}
.f_14{ font-size:14px;}
.c_dblue{ color:#3e6d8e;}
.w90{width:90px;}
.ml10{margin-left:10px;}
.resource{ width:670px;}
.re_top{width:660px; height:40px; background:#eaeaea; padding:5px;}
.re_top input{ float:left;}
.re_search{ margin-top:7px; margin-left:5px;}
.re_schbox{ width:240px; height:24px; border:1px solid #64bdd9; color:#666666;}
.re_schbtn{ width:60px; height:26px; color:#fff; margin-right:5px; border:none; margin-left:0px; }
a.re_fabu { display:block; width:90px; height:35px; font-size:14px; color:#fff; text-align:center; padding-top:5px; }
a:hover.re_fabu{background:#55a1b9;}
.re_con{ margin:5px; width:665px;}
.re_con_top{color:#494949; }
.re_con_top span{ color:#999999; font-weight:bold;}
a.re_select{ display:block; width:88px; height:22px; border:1px solid #ff9900; color:#ff9900; margin-left:10px;}
a:hover.re_select{ background:#ff9900; color:#fff; text-decoration:none;}
.re_open{display:block; width:46px; height:22px; border:1px solid #64bdd9; color:#64bdd9; margin-left:10px;}
a:hover.re_open{ background:#64bdd9; color:#fff; text-decoration:none;}
a.re_de{ color:#6883b6; margin-left:15px;}
.re_con_box{ border-bottom:1px dashed #dadada; padding-bottom:10px; margin-bottom:10px;}
/****资源库***/
.setting{ background:url(../images/setting.jpg) 0 0 no-repeat; width:670px; height:443px;}