From 6c093f68cf9460310b00a1bc9cf6ec2371c843cf Mon Sep 17 00:00:00 2001 From: cxt Date: Sun, 18 Sep 2016 11:18:02 +0800 Subject: [PATCH 001/102] =?UTF-8?q?=E7=8F=AD=E7=BA=A7=E5=86=85=E7=9A=84?= =?UTF-8?q?=E6=88=90=E5=91=98=E5=8F=AF=E4=BB=A5=E5=B0=86=E5=B8=96=E5=AD=90?= =?UTF-8?q?=E3=80=81=E9=80=9A=E7=9F=A5=E3=80=81=E8=B5=84=E6=BA=90=E7=AD=89?= =?UTF-8?q?=E5=8F=91=E9=80=81=E5=88=B0=E8=AF=A5=E7=8F=AD=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 2a91b75ae..7e9add5e2 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -2156,11 +2156,9 @@ class UsersController < ApplicationController @user = User.current if !params[:search].nil? search = "%#{params[:search].to_s.strip.downcase}%" - @course = @user.courses.where(" #{Course.table_name}.id = #{params[:search].to_i } or #{Course.table_name}.name like :p",:p=>search) - .select { |course| @user.allowed_to?(:as_teacher,course) and course.is_delete == 0 } + @course = @user.courses.not_deleted.where(" #{Course.table_name}.id = #{params[:search].to_i } or #{Course.table_name}.name like :p",:p=>search) else - @course = @user.courses - .select { |course| @user.allowed_to?(:as_teacher,course) and course.is_delete == 0 } + @course = @user.courses.not_deleted end @search = params[:search] @type = params[:type] @@ -2178,7 +2176,7 @@ class UsersController < ApplicationController @user = User.current if !params[:search].nil? search = "%#{params[:search].to_s.strip.downcase}%" - @projects = @user.projects.where(" #{Project.table_name}.id = #{params[:search].to_i } or #{Project.table_name}.name like :p",:p=>search) + @projects = @user.projects.visible.where(" #{Project.table_name}.id = #{params[:search].to_i } or #{Project.table_name}.name like :p",:p=>search) else @projects = @user.projects.visible end From 53bdeed1e4b0cb2fad9e3847fb93b1b38c413e82 Mon Sep 17 00:00:00 2001 From: liguangye Date: Sun, 18 Sep 2016 14:20:08 +0800 Subject: [PATCH 002/102] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=93=83=E9=93=9B404?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_project_issue.html.erb | 2 -- db/migrate/20160918033136_update_issue_author.rb | 13 +++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20160918033136_update_issue_author.rb diff --git a/app/views/users/_project_issue.html.erb b/app/views/users/_project_issue.html.erb index 0ca706b68..e1c9038d5 100644 --- a/app/views/users/_project_issue.html.erb +++ b/app/views/users/_project_issue.html.erb @@ -1,4 +1,3 @@ -<% unless activity.author.nil? %>
@@ -104,4 +103,3 @@ user_card_show_hide(); }); -<% end %> \ No newline at end of file diff --git a/db/migrate/20160918033136_update_issue_author.rb b/db/migrate/20160918033136_update_issue_author.rb new file mode 100644 index 000000000..8cbc99d6d --- /dev/null +++ b/db/migrate/20160918033136_update_issue_author.rb @@ -0,0 +1,13 @@ +class UpdateIssueAuthor < ActiveRecord::Migration + def up + begin + issue = Issue.find(9377) + issue.update_column(:author_id, 15341) + rescue Exception => e + puts e + end + end + + def down + end +end From 3f7935bf85088fbcd5aaee3c8a3d2605f9fab0ef Mon Sep 17 00:00:00 2001 From: cxt Date: Sun, 18 Sep 2016 14:39:03 +0800 Subject: [PATCH 003/102] =?UTF-8?q?=E7=8F=AD=E7=BA=A7/=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=B8=96=E5=AD=90=E9=94=81=E5=AE=9A=E5=9B=9E=E5=A4=8D=E7=9A=84?= =?UTF-8?q?=EF=BC=8C=E5=B7=B2=E6=9C=89=E5=9B=9E=E5=A4=8D=E7=9A=84=E4=BA=8C?= =?UTF-8?q?=E7=BA=A7=E5=9B=9E=E5=A4=8D=E6=8C=89=E9=92=AE=E6=9C=AA=E5=B1=8F?= =?UTF-8?q?=E8=94=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_message_replies.html.erb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/views/users/_message_replies.html.erb b/app/views/users/_message_replies.html.erb index 669aea26c..ce1e70887 100644 --- a/app/views/users/_message_replies.html.erb +++ b/app/views/users/_message_replies.html.erb @@ -24,6 +24,8 @@ <%=render :partial=> "praise_tread/praise", :locals => {:activity=>comment, :user_activity_id=>comment.id,:type=>"reply"}%> <% if type == 'Message' %> + <% topic = comment.root %> + <% if !topic.locked? && authorize_for('messages', 'reply') %> <%= link_to( l(:button_reply), @@ -33,6 +35,7 @@ :title => l(:button_reply)) %> + <% end %> <% if comment.course_destroyable_by?(User.current) || comment.destroyable_by?(User.current) %> <%= link_to( l(:button_delete), From 2c7eddbae601c0454f239327b8bf9c604fea216d Mon Sep 17 00:00:00 2001 From: cxt Date: Sun, 18 Sep 2016 14:49:01 +0800 Subject: [PATCH 004/102] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E7=95=99=E8=A8=80?= =?UTF-8?q?=E7=9A=84at=E5=9B=9E=E5=A4=8D=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/at_message.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/at_message.rb b/app/models/at_message.rb index 5a175fe76..2212ef07e 100644 --- a/app/models/at_message.rb +++ b/app/models/at_message.rb @@ -89,7 +89,7 @@ class AtMessage < ActiveRecord::Base status = -1 end when 'JournalsForMessage' - if at_message.jour && at_message.jour.course + if at_message.jour && defined? at_message.jour.course #作业回复 shield_type = "Course" container_id = at_message.jour.course.id @@ -99,7 +99,7 @@ class AtMessage < ActiveRecord::Base else type = "journal_for_message" detail_id = topic.id - detail_title = at_message.subject + detail_title = at_message.notes end else status = -1 From f50663158ae1b75bdff395dfb03b75eb58d6662e Mon Sep 17 00:00:00 2001 From: cxt Date: Sun, 18 Sep 2016 15:07:22 +0800 Subject: [PATCH 005/102] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E7=8F=AD=E7=BA=A7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E6=8F=90=E7=A4=BA=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/new.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/courses/new.html.erb b/app/views/courses/new.html.erb index 4c4374a29..f754c4540 100644 --- a/app/views/courses/new.html.erb +++ b/app/views/courses/new.html.erb @@ -17,12 +17,13 @@
  • - +
  • 正确示例:计算机系2016秋季A班
  • 错误示例:软件工程 - 计算机系2016秋季A班
  • +
  • 班级是一个由教师、助教(教辅)和学生组成的临时的教学群体,在规定的时间内(如一个学期)完成一门课程规定的教学任务。本质上,一门课程就是一个教学计划。
  • From 014b43cccd754f9b125bfb0c70ed86ad029e1bea Mon Sep 17 00:00:00 2001 From: cxt Date: Sun, 18 Sep 2016 15:09:43 +0800 Subject: [PATCH 006/102] =?UTF-8?q?oneapm=E6=B7=BB=E5=8A=A0=E5=88=B0?= =?UTF-8?q?=E5=BF=BD=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8a40f3ca7..a1f5f7e76 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ /config/database.yml /config/configuration.yml /config/additional_environment.rb +/config/oneapm.yml /files/* From 5b938aa11bf95f826be923d6ceb1006aa2d27a2c Mon Sep 17 00:00:00 2001 From: huang Date: Sun, 18 Sep 2016 15:44:27 +0800 Subject: [PATCH 007/102] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=AE=A8=E8=AE=BA=E5=8C=BA=E9=9D=9E=E6=88=90=E5=91=98=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E8=B5=84=E6=BA=90=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/messages_controller.rb | 8 ++- .../lib/acts_as_attachable.rb | 70 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 3e41e2c91..37383712f 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -92,7 +92,13 @@ class MessagesController < ApplicationController @message.board = @board @message.safe_attributes = params[:message] if request.post? - @message.save_attachments(params[:attachments]) + if @project + is_public = @project.is_public + elsif @course + is_public = @course.is_public + end + # 公开项目/课程上传的资源是公开的,私有项目上传的是私有的 + @message.save_attachments_containers(params[:attachments], User.current, is_public) if @message.save # 更新kindeditor上传的图片资源所有者 if params[:asset_id] diff --git a/lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb b/lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb index f5b48544d..20bc0a7ad 100644 --- a/lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb +++ b/lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb @@ -172,6 +172,76 @@ module Redmine {:files => saved_attachments, :unsaved => unsaved_attachments} end + # 扩展方法,因为类型太多,为了不影响其它的 + # 最终需要形成一个方法 + def save_attachments_containers(attachments, author, is_public) + # 清除临时文件 + if attachments + tempAttach = attachments[:dummy] + if tempAttach && tempAttach[:file] + attachments.delete(:dummy) + end + end + + if attachments.is_a?(Hash) + attachments = attachments.stringify_keys + attachments = attachments.to_a.sort {|a, b| + if a.first.to_i > 0 && b.first.to_i > 0 + a.first.to_i <=> b.first.to_i + elsif a.first.to_i > 0 + 1 + elsif b.first.to_i > 0 + -1 + else + a.first <=> b.first + end + } + attachments = attachments.map(&:last) + end + if attachments.is_a?(Array) + attachments.each do |attachment| + if attachment.is_a?(Hash) + a = nil + file = attachment['file'] + token = attachment['token'] + t = file && file.size > 0 + if file && file.size > 0 + a = Attachment.create(:file => file, :author => author) + elsif token + # 通过token值找到对应的attachment + a = Attachment.find_by_token_only(token) + if a + a.filename = attachment['filename'] unless attachment['filename'].blank? + a.content_type = attachment['content_type'] + end + end + end + + if a && !attachment['is_public_checkbox'] + # 考虑到更新操作,所以全部设置为公开,私有项目、课程是不能访问的 + if is_public + a.is_public = true + else + a.is_public = false + end + elsif a && attachment['is_public_checkbox'] + a.is_public = true + end + set_attachment_public(a) if a + next unless a + a.description = attachment['description'].to_s.strip + a.attachtype = @curattachment_type + if a.new_record? + unsaved_attachments << a + else + saved_attachments << a + end + end + end + {:files => saved_attachments, :unsaved => unsaved_attachments} + end + + def attach_saved_attachments saved_attachments.each do |attachment| self.attachments << attachment From a3467a569796d15b433c77fc034ea86418011cbe Mon Sep 17 00:00:00 2001 From: huang Date: Sun, 18 Sep 2016 15:53:32 +0800 Subject: [PATCH 008/102] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E8=AE=A8=E8=AE=BA=E5=8C=BA=E8=B5=84=E6=BA=90=E5=85=AC=E5=BC=80?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...160918074635_update_attach_public_for_message.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 db/migrate/20160918074635_update_attach_public_for_message.rb diff --git a/db/migrate/20160918074635_update_attach_public_for_message.rb b/db/migrate/20160918074635_update_attach_public_for_message.rb new file mode 100644 index 000000000..5f9b51c5a --- /dev/null +++ b/db/migrate/20160918074635_update_attach_public_for_message.rb @@ -0,0 +1,13 @@ +class UpdateAttachPublicForMessage < ActiveRecord::Migration + def up + begin + attachments = Attachment.where(:container_type => "Message", :is_public => 0) + attachments.update_all(:is_public => 1) + rescue Exception => e + puts e + end + end + + def down + end +end From 924db06cbf73066b5a21d47d7bc8f3e88afd3d16 Mon Sep 17 00:00:00 2001 From: huang Date: Sun, 18 Sep 2016 15:55:22 +0800 Subject: [PATCH 009/102] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=BA=93=E9=9A=90=E8=97=8F=E4=BB=A3=E7=A0=81=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 42 +++++++++++++------------- app/views/projects/show.html.erb | 11 ------- 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 8d4c09ded..df40eb378 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -325,27 +325,27 @@ class ProjectsController < ApplicationController end # 版本库统计图 - unless @project.gpid.nil? || @project.project_score.changeset_num == 0 - # rep_statics_commit = @project.rep_statics.order("commits_num desc") - rep_statics_commit = RepStatics.find_by_sql("SELECT * FROM `rep_statics` where project_id = #{@project.id} order by commits_num desc limit 10") - rep_statics_code = RepStatics.find_by_sql("SELECT * FROM `rep_statics` where project_id = #{@project.id} order by changeset desc limit 10") - # rep_statics_code = @project.rep_statics.sort_by {|u| u.changeset}.reverse - @a_uname = rep_statics_commit.map {|s| s.uname } - @a_uname_code = rep_statics_code.map {|s| s.uname } - @a_commits_num = rep_statics_commit.map {|s| s.commits_num.to_i } - @a_commits_add = rep_statics_code.map {|s| s.add.to_i } - @a_commits_del = rep_statics_code.map {|s| s.del.to_i } - @a_commits_changeset = rep_statics_code.map {|s| s.changeset.to_i } - g = Gitlab.client - begin - gid = @project.gpid - g_project = g.project(gid) - g_branch = g_project.default_branch.to_s - rescue =>e - logger.error("get default branch failed: " + e) - end - @rev = g_branch.nil? ? "master" : g_branch - end + # unless @project.gpid.nil? || @project.project_score.changeset_num == 0 + # # rep_statics_commit = @project.rep_statics.order("commits_num desc") + # rep_statics_commit = RepStatics.find_by_sql("SELECT * FROM `rep_statics` where project_id = #{@project.id} order by commits_num desc limit 10") + # rep_statics_code = RepStatics.find_by_sql("SELECT * FROM `rep_statics` where project_id = #{@project.id} order by changeset desc limit 10") + # # rep_statics_code = @project.rep_statics.sort_by {|u| u.changeset}.reverse + # @a_uname = rep_statics_commit.map {|s| s.uname } + # @a_uname_code = rep_statics_code.map {|s| s.uname } + # @a_commits_num = rep_statics_commit.map {|s| s.commits_num.to_i } + # @a_commits_add = rep_statics_code.map {|s| s.add.to_i } + # @a_commits_del = rep_statics_code.map {|s| s.del.to_i } + # @a_commits_changeset = rep_statics_code.map {|s| s.changeset.to_i } + # g = Gitlab.client + # begin + # gid = @project.gpid + # g_project = g.project(gid) + # g_branch = g_project.default_branch.to_s + # rescue =>e + # logger.error("get default branch failed: " + e) + # end + # @rev = g_branch.nil? ? "master" : g_branch + # end # 根据对应的请求,返回对应的数据 respond_to do |format| format.html diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb index 39d8a9847..6c4e2b802 100644 --- a/app/views/projects/show.html.erb +++ b/app/views/projects/show.html.erb @@ -29,17 +29,6 @@
  • - <%# 时间紧,权限待优化 %> - <% unless @project.hidden_repo && !User.current.member_of?(@project) && !User.current.admin? %> - <% unless @project.gpid.nil? || @project.project_score.changeset_num == 0 || @project.rep_statics.blank? %> -
    -
    - <%= render :partial => "rep_static" %> -
    -
    -
    - <% end %> - <% end %> <%= render :partial => "project_activities", :locals => {:forge_acts => @events_pages, :page => 0, :type => @type} %>
    \ No newline at end of file From 728e1333fc988fec0311bdb3fbccc60a961f513f Mon Sep 17 00:00:00 2001 From: huang Date: Sun, 18 Sep 2016 15:58:55 +0800 Subject: [PATCH 010/102] =?UTF-8?q?issue=20author=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_project_issue.html.erb | 191 ++++++++++++------------ 1 file changed, 97 insertions(+), 94 deletions(-) diff --git a/app/views/users/_project_issue.html.erb b/app/views/users/_project_issue.html.erb index e1c9038d5..5a0065f86 100644 --- a/app/views/users/_project_issue.html.erb +++ b/app/views/users/_project_issue.html.erb @@ -1,105 +1,108 @@ -
    -
    -
    - <%= link_to image_tag(url_to_avatar(activity.author), :width => "50", :height => "50"), user_path(activity.author_id), :alt => "用户头像" %> - <%= render :partial => 'users/show_detail_info', :locals => {:user => activity.author} %> -
    -
    -
    - <% if activity.try(:author).try(:realname) == ' ' %> - <%= link_to activity.try(:author), user_path(activity.author_id), :class => "newsBlue mr15" %> - <% else %> - <%= link_to activity.try(:author).try(:realname), user_path(activity.author_id), :class => "newsBlue mr15" %> - <% end %> TO - <%= link_to activity.project.name.to_s+" | 项目问题", project_issues_path(activity.project), :class => "newsBlue ml15"%> -
    - <% if User.current.logged? %> -
    -
      -
    • -
        -
      • - <%= link_to l(:button_edit), issue_path(activity.id, :edit => 'true'), :class => 'postOptionLink', :accesskey => accesskey(:edit) if activity.editable? && User.current.allowed_to?(:edit_issues, activity.project) %> -
      • -
      • - <% if !defined?(project_id) && !defined?(user_id) %> - <%= link_to l(:button_delete), issue_path(activity.id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> - <% elsif defined?(project_id) %> - <%= link_to l(:button_delete), issue_path(activity.id, :page_classify => "project_page", :page_id => project_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> - <% elsif defined?(user_id) %> - <%= link_to l(:button_delete), issue_path(activity.id, :page_classify => "user_page", :page_id => user_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> - <% end %> -
      • -
      • - <%= link_to l(:button_copy), project_copy_issue_path(activity.project, activity), :class => 'postOptionLink' if User.current.allowed_to?(:add_issues, activity.project) %> +<% unless activity.author.nil? %> +
        +
        +
        + <%= link_to image_tag(url_to_avatar(activity.author), :width => "50", :height => "50"), user_path(activity.author_id), :alt => "用户头像" %> + <%= render :partial => 'users/show_detail_info', :locals => {:user => activity.author} %> +
        +
        +
        + <% if activity.try(:author).try(:realname) == ' ' %> + <%= link_to activity.try(:author), user_path(activity.author_id), :class => "newsBlue mr15" %> + <% else %> + <%= link_to activity.try(:author).try(:realname), user_path(activity.author_id), :class => "newsBlue mr15" %> + <% end %> TO + <%= link_to activity.project.name.to_s+" | 项目问题", project_issues_path(activity.project), :class => "newsBlue ml15"%> +
        + <% if User.current.logged? %> +
        +
          +
        • +
            +
          • + <%= link_to l(:button_edit), issue_path(activity.id, :edit => 'true'), :class => 'postOptionLink', :accesskey => accesskey(:edit) if activity.editable? && User.current.allowed_to?(:edit_issues, activity.project) %> +
          • +
          • + <% if !defined?(project_id) && !defined?(user_id) %> + <%= link_to l(:button_delete), issue_path(activity.id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% elsif defined?(project_id) %> + <%= link_to l(:button_delete), issue_path(activity.id, :page_classify => "project_page", :page_id => project_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% elsif defined?(user_id) %> + <%= link_to l(:button_delete), issue_path(activity.id, :page_classify => "user_page", :page_id => user_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% end %> +
          • +
          • + <%= link_to l(:button_copy), project_copy_issue_path(activity.project, activity), :class => 'postOptionLink' if User.current.allowed_to?(:add_issues, activity.project) %> +
          • +
        -
      • -
      -
    - <% end %> -
    - <% case activity.tracker_id %> - <% when 1%> - 【缺陷】 - <% when 2%> - 【功能】 - <% when 3%> - 【支持】 - <% when 4%> - 【任务】 - <% when 5%> - 【周报】 - <% end %> - <%= link_to activity.subject.to_s, issue_path(activity), :class => "postGrey ml5", :target => "_blank" %> - +
    + <% end %> +
    + <% case activity.tracker_id %> + <% when 1%> + 【缺陷】 + <% when 2%> + 【功能】 + <% when 3%> + 【支持】 + <% when 4%> + 【任务】 + <% when 5%> + 【周报】 + <% end %> + <%= link_to activity.subject.to_s, issue_path(activity), :class => "postGrey ml5", :target => "_blank" %> + <%= get_issue_priority(activity.priority_id)[1] %> -
    -
    -
    指派给   - <% unless activity.assigned_to_id.nil? %> - <% if activity.try(:assigned_to).try(:realname) == ' ' %> - <%= link_to activity.try(:assigned_to), user_path(activity.assigned_to_id), :class => "newsBlue mr15" %> - <% else %> - <%= link_to activity.try(:assigned_to).try(:realname), user_path(activity.assigned_to_id), :class => "newsBlue mr15" %> +
    +
    +
    指派给   + <% unless activity.assigned_to_id.nil? %> + <% if activity.try(:assigned_to).try(:realname) == ' ' %> + <%= link_to activity.try(:assigned_to), user_path(activity.assigned_to_id), :class => "newsBlue mr15" %> + <% else %> + <%= link_to activity.try(:assigned_to).try(:realname), user_path(activity.assigned_to_id), :class => "newsBlue mr15" %> + <% end %> + <% end %> +
    +
    + 发布时间: + <%=format_time(activity.created_on) %> +
    +
    + 更新时间:<%= format_time(ForgeActivity.where("forge_act_type='#{activity.class}' and forge_act_id =#{activity.id}").first.updated_at) %> +
    +
    +
    + <%=render :partial =>"users/intro_content", :locals=>{:user_activity_id => user_activity_id, :content => activity.description} %> + + +
    + <%# 局部刷新:修改xissue属性 %> + <% if User.current.member_of?(activity.project) && !activity.nil? && !activity.status.nil? %> + <% unless params[:action] == "index" %> +
    + <%= render :partial => 'users/project_issue_detail', :locals => {:activity => activity} %> +
    <% end %> <% end %> -
    -
    - 发布时间: - <%=format_time(activity.created_on) %> -
    -
    - 更新时间:<%= format_time(ForgeActivity.where("forge_act_type='#{activity.class}' and forge_act_id =#{activity.id}").first.updated_at) %> +
    +
    + <%= render :partial=>"attachments/activity_attach", :locals=>{:activity => activity} %> +
    - <%=render :partial =>"users/intro_content", :locals=>{:user_activity_id => user_activity_id, :content => activity.description} %> - - -
    - <%# 局部刷新:修改xissue属性 %> - <% if User.current.member_of?(activity.project) && !activity.nil? && !activity.status.nil? %> - <% unless params[:action] == "index" %> -
    - <%= render :partial => 'users/project_issue_detail', :locals => {:activity => activity} %> -
    - <% end %> - <% end %> -
    -
    - <%= render :partial=>"attachments/activity_attach", :locals=>{:activity => activity} %> +
    + <%= render :partial => 'users/project_issue_reply', :locals => {:activity => activity, :user_activity_id => user_activity_id} %>
    -
    -
    -
    - <%= render :partial => 'users/project_issue_reply', :locals => {:activity => activity, :user_activity_id => user_activity_id} %> -
    -
    - + +<% end %> + From dd825a6426e89526273484c801361d447571b11e Mon Sep 17 00:00:00 2001 From: cxt Date: Sun, 18 Sep 2016 16:26:47 +0800 Subject: [PATCH 011/102] =?UTF-8?q?config/environments/production.rb=20=20?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E6=96=87=E4=BB=B6=E6=B7=BB=E5=8A=A0=E5=88=B0?= =?UTF-8?q?=E5=BF=BD=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a1f5f7e76..9d33b264c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ /config/configuration.yml /config/additional_environment.rb /config/oneapm.yml +/config/environments/production.rb /files/* From fe431902d70cce85acee1fb1df9a9f2305d46e17 Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Sun, 18 Sep 2016 16:48:20 +0800 Subject: [PATCH 012/102] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=95=99=E8=A8=80?= =?UTF-8?q?=E7=9A=84at=E5=BE=AE=E4=BF=A1=E7=9B=B8=E5=85=B3BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/at_message.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/at_message.rb b/app/models/at_message.rb index 2212ef07e..10afe3e79 100644 --- a/app/models/at_message.rb +++ b/app/models/at_message.rb @@ -99,7 +99,7 @@ class AtMessage < ActiveRecord::Base else type = "journal_for_message" detail_id = topic.id - detail_title = at_message.notes + detail_title = topic.notes.nil? ? "" : topic.notes end else status = -1 From 030056fd0d0a17792446f9d89375abbef0be88db Mon Sep 17 00:00:00 2001 From: huang Date: Sun, 18 Sep 2016 16:51:52 +0800 Subject: [PATCH 013/102] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AE=A8=E8=AE=BA?= =?UTF-8?q?=E5=8C=BA=E9=99=84=E4=BB=B6=E4=B8=8B=E8=BD=BD=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb b/lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb index 20bc0a7ad..acfc28c41 100644 --- a/lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb +++ b/lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb @@ -219,11 +219,7 @@ module Redmine if a && !attachment['is_public_checkbox'] # 考虑到更新操作,所以全部设置为公开,私有项目、课程是不能访问的 - if is_public - a.is_public = true - else - a.is_public = false - end + a.is_public = true elsif a && attachment['is_public_checkbox'] a.is_public = true end From fa82860813408a4498308edcc680b5087ddc1693 Mon Sep 17 00:00:00 2001 From: cxt Date: Sun, 18 Sep 2016 17:01:08 +0800 Subject: [PATCH 014/102] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AE=A8=E8=AE=BA?= =?UTF-8?q?=E5=8C=BA=E5=8A=A8=E6=80=81=E7=9A=84=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 7e9add5e2..bdbaf1738 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1683,7 +1683,7 @@ class UsersController < ApplicationController container_type = 'Project' act_type = 'Issue' when "project_message" - container_type = 'Course' + container_type = 'Project' act_type = 'Message' when "user_journals" container_type = 'Principal' From 7ed7129acee603f4550f221060352c616bda190b Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 19 Sep 2016 14:23:33 +0800 Subject: [PATCH 015/102] =?UTF-8?q?=E7=94=98=E7=89=B9=E5=9B=BE=E5=92=8C?= =?UTF-8?q?=E6=97=A5=E5=8E=86=E6=98=BE=E7=A4=BA=E5=8F=8ACSS=E6=9E=B6?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/base_projects.html.erb | 2 +- app/views/projects/_tools_expand.html.erb | 20 ++++++++++---------- public/stylesheets/css/calendar.css | 0 public/stylesheets/css/gantt.css | 0 4 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 public/stylesheets/css/calendar.css create mode 100644 public/stylesheets/css/gantt.css diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb index d3e72cc5a..11cc8aada 100644 --- a/app/views/layouts/base_projects.html.erb +++ b/app/views/layouts/base_projects.html.erb @@ -12,7 +12,7 @@ <%= favicon %> <%= javascript_heads %> <%= heads_for_theme %> - <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/common','css/structure','scm','css/public', 'css/project','css/popup','prettify','repository' %> + <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/common','css/structure','scm','css/public', 'css/project','css/popup','prettify','repository','css/gantt', 'css/calendar' %> <%= javascript_include_tag 'cookie','project',"avatars", 'header','prettify','select_list_move','attachments' %> <%= call_hook :view_layouts_base_html_head %> diff --git a/app/views/projects/_tools_expand.html.erb b/app/views/projects/_tools_expand.html.erb index 72f095609..414eb16fc 100644 --- a/app/views/projects/_tools_expand.html.erb +++ b/app/views/projects/_tools_expand.html.erb @@ -18,16 +18,16 @@ - - - - - - - - - - +
  • + <% unless @project.enabled_modules.where("name = 'calendar'").empty? %> + <%= link_to l(:project_module_calendar),project_calendar_path(@project) %> + <% end %> +
  • +
  • + <% unless @project.enabled_modules.where("name = 'gantt'").empty? %> + <%= link_to l(:project_module_gantt) ,project_gantt_path(@project) %> + <% end %> +
  • diff --git a/public/stylesheets/css/calendar.css b/public/stylesheets/css/calendar.css new file mode 100644 index 000000000..e69de29bb diff --git a/public/stylesheets/css/gantt.css b/public/stylesheets/css/gantt.css new file mode 100644 index 000000000..e69de29bb From 8d2636e3e6e8218a17489baf98dc710a64741b7f Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 19 Sep 2016 15:43:40 +0800 Subject: [PATCH 016/102] =?UTF-8?q?=E7=94=98=E7=89=B9=E5=9B=BEcss=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/gantts/show.html.erb | 643 ++++++++++++++++--------------- public/stylesheets/css/gantt.css | 177 +++++++++ 2 files changed, 499 insertions(+), 321 deletions(-) diff --git a/app/views/gantts/show.html.erb b/app/views/gantts/show.html.erb index 2808a99cc..f72113841 100644 --- a/app/views/gantts/show.html.erb +++ b/app/views/gantts/show.html.erb @@ -1,321 +1,322 @@ -
    -

    <% @gantt.view = self %> - <%= @query.new_record? ? l(:label_gantt) : h(@query.name) %>

    -
    - -<%= form_tag({:controller => 'gantts', :action => 'show', - :project_id => @project, :month => params[:month], - :year => params[:year], :months => params[:months]}, - :method => :get, :id => 'query_form') do %> -<%= hidden_field_tag 'set_filter', '1' %> -
    "> - <%= l(:label_filter_plural) %> -
    "> - <%= render :partial => 'queries/filters', :locals => {:query => @query} %> -
    -
    - - -

    - <%= gantt_zoom_link(@gantt, :in) %> - <%= gantt_zoom_link(@gantt, :out) %> -

    - -

    -<%= text_field_tag 'months', @gantt.months, :size => 2 %> -<%= l(:label_months_from) %> -<%= select_month(@gantt.month_from, :prefix => "month", :discard_type => true) %> -<%= select_year(@gantt.year_from, :prefix => "year", :discard_type => true) %> -<%= hidden_field_tag 'zoom', @gantt.zoom %> - -<%= link_to_function l(:button_apply), '$("#query_form").submit()', - :class => 'icon icon-checked' %> -<%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, - :class => 'icon icon-reload' %> -

    -<% end %> - -<%= error_messages_for 'query' %> -<% if @query.valid? %> -<% - zoom = 1 - @gantt.zoom.times { zoom = zoom * 2 } - - subject_width = 330 - header_height = 18 - - headers_height = header_height - show_weeks = false - show_days = false - - if @gantt.zoom > 1 - show_weeks = true - headers_height = 2 * header_height - if @gantt.zoom > 2 - show_days = true - headers_height = 3 * header_height - end - end - - # Width of the entire chart - g_width = ((@gantt.date_to - @gantt.date_from + 1) * zoom).to_i - @gantt.render(:top => headers_height + 8, - :zoom => zoom, - :g_width => g_width, - :subject_width => subject_width) - g_height = [(20 * (@gantt.number_of_rows + 6)) + 150, 206].max - t_height = g_height + headers_height -%> - -<% if @gantt.truncated %> -

    <%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %>

    -<% end %> - - - - - - - -
    - <% - style = "" - style += "position:relative;" - style += "height: #{t_height + 24}px;" - style += "width: #{subject_width + 1}px;" - %> - <%= content_tag(:div, :style => style) do %> - <% - style = "" - style += "right:-2px;" - style += "width: #{subject_width}px;" - style += "height: #{headers_height}px;" - style += 'background: #eee;' - %> - <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> - <% - style = "" - style += "right:-2px;" - style += "width: #{subject_width}px;" - style += "height: #{t_height}px;" - style += 'border-left: 1px solid #c0c0c0;' - style += 'overflow: hidden;' - %> - <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> - <%= content_tag(:div, :class => "gantt_subjects") do %> - <%= @gantt.subjects.html_safe %> - <% end %> - <% end %> - -
    -<% - style = "" - style += "width: #{g_width - 1}px;" - style += "height: #{headers_height}px;" - style += 'background: #eee;' -%> -<%= content_tag(:div, ' '.html_safe, :style => style, :class => "gantt_hdr") %> - -<% ###### Months headers ###### %> -<% - month_f = @gantt.date_from - left = 0 - height = (show_weeks ? header_height : header_height + g_height) -%> -<% @gantt.months.times do %> - <% - width = (((month_f >> 1) - month_f) * zoom - 1).to_i - style = "" - style += "left: #{left}px;" - style += "width: #{width}px;" - style += "height: #{height}px;" - %> - <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> - <%= link_to h("#{month_f.year}-#{month_f.month}"), - @gantt.params.merge(:year => month_f.year, :month => month_f.month), - :title => "#{month_name(month_f.month)} #{month_f.year}" %> - <% end %> - <% - left = left + width + 1 - month_f = month_f >> 1 - %> -<% end %> - -<% ###### Weeks headers ###### %> -<% if show_weeks %> - <% - left = 0 - height = (show_days ? header_height - 1 : header_height - 1 + g_height) - %> - <% if @gantt.date_from.cwday == 1 %> - <% - # @date_from is monday - week_f = @gantt.date_from - %> - <% else %> - <% - # find next monday after @date_from - week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1) - width = (7 - @gantt.date_from.cwday + 1) * zoom - 1 - style = "" - style += "left: #{left}px;" - style += "top: 19px;" - style += "width: #{width}px;" - style += "height: #{height}px;" - %> - <%= content_tag(:div, ' '.html_safe, - :style => style, :class => "gantt_hdr") %> - <% left = left + width + 1 %> - <% end %> - <% while week_f <= @gantt.date_to %> - <% - width = ((week_f + 6 <= @gantt.date_to) ? - 7 * zoom - 1 : - (@gantt.date_to - week_f + 1) * zoom - 1).to_i - style = "" - style += "left: #{left}px;" - style += "top: 19px;" - style += "width: #{width}px;" - style += "height: #{height}px;" - %> - <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> - <%= content_tag(:small) do %> - <%= week_f.cweek if width >= 16 %> - <% end %> - <% end %> - <% - left = left + width + 1 - week_f = week_f + 7 - %> - <% end %> -<% end %> - -<% ###### Days headers ####### %> -<% if show_days %> - <% - left = 0 - height = g_height + header_height - 1 - wday = @gantt.date_from.cwday - %> - <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %> - <% - width = zoom - 1 - style = "" - style += "left: #{left}px;" - style += "top:37px;" - style += "width: #{width}px;" - style += "height: #{height}px;" - style += "font-size:0.7em;" - clss = "gantt_hdr" - clss << " nwday" if @gantt.non_working_week_days.include?(wday) - %> - <%= content_tag(:div, :style => style, :class => clss) do %> - <%= day_letter(wday) %> - <% end %> - <% - left = left + width + 1 - wday = wday + 1 - wday = 1 if wday > 7 - %> - <% end %> -<% end %> - -<%= @gantt.lines.html_safe %> - -<% ###### Today red line (excluded from cache) ###### %> -<% if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %> - <% - today_left = (((Date.today - @gantt.date_from + 1) * zoom).floor() - 1).to_i - style = "" - style += "position: absolute;" - style += "height: #{g_height}px;" - style += "top: #{headers_height + 1}px;" - style += "left: #{today_left}px;" - style += "width:10px;" - style += "border-left: 1px dashed red;" - %> - <%= content_tag(:div, ' '.html_safe, :style => style, :id => 'today_line') %> -<% end %> -<% - style = "" - style += "position: absolute;" - style += "height: #{g_height}px;" - style += "top: #{headers_height + 1}px;" - style += "left: 0px;" - style += "width: #{g_width - 1}px;" -%> -<%= content_tag(:div, '', :style => style, :id => "gantt_draw_area") %> -
    -
    - - - - - - -
    - <%= link_to_content_update("\xc2\xab " + l(:label_previous), - params.merge(@gantt.params_previous)) %> - - <%= link_to_content_update(l(:label_next) + " \xc2\xbb", - params.merge(@gantt.params_next)) %> -
    - -<% other_formats_links do |f| %> - <%= f.link_to 'PDF', :url => params.merge(@gantt.params) %> - <%= f.link_to('PNG', :url => params.merge(@gantt.params)) if @gantt.respond_to?('to_image') %> -<% end %> -<% end # query.valid? %> - -<% content_for :sidebar do %> - <%= render :partial => 'issues/sidebar' %> -<% end %> - -<% html_title(l(:label_gantt)) -%> - -<% content_for :header_tags do %> - <%= javascript_include_tag 'raphael' %> - <%= javascript_include_tag 'gantt' %> -<% end %> - -<%= javascript_tag do %> - var issue_relation_type = <%= raw Redmine::Helpers::Gantt::DRAW_TYPES.to_json %>; - $(document).ready(drawGanttHandler); - $(window).resize(drawGanttHandler); - $(function() { - $("#draw_rels").change(drawGanttHandler); - $("#draw_progress_line").change(drawGanttHandler); - }); -<% end %> +
    +

    <% @gantt.view = self %> + <%= @query.new_record? ? l(:label_gantt) : h(@query.name) %>

    +
    + +<%= form_tag({:controller => 'gantts', :action => 'show', + :project_id => @project, :month => params[:month], + :year => params[:year], :months => params[:months]}, + :method => :get, :id => 'query_form') do %> +<%= hidden_field_tag 'set_filter', '1' %> +
    "> + <%= l(:label_filter_plural) %> +
    "> + <%= render :partial => 'queries/filters', :locals => {:query => @query} %> +
    +
    + + +

    + <%= gantt_zoom_link(@gantt, :in) %> + <%= gantt_zoom_link(@gantt, :out) %> +

    + +

    +<%= text_field_tag 'months', @gantt.months, :size => 2 %> +<%= l(:label_months_from) %> +<%= select_month(@gantt.month_from, :prefix => "month", :discard_type => true) %> +<%= select_year(@gantt.year_from, :prefix => "year", :discard_type => true) %> +<%= hidden_field_tag 'zoom', @gantt.zoom %> + +<%= link_to_function l(:button_apply), '$("#query_form").submit()', + :class => 'icon icon-checked' %> +<%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, + :class => 'icon icon-reload' %> +

    +<% end %> + +<%= error_messages_for 'query' %> +<% if @query.valid? %> +<% + zoom = 1 + @gantt.zoom.times { zoom = zoom * 2 } + + subject_width = 330 + header_height = 18 + + headers_height = header_height + show_weeks = false + show_days = false + + if @gantt.zoom > 1 + show_weeks = true + headers_height = 2 * header_height + if @gantt.zoom > 2 + show_days = true + headers_height = 3 * header_height + end + end + + # Width of the entire chart + g_width = ((@gantt.date_to - @gantt.date_from + 1) * zoom).to_i + @gantt.render(:top => headers_height + 8, + :zoom => zoom, + :g_width => g_width, + :subject_width => subject_width) + g_height = [(20 * (@gantt.number_of_rows + 6)) + 150, 206].max + t_height = g_height + headers_height +%> + +<% if @gantt.truncated %> +

    <%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %>

    +<% end %> + + + + + + + +
    + <% + style = "" + style += "position:relative;" + style += "height: #{t_height + 24}px;" + style += "width: #{subject_width + 1}px;" + %> + <%= content_tag(:div, :style => style) do %> + <% + style = "" + style += "right:-2px;" + style += "width: #{subject_width}px;" + style += "height: #{headers_height}px;" + style += 'background: #eee;' + style += 'z-index: 1;' + %> + <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> + <% + style = "" + style += "right:-2px;" + style += "width: #{subject_width}px;" + style += "height: #{t_height}px;" + style += 'border-left: 1px solid #c0c0c0;' + style += 'overflow: hidden;' + %> + <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> + <%= content_tag(:div, :class => "gantt_subjects") do %> + <%= @gantt.subjects.html_safe %> + <% end %> + <% end %> + +
    +<% + style = "" + style += "width: #{g_width - 1}px;" + style += "height: #{headers_height}px;" + style += 'background: #eee;' +%> +<%= content_tag(:div, ' '.html_safe, :style => style, :class => "gantt_hdr") %> + +<% ###### Months headers ###### %> +<% + month_f = @gantt.date_from + left = 0 + height = (show_weeks ? header_height : header_height + g_height) +%> +<% @gantt.months.times do %> + <% + width = (((month_f >> 1) - month_f) * zoom - 1).to_i + style = "" + style += "left: #{left}px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> + <%= link_to h("#{month_f.year}-#{month_f.month}"), + @gantt.params.merge(:year => month_f.year, :month => month_f.month), + :title => "#{month_name(month_f.month)} #{month_f.year}" %> + <% end %> + <% + left = left + width + 1 + month_f = month_f >> 1 + %> +<% end %> + +<% ###### Weeks headers ###### %> +<% if show_weeks %> + <% + left = 0 + height = (show_days ? header_height - 1 : header_height - 1 + g_height) + %> + <% if @gantt.date_from.cwday == 1 %> + <% + # @date_from is monday + week_f = @gantt.date_from + %> + <% else %> + <% + # find next monday after @date_from + week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1) + width = (7 - @gantt.date_from.cwday + 1) * zoom - 1 + style = "" + style += "left: #{left}px;" + style += "top: 19px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, ' '.html_safe, + :style => style, :class => "gantt_hdr") %> + <% left = left + width + 1 %> + <% end %> + <% while week_f <= @gantt.date_to %> + <% + width = ((week_f + 6 <= @gantt.date_to) ? + 7 * zoom - 1 : + (@gantt.date_to - week_f + 1) * zoom - 1).to_i + style = "" + style += "left: #{left}px;" + style += "top: 19px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + %> + <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> + <%= content_tag(:small) do %> + <%= week_f.cweek if width >= 16 %> + <% end %> + <% end %> + <% + left = left + width + 1 + week_f = week_f + 7 + %> + <% end %> +<% end %> + +<% ###### Days headers ####### %> +<% if show_days %> + <% + left = 0 + height = g_height + header_height - 1 + wday = @gantt.date_from.cwday + %> + <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %> + <% + width = zoom - 1 + style = "" + style += "left: #{left}px;" + style += "top:37px;" + style += "width: #{width}px;" + style += "height: #{height}px;" + style += "font-size:0.7em;" + clss = "gantt_hdr" + clss << " nwday" if @gantt.non_working_week_days.include?(wday) + %> + <%= content_tag(:div, :style => style, :class => clss) do %> + <%= day_letter(wday) %> + <% end %> + <% + left = left + width + 1 + wday = wday + 1 + wday = 1 if wday > 7 + %> + <% end %> +<% end %> + +<%= @gantt.lines.html_safe %> + +<% ###### Today red line (excluded from cache) ###### %> +<% if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %> + <% + today_left = (((Date.today - @gantt.date_from + 1) * zoom).floor() - 1).to_i + style = "" + style += "position: absolute;" + style += "height: #{g_height}px;" + style += "top: #{headers_height + 1}px;" + style += "left: #{today_left}px;" + style += "width:10px;" + style += "border-left: 1px dashed red;" + %> + <%= content_tag(:div, ' '.html_safe, :style => style, :id => 'today_line') %> +<% end %> +<% + style = "" + style += "position: absolute;" + style += "height: #{g_height}px;" + style += "top: #{headers_height + 1}px;" + style += "left: 0px;" + style += "width: #{g_width - 1}px;" +%> +<%= content_tag(:div, '', :style => style, :id => "gantt_draw_area") %> +
    +
    + + + + + + +
    + <%= link_to_content_update("\xc2\xab " + l(:label_previous), + params.merge(@gantt.params_previous)) %> + + <%= link_to_content_update(l(:label_next) + " \xc2\xbb", + params.merge(@gantt.params_next)) %> +
    + +<% other_formats_links do |f| %> + <%= f.link_to 'PDF', :url => params.merge(@gantt.params) %> + <%= f.link_to('PNG', :url => params.merge(@gantt.params)) if @gantt.respond_to?('to_image') %> +<% end %> +<% end # query.valid? %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + +<% html_title(l(:label_gantt)) -%> + +<% content_for :header_tags do %> + <%= javascript_include_tag 'raphael' %> + <%= javascript_include_tag 'gantt' %> +<% end %> + +<%= javascript_tag do %> + var issue_relation_type = <%= raw Redmine::Helpers::Gantt::DRAW_TYPES.to_json %>; + $(document).ready(drawGanttHandler); + $(window).resize(drawGanttHandler); + $(function() { + $("#draw_rels").change(drawGanttHandler); + $("#draw_progress_line").change(drawGanttHandler); + }); +<% end %> diff --git a/public/stylesheets/css/gantt.css b/public/stylesheets/css/gantt.css index e69de29bb..d0ab0e4f2 100644 --- a/public/stylesheets/css/gantt.css +++ b/public/stylesheets/css/gantt.css @@ -0,0 +1,177 @@ +fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; } +fieldset.collapsible>legend { padding-left: 16px; background: url(/images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; } +fieldset.collapsible.collapsed>legend { background-image: url(/images/arrow_collapsed.png); } + +/***** Gantt chart *****/ +.gantt_hdr { + position:absolute; + top:0; + height:16px; + border-top: 1px solid #c0c0c0; + border-bottom: 1px solid #c0c0c0; + border-right: 1px solid #c0c0c0; + text-align: center; + overflow: hidden; +} + +.gantt_hdr.nwday {background-color:#f1f1f1;} + +.gantt_subjects { font-size: 0.8em; } +.gantt_subjects div { line-height:16px;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; } + +.task { + position: absolute; + height:8px; + font-size:0.8em; + color:#888; + padding:0; + margin:0; + line-height:16px; + white-space:nowrap; +} + +.task.label {width:100%;} +.task.label.project, .task.label.version { font-weight: bold; } + +.task_late { background:#f66 url(/images/task_late.png); border: 1px solid #f66; } +.task_done { background:#00c600 url(/images/task_done.png); border: 1px solid #00c600; } +.task_todo { background:#aaa url(/images/task_todo.png); border: 1px solid #aaa; } + +.task_todo.parent { background: #888; border: 1px solid #888; height: 3px;} +.task_late.parent, .task_done.parent { height: 3px;} +.task.parent.marker.starting { position: absolute; background: url(/images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;} +.task.parent.marker.ending { position: absolute; background: url(/images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; right: 0px; top: -1px;} + +.version.task_late { background:#f66 url(/images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;} +.version.task_done { background:#00c600 url(/images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;} +.version.task_todo { background:#fff url(/images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;} +.version.marker { background-image:url(/images/version_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; } + +.project.task_late { background:#f66 url(/images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;} +.project.task_done { background:#00c600 url(/images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;} +.project.task_todo { background:#fff url(/images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;} +.project.marker { background-image:url(/images/project_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; } + +.version-behind-schedule a, .issue-behind-schedule a {color: #f66914;} +.version-overdue a, .issue-overdue a, .project-overdue a {color: #f00;} +/*end*/ + +dt.issue { background-image: url(/images/ticket.png); } +dt.issue-edit { background-image: url(/images/ticket_edit.png); } +dt.issue-closed { background-image: url(/images/ticket_checked.png); } +dt.issue-note { background-image: url(/images/ticket_note.png); } +dt.changeset { background-image: url(/images/changeset.png); } +dt.news { background-image: url(/images/news.png); } +dt.message { background-image: url(/images/message.png); } +dt.reply { background-image: url(/images/comments.png); } +dt.wiki-page { background-image: url(/images/wiki_edit.png); } +dt.attachment { background-image: url(/images/attachment.png); } +dt.document { background-image: url(/images/document.png); } +dt.project { background-image: url(/images/projects.png); } +dt.time-entry { background-image: url(/images/time.png); } + +/***** Icons *****/ +.icon { + background-position: 0% 50%; + background-repeat: no-repeat; + font-family: '微软雅黑'; /*modify by men*/ + padding-left: 20px; + padding-top: 2px; + padding-bottom: 3px; +} +.icon_enterprise { + background-position: 0% 50%; + background-repeat: no-repeat; + font-family: '微软雅黑'; /*modify by men*/ + padding-left: 20px; + padding-top: 2px; + padding-bottom: 3px; +} +.icon_enterprise-add { background-image: url(/images/add_enterprise.png); } +.icon-add { background-image: url(/images/add.png); } +.icon-edit { /*background-image: url(../images/edit.png);*/ } +.icon-copy { background-image: url(/images/copy.png); } +.icon-duplicate { background-image: url(/images/duplicate.png); } +.icon-del { /*background-image: url(../images/delete.png); */} +.icon-move { background-image: url(/images/move.png); } +.icon-save { background-image: url(/images/save.png); } +.icon-cancel { background-image: url(/images/cancel.png); } +.icon-multiple { background-image: url(/images/table_multiple.png); } +.icon-folder { background-image: url(/images/folder.png); } +.open .icon-folder { background-image: url(/images/folder_open.png); } +.icon-package { background-image: url(/images/package.png); } +.icon-user { background-image: url(/images/user.png); } +.icon-projects { background-image: url(/images/projects.png); } +.icon-help { background-image: url(/images/help.png); } +.icon-attachment { background-image: url(/images/attachment.png);padding-left: 20px !important; } +.icon-history { background-image: url(/images/history.png); } +.icon-time { background-image: url(/images/time.png); } +.icon-time-add { background-image: url(/images/time_add.png); } +.icon-stats { background-image: url(/images/stats.png); } +.icon-warning { background-image: url(/images/warning.png); } +.icon-fav { background-image: url(/images/fav.png); } +.icon-fav-off { background-image: url(/images/fav_off.png); } +.icon-reload { background-image: url(/images/reload.png); } +.icon-lock { background-image: url(/images/locked.png); } +.icon-unlock { background-image: url(/images/unlock.png); } +.icon-checked { background-image: url(/images/true.png); } +.icon-details { background-image: url(/images/zoom_in.png); } +.icon-report { background-image: url(/images/report.png); } +.icon-comment { /*background-image: url(../images/comment.png); */} +.icon-summary { background-image: url(/images/lightning.png); } +.icon-server-authentication { background-image: url(/images/server_key.png); } +.icon-issue { background-image: url(/images/ticket.png); } +.icon-zoom-in { background-image: url(/images/zoom_in.png); } +.icon-zoom-out { background-image: url(/images/zoom_out.png); } +.icon-passwd { background-image: url(/images/textfield_key.png); } +.icon-test { background-image: url(/images/bullet_go.png); } + +.icon-file { background-image: url(/images/files/default.png); } +.icon-file.text-plain { background-image: url(/images/files/text.png); } +.icon-file.text-x-c { background-image: url(/images/files/c.png); } +.icon-file.text-x-csharp { background-image: url(/images/files/csharp.png); } +.icon-file.text-x-java { background-image: url(/images/files/java.png); } +.icon-file.text-x-javascript { background-image: url(/images/files/js.png); } +.icon-file.text-x-php { background-image: url(/images/files/php.png); } +.icon-file.text-x-ruby { background-image: url(/images/files/ruby.png); } +.icon-file.text-xml { background-image: url(/images/files/xml.png); } +.icon-file.text-css { background-image: url(/images/files/css.png); } +.icon-file.text-html { background-image: url(/images/files/html.png); } +.icon-file.image-gif { background-image: url(/images/files/image.png); } +.icon-file.image-jpeg { background-image: url(/images/files/image.png); } +.icon-file.image-png { background-image: url(/images/files/image.png); } +.icon-file.image-tiff { background-image: url(/images/files/image.png); } +.icon-file.application-pdf { background-image: url(/images/files/pdf.png); } +.icon-file.application-zip { background-image: url(/images/files/zip.png); } +.icon-file.application-x-gzip { background-image: url(/images/files/zip.png); } + +img.gravatar { + padding: 2px; + border: solid 1px #d5d5d5; + background: #fff; + vertical-align: middle; +} + +div.issue img.gravatar { + float: left; + margin: 0 6px 0 0; + padding: 5px; +} + +div.issue table img.gravatar { + height: 14px; + width: 14px; + padding: 2px; + float: left; + margin: 0 0.5em 0 0; +} + +h2 img.gravatar {margin: -2px 4px -4px 0;} +h3 img.gravatar {margin: -4px 4px -4px 0;} +h4 img.gravatar {margin: -6px 4px -4px 0;} +td.username img.gravatar {margin: 0 0.5em 0 0; vertical-align: top;} +#activity dt img.gravatar {float: left; margin: 0 1em 1em 0;} +/* Used on 12px Gravatar img tags without the icon background */ +.icon-gravatar {float: left; margin-right: 4px;} + +.buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; } \ No newline at end of file From 8e6a88f7d89f983c30320c29f7430c94b7b07ca1 Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 19 Sep 2016 16:19:59 +0800 Subject: [PATCH 017/102] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=97=A5=E5=8E=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/issues_helper.rb | 9 +++++ app/views/common/_calendar.html.erb | 3 +- config/locales/projects/zh.yml | 3 ++ public/stylesheets/css/calendar.css | 53 +++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 5a124849f..489854ead 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -57,6 +57,15 @@ module IssuesHelper "#{@cached_label_priority}: #{h(issue.priority.name)}".html_safe end + def states_done_ratio(issue) + done_ratio = issue.done_ratio + if done_ratio == 100 + "#{l(:label_done_ratio_endding)}".html_safe + else + "#{l(:label_done_ratio_doing)}".html_safe + end + end + def issue_heading(issue) #h("#{issue.tracker} ##{issue.id}") # h("#{issue.tracker} #{issue.source_from}") diff --git a/app/views/common/_calendar.html.erb b/app/views/common/_calendar.html.erb index e4ce4da2c..b2aad3812 100644 --- a/app/views/common/_calendar.html.erb +++ b/app/views/common/_calendar.html.erb @@ -1,4 +1,4 @@ - +
    @@ -20,6 +20,7 @@
    <%= h("#{i.project} -") unless @project && @project == i.project %> <%= link_to_issue i, :truncate => 30 %> + (<%= states_done_ratio i %>) <%= render_issue_tooltip i %>
    <% else %> diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 792ff35fd..de3a83e19 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -462,3 +462,6 @@ zh: label_state_open: 待处理 label_state_closed: 关闭 label_state_merged: 已合并 + + label_done_ratio_endding: 已完成 + label_done_ratio_doing: 未完成 diff --git a/public/stylesheets/css/calendar.css b/public/stylesheets/css/calendar.css index e69de29bb..11cd99637 100644 --- a/public/stylesheets/css/calendar.css +++ b/public/stylesheets/css/calendar.css @@ -0,0 +1,53 @@ +/***** Calendar *****/ +table#calender td{padding: 2px;} +table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;} +table.cal thead th {width: 14%; background-color:#EEEEEE; padding: 4px; } +table.cal thead th.week-number {width: auto;} +table.cal tbody tr {height: 100px;} +table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;} +table.cal td.week-number { background-color:#EEEEEE; padding: 4px; border:none; font-size: 1em;} +table.cal td p.day-num {font-size: 1.1em; text-align:right;} +table.cal td.odd p.day-num {color: #bbb;} +table.cal td.today {background:#ffffdd;} +table.cal td.today p.day-num {font-weight: bold;} +table.cal .starting a, p.cal.legend .starting {background: url(/images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;} +table.cal .ending a, p.cal.legend .ending {background: url(/images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;} +table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(/images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;} +p.cal.legend span {display:block;} + +/***** Tooltips ******/ +.tooltip{position:relative;z-index:24;} +.tooltip:hover{z-index:25;color:#000;} +.tooltip span.tip{display: none; text-align:left;} + +div.tooltip:hover span.tip{ + display:block; + position:absolute; + top:12px; left:24px; width:270px; + border:1px solid #555; + background-color:#fff; + padding: 4px; + font-size: 0.8em; + color:#505050; +} + +img.ui-datepicker-trigger { + display: block; + background: url(/images/public_icon.png) -31px 0 no-repeat; + cursor: pointer; + vertical-align: middle; + margin-left: 5px; + margin-top: 5px; + width: 16px; + height: 15px; + float: left; +} + +div.issue {background:#FFFFEC; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;} +.tooltip{position:relative;z-index:24;} +.tooltip:hover{z-index:25;color:#000;} +.tooltip span.tip{display: none; text-align:left;} +.task.parent.marker.starting { position: absolute; background: url(/images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;} + +/*.icon*/ +.icon-package { background-image: url(/images/package.png); } \ No newline at end of file From ba4a1c64d9e18ebc8609f73615dc8a899fe359d2 Mon Sep 17 00:00:00 2001 From: cxt Date: Mon, 19 Sep 2016 17:14:14 +0800 Subject: [PATCH 018/102] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E7=9A=84=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/homework_common_controller.rb | 58 ++++++++----------- app/controllers/student_work_controller.rb | 15 ++--- app/controllers/users_controller.rb | 13 ++--- app/controllers/words_controller.rb | 11 ++-- app/helpers/application_helper.rb | 6 +- app/helpers/homework_common_helper.rb | 6 +- app/views/courses/_course_activity.html.erb | 2 +- .../_user_homework_search_list.html.erb | 2 +- app/views/courses/homework_search.js.erb | 4 +- .../homework_common/_alert_anonyoms.html.erb | 2 +- .../_alert_open_student_works.html.erb | 2 +- .../_homework_index_list.html.erb | 2 +- .../_set_evalutation_att.html.erb | 2 +- .../alert_forbidden_anonymous_comment.js.erb | 2 +- app/views/homework_common/edit.html.erb | 15 ++--- .../homework_common/open_student_works.js.erb | 9 ++- .../homework_common/score_rule_set.js.erb | 2 +- .../set_evaluation_attr.js.erb | 5 +- .../start_anonymous_comment.js.erb | 12 ++-- .../start_evaluation_set.js.erb | 2 +- .../stop_anonymous_comment.js.erb | 10 ++-- .../organizations/_org_activities.html.erb | 2 +- .../_alert_forbidden_anonymous.html.erb | 2 +- .../student_work/_relate_project.html.erb | 2 +- .../student_work/_set_score_rule.html.erb | 2 +- .../student_work/cancel_relate_project.js.erb | 11 ++-- .../forbidden_anonymous_comment.js.erb | 9 ++- app/views/student_work/set_score_rule.js.erb | 5 +- .../student_work/student_work_project.js.erb | 11 ++-- app/views/users/_course_homework.html.erb | 47 +++++++++------ app/views/users/_news_replies.html.erb | 4 +- app/views/users/_reply_banner.html.erb | 8 +-- app/views/users/_reply_to.html.erb | 3 +- app/views/users/_user_activities.html.erb | 2 +- app/views/users/_user_homework_list.html.erb | 11 +--- app/views/users/_user_homeworks_old.html.erb | 47 --------------- app/views/users/all_journals.js.erb | 2 +- app/views/words/destroy.js.erb | 9 ++- app/views/words/leave_homework_message.js.erb | 13 ++--- app/views/words/reply_to_homework.js.erb | 7 +-- public/javascripts/application.js | 5 +- 41 files changed, 149 insertions(+), 235 deletions(-) delete mode 100644 app/views/users/_user_homeworks_old.html.erb diff --git a/app/controllers/homework_common_controller.rb b/app/controllers/homework_common_controller.rb index b8c6a4a0a..b5d55df28 100644 --- a/app/controllers/homework_common_controller.rb +++ b/app/controllers/homework_common_controller.rb @@ -58,10 +58,9 @@ class HomeworkCommonController < ApplicationController def edit @user = User.current - @is_in_course = params[:is_in_course] + @hw_status = params[:hw_status].to_i @is_manage = params[:is_manage] - @course_activity = params[:course_activity].to_i - if @is_in_course.to_i == 1 || @course_activity == 1 + if @hw_status != 1 @left_nav_type = 3 respond_to do |format| format.html{render :layout => 'base_courses'} @@ -160,18 +159,17 @@ class HomeworkCommonController < ApplicationController create_works_list @homework end + @hw_status = params[:hw_status].to_i if params[:is_manage] == "1" redirect_to manage_or_receive_homeworks_user_path(User.current.id) elsif params[:is_manage] == "2" redirect_to my_homeworks_user_path(User.current.id) - elsif params[:is_in_course] == "1" - redirect_to homework_common_index_path(:course => @course.id) - elsif params[:is_in_course] == "0" - redirect_to user_homeworks_user_path(User.current.id) - elsif params[:is_in_course] == "-1" && params[:course_activity] == "0" + elsif @hw_status == 1 redirect_to user_path(User.current.id) - elsif params[:is_in_course] == "-1" && params[:course_activity] == "1" + elsif @hw_status == 2 redirect_to course_path(@course.id) + else + redirect_to homework_common_index_path(:course => @course.id) end end end @@ -181,14 +179,13 @@ class HomeworkCommonController < ApplicationController if @homework.destroy respond_to do |format| format.html { - if params[:is_in_course] == "1" - redirect_to homework_common_index_path(:course => @course.id) - elsif params[:is_in_course] == "0" - redirect_to user_homeworks_user_path(User.current.id) - elsif params[:is_in_course] == "-1" && params[:course_activity] == "0" - redirect_to user_path(User.current.id) - elsif params[:is_in_course] == "-1" && params[:course_activity] == "1" - redirect_to course_path(@course.id) + @hw_status = params[:hw_status].to_i + if @hw_status == 1 + redirect_to user_path(User.current.id) + elsif @hw_status == 2 + redirect_to course_path(@course.id) + else + redirect_to homework_common_index_path(:course => @course.id) end } end @@ -246,8 +243,7 @@ class HomeworkCommonController < ApplicationController @statue = 3 end @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i end #关闭匿评 @@ -265,8 +261,7 @@ class HomeworkCommonController < ApplicationController send_message_anonymous_comment(@homework, m_status = 3) Mailer.send_mail_anonymous_comment_close(@homework).deliver @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i respond_to do |format| format.js end @@ -294,8 +289,7 @@ class HomeworkCommonController < ApplicationController end @percent = format("%.2f",(@cur_size.to_f / ( @totle_size == 0 ? 1 : @totle_size)) * 100) @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i respond_to do |format| format.js end @@ -307,8 +301,7 @@ class HomeworkCommonController < ApplicationController else @user_activity_id = -1 end - @is_in_course = params[:is_in_course] if params[:is_in_course] - @course_activity = params[:course_activity] if params[:course_Activity] + @hw_status = params[:hw_status].to_i respond_to do |format| format.js end @@ -321,8 +314,7 @@ class HomeworkCommonController < ApplicationController @homework.update_column('is_open', 0) end @user_activity_id = params[:user_activity_id] - @is_in_course = params[:is_in_course] if params[:is_in_course] - @course_activity = params[:course_activity] if params[:course_Activity] + @hw_status = params[:hw_status].to_i end def alert_open_student_works @@ -331,8 +323,7 @@ class HomeworkCommonController < ApplicationController else @user_activity_id = -1 end - @is_in_course = params[:is_in_course] if params[:is_in_course] - @course_activity = params[:course_activity] if params[:course_Activity] + @hw_status = params[:hw_status].to_i respond_to do |format| format.js end @@ -363,8 +354,7 @@ class HomeworkCommonController < ApplicationController else @user_activity_id = -1 end - @is_in_course = params[:is_in_course] - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i end #设置匿评参数 @@ -381,8 +371,7 @@ class HomeworkCommonController < ApplicationController @homework_detail_manual.evaluation_num = params[:evaluation_num] @homework_detail_manual.save @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i end end @@ -393,8 +382,7 @@ class HomeworkCommonController < ApplicationController else @user_activity_id = -1 end - @is_in_course = params[:is_in_course] - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i end private diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index f6a97e66c..b259737a1 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -1012,8 +1012,7 @@ class StudentWorkController < ApplicationController redirect_to student_work_index_url(:homework => @homework.id) else @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i respond_to do |format| format.js end @@ -1035,8 +1034,7 @@ class StudentWorkController < ApplicationController student_work.save end @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i end def revise_attachment @@ -1058,8 +1056,7 @@ class StudentWorkController < ApplicationController def new_student_work_project @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i respond_to do |format| format.js end @@ -1078,8 +1075,7 @@ class StudentWorkController < ApplicationController @project.is_leader = 1 if @project.save @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i respond_to do |format| format.js end @@ -1129,8 +1125,7 @@ class StudentWorkController < ApplicationController relate_pro = StudentWorkProject.where("user_id = #{User.current.id} and homework_common_id = #{@homework.id}").first if relate_pro.destroy @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i respond_to do |format| format.js end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index bdbaf1738..87dc127a0 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -115,8 +115,7 @@ class UsersController < ApplicationController else @user_activity_id = -1 end - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i when 'JournalsForMessage' @reply = JournalsForMessage.find params[:reply_id] @user_activity_id = params[:user_activity_id] @@ -1123,11 +1122,8 @@ class UsersController < ApplicationController quotes_homework = HomeworkCommon.find params[:quotes].to_i quotes_homework.update_column(:quotes, quotes_homework.quotes+1) end - if params[:is_in_course] == "1" - redirect_to homework_common_index_path(:course => homework.course_id) - else - redirect_to user_homeworks_user_path(User.current.id) - end + + redirect_to homework_common_index_path(:course => homework.course_id) end end else @@ -3573,8 +3569,7 @@ class UsersController < ApplicationController obj = HomeworkCommon.where('id = ?', params[:id].to_i).first @type = 'HomeworkCommon' @journals = obj.journals_for_messages.reorder("created_on desc") - @is_in_course = params[:is_in_course].to_i if params[:is_in_course] - @course_activity = params[:course_activity].to_i if params[:course_activity] + @hw_status = params[:hw_status].to_i if params[:hw_status] @is_teacher = User.current.allowed_to?(:as_teacher,obj.course) @user_activity_id = params[:user_activity_id].to_i if params[:user_activity_id] end diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb index 499272706..f1bfc7a31 100644 --- a/app/controllers/words_controller.rb +++ b/app/controllers/words_controller.rb @@ -110,8 +110,7 @@ class WordsController < ApplicationController else @user_activity_id = -1 end - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i elsif @journal_destroyed.jour_type == 'Syllabus' @syllabus = Syllabus.find @journal_destroyed.jour_id @count = @syllabus.journals_for_messages.count @@ -308,9 +307,8 @@ class WordsController < ApplicationController update_org_activity(@homework_common.class,@homework_common.id) respond_to do |format| format.js{ - @user_activity_id = params[:user_activity_id] - @is_in_course = params[:is_in_course] - @course_activity = params[:course_activity] + @user_activity_id = params[:user_activity_id].to_i + @hw_status = params[:hw_status].to_i @homework_common_id = params[:homework_common_id] } end @@ -344,8 +342,7 @@ class WordsController < ApplicationController respond_to do |format| format.js{ @user_activity_id = params[:user_activity_id].to_i - @is_in_course = params[:is_in_course].to_i - @course_activity = params[:course_activity].to_i + @hw_status = params[:hw_status].to_i } end else diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index d3b28fb20..d9a694eaa 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -2689,15 +2689,15 @@ module ApplicationHelper end #获取匿评相关连接代码 - def homework_anonymous_comment (homework, is_in_course, user_activity_id = -1, course_activity = -1) + def homework_anonymous_comment (homework, hw_status, user_activity_id = -1) if homework.homework_detail_manual.comment_status == 0 ||Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") link = link_to "启动匿评","javascript:void(0)", :class => "postOptionLink", :title => "作业截止日期之前不可以启动匿评" elsif homework.student_works.has_committed.count >= 2 && homework.homework_detail_manual#作业份数大于2 case homework.homework_detail_manual.comment_status when 1 - link = link_to '启动匿评', Setting.protocol + "://" + Setting.host_name + "/homework_common/" + homework.id.to_s + "/alert_anonymous_comment?is_in_course=" + is_in_course.to_s + "&user_activity_id=" + user_activity_id.to_s + "&course_activity=" + course_activity.to_s, id: "#{homework.id}_start_anonymous_comment", remote: true, disable_with: '加载中...',:class => 'postOptionLink' + link = link_to '启动匿评', Setting.protocol + "://" + Setting.host_name + "/homework_common/" + homework.id.to_s + "/alert_anonymous_comment?hw_status=" + hw_status.to_s + "&user_activity_id=" + user_activity_id.to_s, id: "#{homework.id}_start_anonymous_comment", remote: true, disable_with: '加载中...',:class => 'postOptionLink' when 2 - link = link_to '关闭匿评', Setting.protocol + "://" + Setting.host_name + "/homework_common/" + homework.id.to_s + "/alert_anonymous_comment?is_in_course=" + is_in_course.to_s + "&user_activity_id=" + user_activity_id.to_s + "&course_activity=" + course_activity.to_s, id: "#{homework.id}_stop_anonymous_comment", remote: true,:class => 'postOptionLink' + link = link_to '关闭匿评', Setting.protocol + "://" + Setting.host_name + "/homework_common/" + homework.id.to_s + "/alert_anonymous_comment?hw_status=" + hw_status.to_s + "&user_activity_id=" + user_activity_id.to_s, id: "#{homework.id}_stop_anonymous_comment", remote: true,:class => 'postOptionLink' when 3 # link = link_to "匿评结束","javascript:void(0)", :class => "postOptionLink", :title => "匿评结束" end diff --git a/app/helpers/homework_common_helper.rb b/app/helpers/homework_common_helper.rb index 2d3c72c20..d79a7a432 100644 --- a/app/helpers/homework_common_helper.rb +++ b/app/helpers/homework_common_helper.rb @@ -57,12 +57,12 @@ module HomeworkCommonHelper end #根据传入作业确定跳转到开启匿评还是关闭匿评功能 - def alert_anonyoms_path homework,homework_detail_manual,user_activity_id,is_in_course,course_activity + def alert_anonyoms_path homework,homework_detail_manual,user_activity_id,hw_status link = "" if homework_detail_manual.comment_status == 1 - link = start_anonymous_comment_homework_common_url homework.id,:user_activity_id=>user_activity_id,:is_in_course=>is_in_course,:course_activity=>course_activity + link = start_anonymous_comment_homework_common_url homework.id,:user_activity_id=>user_activity_id,:hw_status=>hw_status elsif homework_detail_manual.comment_status == 2 - link = stop_anonymous_comment_homework_common_url homework.id,:user_activity_id=>user_activity_id,:is_in_course=>is_in_course,:course_activity=>course_activity + link = stop_anonymous_comment_homework_common_url homework.id,:user_activity_id=>user_activity_id,:hw_status=>hw_status end link end diff --git a/app/views/courses/_course_activity.html.erb b/app/views/courses/_course_activity.html.erb index c71e5ade4..a7f99f2b0 100644 --- a/app/views/courses/_course_activity.html.erb +++ b/app/views/courses/_course_activity.html.erb @@ -60,7 +60,7 @@ <% act = activity.course_act %> <% case activity.course_act_type.to_s %> <% when 'HomeworkCommon' %> - <%= render :partial => 'users/course_homework', :locals => {:activity => act, :user_activity_id => activity.id, :course_activity => 1} %> + <%= render :partial => 'users/course_homework', :locals => {:activity => act, :user_activity_id => activity.id, :hw_status => 2} %> <% when 'News' %> <%= render :partial => 'users/course_news', :locals => {:activity => act, :user_activity_id => activity.id} %> <% when 'Message' %> diff --git a/app/views/courses/_user_homework_search_list.html.erb b/app/views/courses/_user_homework_search_list.html.erb index 750e7537c..ecc0d1d7e 100644 --- a/app/views/courses/_user_homework_search_list.html.erb +++ b/app/views/courses/_user_homework_search_list.html.erb @@ -26,7 +26,7 @@ } } - <%= render :partial => 'users/user_homework_detail', :locals => {:homework_common => homework_common,:is_in_course => is_in_course} %> + <%= render :partial => 'users/course_homework', :locals => {:activity => homework_common,:user_activity_id => homework_common.id, :hw_status => 3} %> <% end%> <% if homework_commons.count == 10%> <%= link_to "点击展开更多",homework_search_course_path(course_id,:page => page,:search=>search),:id => "user_show_more_homework",:remote => "true",:class => "loadMore f_grey"%> diff --git a/app/views/courses/homework_search.js.erb b/app/views/courses/homework_search.js.erb index 3c644ad9e..5e2f81f01 100644 --- a/app/views/courses/homework_search.js.erb +++ b/app/views/courses/homework_search.js.erb @@ -1,5 +1,5 @@ <% if @page == 0 %> - $("#user_homework_list").replaceWith("<%= escape_javascript( render :partial => 'courses/user_homework_search_list',:locals => {:homework_commons => @homeworks, :page => @page, :is_in_course => 1,:course_id => @course.id,:search=>@search} )%>"); + $("#user_homework_list").replaceWith("<%= escape_javascript( render :partial => 'courses/user_homework_search_list',:locals => {:homework_commons => @homeworks, :page => @page, :course_id => @course.id,:search=>@search} )%>"); <% else %> - $("#user_show_more_homework").replaceWith("<%= escape_javascript( render :partial => 'courses/user_homework_search_list',:locals => {:homework_commons => @homeworks, :page => @page, :is_in_course => 1,:course_id => @course.id,:search=>@search} )%>"); + $("#user_show_more_homework").replaceWith("<%= escape_javascript( render :partial => 'courses/user_homework_search_list',:locals => {:homework_commons => @homeworks, :page => @page, :course_id => @course.id,:search=>@search} )%>"); <% end %> \ No newline at end of file diff --git a/app/views/homework_common/_alert_anonyoms.html.erb b/app/views/homework_common/_alert_anonyoms.html.erb index 79840cb35..8834d6746 100644 --- a/app/views/homework_common/_alert_anonyoms.html.erb +++ b/app/views/homework_common/_alert_anonyoms.html.erb @@ -32,7 +32,7 @@

    <% end %>
    - + 确  定 diff --git a/app/views/homework_common/_alert_open_student_works.html.erb b/app/views/homework_common/_alert_open_student_works.html.erb index 73c7f0b47..4eda8e458 100644 --- a/app/views/homework_common/_alert_open_student_works.html.erb +++ b/app/views/homework_common/_alert_open_student_works.html.erb @@ -22,7 +22,7 @@

    <% end %>
    - + 确  定 diff --git a/app/views/homework_common/_homework_index_list.html.erb b/app/views/homework_common/_homework_index_list.html.erb index 9b11017e8..dcbe8d411 100644 --- a/app/views/homework_common/_homework_index_list.html.erb +++ b/app/views/homework_common/_homework_index_list.html.erb @@ -1,4 +1,4 @@ -<%= render :partial => 'users/user_homework_list', :locals => {:homework_commons => homework_commons,:page => 0,:is_in_course => 1,:course_id => course_id} %> +<%= render :partial => 'users/user_homework_list', :locals => {:homework_commons => homework_commons,:page => 0,:course_id => course_id} %>
    + + + + + + <% homework.homework_tests.each_with_index do |test, i| %> + + + + + + <% end %> +
     测试集输入测试集输出
    <%=i+1 %><%=test.input %><%=test.output %>
    +
    + <% end %> +
    +
    + <% if homework.homework_detail_manual%> + <% if homework.homework_detail_manual.comment_status == 1%> + <% end_time = homework.end_time.to_time.to_i + 24*60*60 - 1 %> + <% if end_time >= Time.now.to_i %> +
    提交剩余时间: <%= (end_time - Time.now.to_i) / (24*60*60) %> 天 + <%= ((end_time - Time.now.to_i) % (24*60*60)) / (60*60)%> 小时 + <%= (((end_time - Time.now.to_i) % (24*60*60)) % (60*60)) / 60%>
    + <% else %> +
    提交已截止
    + <% end %> + <% elsif homework.homework_detail_manual.comment_status == 2%> + <% end_time = homework.homework_detail_manual.evaluation_end.to_time.to_i + 24*60*60 - 1 %> + <% if end_time >= Time.now.to_i %> +
    匿评剩余时间: <%= (end_time - Time.now.to_i) / (24*60*60)%> 天 + <%= ((end_time - Time.now.to_i) % (24*60*60)) / (60*60)%> 小时 + <%= (((end_time - Time.now.to_i) % (24*60*60)) % (60*60)) / 60%>
    + <% else %> +
    匿评已截止
    + <% end %> + <% end%> + <% end%> +
    +
    + + +
    +
    + <%= render :partial=>"attachments/activity_attach", :locals=>{:activity => homework} %> +
    + +<%= render :partial => "users/homework_base_info", :locals =>{:activity => homework, :user_activity_id =>homework.id, :is_teacher => is_teacher, :hw_status => 5} %> + +
    \ No newline at end of file diff --git a/app/views/student_work/_student_work_list.html.erb b/app/views/student_work/_student_work_list.html.erb index 73f37602b..6bcb2bb5e 100644 --- a/app/views/student_work/_student_work_list.html.erb +++ b/app/views/student_work/_student_work_list.html.erb @@ -93,10 +93,7 @@ <% elsif @homework.homework_type == 1 %> $("#about_hwork_<%= work.id%>").html("<%= escape_javascript(render :partial => 'show',:locals => {:work => work, :score =>student_work_score(work,User.current),:student_work_scores => work.student_works_scores.order("updated_at desc"),:is_focus => @is_focus}) %>"); <% elsif @homework.homework_type == 3 %> - <% pro = @homework.student_work_projects.where(:user_id => User.current.id).first %> - <% if pro && pro.student_work_id == work.id %> - $("#about_hwork_<%= work.id%>").html("<%= escape_javascript(render :partial => 'show',:locals => {:work => work, :score =>student_work_score(work,User.current),:student_work_scores => work.student_works_scores.order("updated_at desc"),:is_focus => @is_focus}) %>"); - <% end %> + $("#about_hwork_<%= work.id%>").html("<%= escape_javascript(render :partial => 'show',:locals => {:work => work, :score =>student_work_score(work,User.current),:student_work_scores => work.student_works_scores.order("updated_at desc"),:is_focus => @is_focus}) %>"); <% end %> $('#score_<%= work.id%>').peSlider({range: 'min'}); <% end %> diff --git a/app/views/student_work/cancel_relate_project.js.erb b/app/views/student_work/cancel_relate_project.js.erb index 2dd4a88a4..c65034689 100644 --- a/app/views/student_work/cancel_relate_project.js.erb +++ b/app/views/student_work/cancel_relate_project.js.erb @@ -1,4 +1,8 @@ +<% if @hw_status == 5 %> +$("#homework_post_brief").html("<%= escape_javascript(render :partial => 'student_work/homework_post_brief', :locals => {:homework => @homework, :is_teacher => @is_teacher}) %>"); +<% else %> $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/course_homework', :locals => {:activity => @homework,:user_activity_id =>@user_activity_id,:hw_status=>@hw_status}) %>"); +<% end %> <% if @user_activity_id != @homework.id %> sd_create_editor_from_data(<%= @user_activity_id%>,"","100%", "UserActivity"); <% else %> diff --git a/app/views/student_work/index.html.erb b/app/views/student_work/index.html.erb index 3ec6232db..8ab08b7e0 100644 --- a/app/views/student_work/index.html.erb +++ b/app/views/student_work/index.html.erb @@ -2,6 +2,7 @@ <%= javascript_include_tag "/assets/codemirror/codemirror_python_ruby_c" %> <%= javascript_include_tag "resizeable_table" %> <%= stylesheet_link_tag "/assets/codemirror/codemirror" %> +<%= import_ke(enable_at: true, prettify: false, init_activity: true) %> <% end %> -
    - <% com_time = project.project_score.commit_time %> - <% forge_time=ForgeActivity.where("project_id=?",project.id).last.updated_at if ForgeActivity.where("project_id=?",project.id).last %> - <% if project.is_public || User.current.member_of?(project) || User.current.admin? %> - <%= link_to image_tag(url_to_avatar(project),:width=>"40",:height => "40",:class => "borderRadius relatePImage"),project_path(project.id,:host=>Setting.host_name),:id=>"project_img_"+project.id.to_s+"_"+activity.id.to_s,:alt =>"项目头像", :target => '_blank' %> - - <% update_time = time_from_now !com_time.nil? && format_time(com_time) > format_time(forge_time) ? com_time : forge_time %> - - <% else %> - <%= image_tag(url_to_avatar(project),:width=>"40",:height => "40",:class => "borderRadius relatePImage",:id=>"project_img_"+project.id.to_s+"_"+activity.id.to_s,:alt =>"项目头像",:title => "私有项目不可访问") %> - - - <% end %> -
    - 项目名称:<%=project.name %>
    - 创建者:<%=(User.find project.user_id).show_name %>(组长)
    - 更新时间:<%=time_from_now !com_time.nil? && format_time(com_time) > format_time(forge_time) ? com_time : forge_time %> -
    -
    - <% if i == 9 && projects.count > 10 %> -
    更多>> - <% end %> - <% if i > 9 && i == (projects.count - 1) %> - 收回<< - <% end %> - <% end %> - - <% end %> - <% end %> -
    - <% if is_teacher%> - <% comment_status = activity.homework_detail_manual.comment_status %> -
    -
      -
    • -
        -
      • - <%= link_to l(:button_edit),edit_homework_common_path(activity, :hw_status => hw_status), :class => "postOptionLink"%> -
      • -
      • - <%= link_to(l(:label_bid_respond_delete), homework_common_path(activity, :hw_status => hw_status),:method => 'delete', :confirm => l(:text_are_you_sure), :class => "postOptionLink") %> -
      • -
      • - <%= link_to("评分设置", score_rule_set_homework_common_path(activity,:user_activity_id => user_activity_id, :hw_status => hw_status),:class => "postOptionLink", :remote => true) %> -
      • - <% if activity.anonymous_comment == 0 %> -
      • - <%= link_to("匿评设置", start_evaluation_set_homework_common_path(activity,:user_activity_id => user_activity_id, :hw_status => hw_status),:class => "postOptionLink", :remote => true) if activity.homework_detail_manual.comment_status == 1%> -
      • -
      • - <%= homework_anonymous_comment activity,hw_status,user_activity_id %> -
      • - <% end %> - <% if activity.anonymous_comment == 0 && (comment_status == 0 || comment_status == 1)%> -
      • - <%= link_to("禁用匿评", alert_forbidden_anonymous_comment_homework_common_path(activity,:user_activity_id => user_activity_id),:class => "postOptionLink", - :title => "匿评是同学之间的双盲互评过程:每个同学将评阅系统分配给他/她的若干个作品", :remote => true)%> -
      • - <% end %> - <% if (activity.anonymous_comment == 1 && activity.is_open == 0) || (activity.anonymous_comment == 0 && comment_status == 3 && activity.is_open == 0) %> -
      • - <%= link_to("公开作品", alert_open_student_works_homework_common_path(activity,:user_activity_id => user_activity_id, :hw_status => hw_status),:class => "postOptionLink", :remote => true)%> -
      • - <% elsif activity.is_open == 1 %> -
      • - <%= link_to("取消公开", alert_open_student_works_homework_common_path(activity,:user_activity_id => user_activity_id, :hw_status => hw_status),:class => "postOptionLink", :remote => true)%> -
      • - <% end %> -
      -
    • -
    -
    - <% end%> + <%= render :partial => "users/homework_base_info", :locals =>{:activity => activity, :user_activity_id =>user_activity_id, :is_teacher => is_teacher, :hw_status => hw_status} %>
    - <% count=activity.journals_for_messages.count %> -
    - <%= render :partial => 'users/reply_banner', :locals => {:count => count, :activity => activity, :user_activity_id => user_activity_id, :hw_status => hw_status} %> - - <% comments = activity.journals_for_messages.reorder("created_on desc").limit(3) %> - <% if count > 0 %> -
    - <%=render :partial => 'users/news_replies', :locals => {:comments => comments, :type => 'HomeworkCommon', :hw_status => hw_status, :is_teacher => is_teacher, :user_activity_id => user_activity_id, :activity_id => activity.id} %> -
    - <% end %> - -
    -
    <%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), :alt => "用户头像" %>
    -
    - <% if User.current.logged? %> -
    - <%= form_for('new_form',:url => {:controller => 'words', :action => 'leave_homework_message', :id => activity.id},:method => "post", :remote => true) do |f|%> - <%= hidden_field_tag 'user_activity_id',params[:user_activity_id],:value =>user_activity_id %> - <%= hidden_field_tag 'hw_status',params[:hw_status],:value =>hw_status %> -
    - - -
    -

    - <% end%> -
    - <% else %> - <%= render :partial => "users/show_unlogged" %> - <% end %> -
    -
    -
    -
    -
    + <%= render :partial => 'users/homework_post_reply', :locals => {:activity => activity, :user_activity_id => user_activity_id, :hw_status => hw_status, :is_teacher => is_teacher} %> + +
    + <% com_time = project.project_score.commit_time %> + <% forge_time=ForgeActivity.where("project_id=?",project.id).last.updated_at if ForgeActivity.where("project_id=?",project.id).last %> + <% if project.is_public || User.current.member_of?(project) || User.current.admin? %> + <%= link_to image_tag(url_to_avatar(project),:width=>"40",:height => "40",:class => "borderRadius relatePImage"),project_path(project.id,:host=>Setting.host_name),:id=>"project_img_"+project.id.to_s+"_"+activity.id.to_s,:alt =>"项目头像", :target => '_blank' %> + + <% update_time = time_from_now !com_time.nil? && format_time(com_time) > format_time(forge_time) ? com_time : forge_time %> + + <% else %> + <%= image_tag(url_to_avatar(project),:width=>"40",:height => "40",:class => "borderRadius relatePImage",:id=>"project_img_"+project.id.to_s+"_"+activity.id.to_s,:alt =>"项目头像",:title => "私有项目不可访问") %> + + + <% end %> +
    + 项目名称:<%=project.name %>
    + 创建者:<%=(User.find project.user_id).show_name %>(组长)
    + 更新时间:<%=time_from_now !com_time.nil? && format_time(com_time) > format_time(forge_time) ? com_time : forge_time %> +
    +
    + <% if i == 9 && projects.count > 10 %> + 更多>> + <% end %> + <% if i > 9 && i == (projects.count - 1) %> + 收回<< + <% end %> + <% end %> + + <% end %> +<% end %> +
    + +<% if is_teacher%> + <% comment_status = activity.homework_detail_manual.comment_status %> +
    +
      +
    • +
        +
      • + <%= link_to l(:button_edit),edit_homework_common_path(activity, :hw_status => hw_status), :class => "postOptionLink"%> +
      • +
      • + <%= link_to(l(:label_bid_respond_delete), homework_common_path(activity, :hw_status => hw_status),:method => 'delete', :confirm => l(:text_are_you_sure), :class => "postOptionLink") %> +
      • +
      • + <%= link_to("评分设置", score_rule_set_homework_common_path(activity,:user_activity_id => user_activity_id, :hw_status => hw_status),:class => "postOptionLink", :remote => true) %> +
      • + <% if activity.anonymous_comment == 0 %> +
      • + <%= link_to("匿评设置", start_evaluation_set_homework_common_path(activity,:user_activity_id => user_activity_id, :hw_status => hw_status),:class => "postOptionLink", :remote => true) if activity.homework_detail_manual.comment_status == 1%> +
      • +
      • + <%= homework_anonymous_comment activity,hw_status,user_activity_id %> +
      • + <% end %> + <% if activity.anonymous_comment == 0 && (comment_status == 0 || comment_status == 1)%> +
      • + <%= link_to("禁用匿评", alert_forbidden_anonymous_comment_homework_common_path(activity,:user_activity_id => user_activity_id),:class => "postOptionLink", + :title => "匿评是同学之间的双盲互评过程:每个同学将评阅系统分配给他/她的若干个作品", :remote => true)%> +
      • + <% end %> + <% if (activity.anonymous_comment == 1 && activity.is_open == 0) || (activity.anonymous_comment == 0 && comment_status == 3 && activity.is_open == 0) %> +
      • + <%= link_to("公开作品", alert_open_student_works_homework_common_path(activity,:user_activity_id => user_activity_id, :hw_status => hw_status),:class => "postOptionLink", :remote => true)%> +
      • + <% elsif activity.is_open == 1 %> +
      • + <%= link_to("取消公开", alert_open_student_works_homework_common_path(activity,:user_activity_id => user_activity_id, :hw_status => hw_status),:class => "postOptionLink", :remote => true)%> +
      • + <% end %> +
      +
    • +
    +
    +<% end%> \ No newline at end of file diff --git a/app/views/users/_homework_opr.html.erb b/app/views/users/_homework_opr.html.erb new file mode 100644 index 000000000..53d16b15d --- /dev/null +++ b/app/views/users/_homework_opr.html.erb @@ -0,0 +1,43 @@ +<% if activity.homework_type == 3 && !is_teacher && activity.homework_detail_group.base_on_project == 1 && User.current.member_of_course?(activity.course)%> + <% projects = cur_user_projects_for_homework activity %> + <% works = cur_user_works_for_homework activity %> + <% if works.nil? && projects.nil? %> +
    + <%=link_to "关联项目",new_student_work_project_student_work_index_path(:homework => activity.id,:hw_status=>hw_status,:user_activity_id=>user_activity_id),remote: true,:class=> 'c_blue', :title=> '请各组长关联作业项目' %> +
    + <% elsif works.nil? %> +
    + <%=link_to "取消关联",cancel_relate_project_student_work_index_path(:homework => activity.id,:hw_status=>hw_status,:user_activity_id=>user_activity_id), :confirm => "您确定要取消关联吗?", remote: true,:class => "c_blue", :title=> '取消关联项目' %> +
    + <% end %> +<% end %> +
    + <%= user_for_homework_common activity,is_teacher %> +
    +<% work = cur_user_works_for_homework activity %> +<% if activity.end_time < Date.today && !is_teacher && !work.nil? && work.user == User.current %> +
    + <%=link_to "追加附件", student_work_index_url_in_org(activity.id, 2, 1), :class => 'c_blue', :title => "可追加作品修订附件" %> +
    +<% end %> +<% if activity.homework_type == 2 && is_teacher%> +
    + <%= link_to "模拟答题", new_user_commit_homework_users_path(homework_id: activity.id, is_test: true), class: 'c_blue test-program-btn', title: '教师可以通过模拟答题设置作业的标准答案' %> +
    + <% if activity.homework_detail_manual.comment_status != 0 %> +
    + <%= link_to "代码查重", work_canrepeat_student_work_index_path(homework: activity.id, course_id: activity.course.id), class: 'c_blue test-program-btn',:remote => true %> +
    + <% end %> +<% end %> +<% if activity.homework_type == 2%> +
    + 语言: + <%= activity.language_name%> +
    +<% end %> +<% if activity.homework_type == 3 && activity.homework_detail_group%> +
    + 分组人数:<%=activity.homework_detail_group.min_num %>-<%=activity.homework_detail_group.max_num %> 人 +
    +<% end %> \ No newline at end of file diff --git a/app/views/users/_homework_post_reply.html.erb b/app/views/users/_homework_post_reply.html.erb new file mode 100644 index 000000000..0037e35ac --- /dev/null +++ b/app/views/users/_homework_post_reply.html.erb @@ -0,0 +1,34 @@ +<% count=activity.journals_for_messages.count %> +
    + <%= render :partial => 'users/reply_banner', :locals => {:count => count, :activity => activity, :user_activity_id => user_activity_id, :hw_status => hw_status} %> + + <% comments = activity.journals_for_messages.reorder("created_on desc").limit(3) %> + <% if count > 0 %> +
    + <%=render :partial => 'users/news_replies', :locals => {:comments => comments, :type => 'HomeworkCommon', :hw_status => hw_status, :is_teacher => is_teacher, :user_activity_id => user_activity_id, :activity_id => activity.id} %> +
    + <% end %> + +
    +
    <%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), :alt => "用户头像" %>
    +
    + <% if User.current.logged? %> +
    + <%= form_for('new_form',:url => {:controller => 'words', :action => 'leave_homework_message', :id => activity.id},:method => "post", :remote => true) do |f|%> + <%= hidden_field_tag 'user_activity_id',params[:user_activity_id],:value =>user_activity_id %> + <%= hidden_field_tag 'hw_status',params[:hw_status],:value =>hw_status %> +
    + + +
    +

    + <% end%> +
    + <% else %> + <%= render :partial => "users/show_unlogged" %> + <% end %> +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/app/views/users/_user_homework_detail.html.erb b/app/views/users/_user_homework_detail.html.erb index 6f1fb7843..3351ae3f2 100644 --- a/app/views/users/_user_homework_detail.html.erb +++ b/app/views/users/_user_homework_detail.html.erb @@ -50,7 +50,7 @@ <% work = cur_user_works_for_homework homework_common %> <% if !is_teacher && !work.nil? && homework_common.end_time < Date.today && work.user == User.current %>
    - <%=link_to "追加附件", student_work_index_url_in_org(homework_common.id, 1), :class => 'c_blue', :title => "可追加作品修订附件" %> + <%=link_to "追加附件", student_work_index_url_in_org(homework_common.id, 2, 1), :class => 'c_blue', :title => "可追加作品修订附件" %>
    <% end %> <% if homework_common.homework_type == 2 && is_teacher%> diff --git a/app/views/words/destroy.js.erb b/app/views/words/destroy.js.erb index 5dcdc6401..ab41b1ae6 100644 --- a/app/views/words/destroy.js.erb +++ b/app/views/words/destroy.js.erb @@ -31,7 +31,7 @@ <% elsif @user && @jours_count%> $('#jour_count').html("<%= @jours_count %>"); <% elsif @homework%> - $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/course_homework', :locals => {:activity => @homework,:user_activity_id =>@user_activity_id,:hw_status=>@hw_status}) %>"); + $("#homework_post_reply_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/homework_post_reply', :locals => {:activity => @homework, :user_activity_id => @user_activity_id, :hw_status => @hw_status, :is_teacher => @is_teacher}) %>"); <% if @user_activity_id != @homework.id %> sd_create_editor_from_data(<%= @user_activity_id%>,"","100%", "UserActivity"); <% else %> diff --git a/app/views/words/leave_homework_message.js.erb b/app/views/words/leave_homework_message.js.erb index 61a8aca14..f6a89323f 100644 --- a/app/views/words/leave_homework_message.js.erb +++ b/app/views/words/leave_homework_message.js.erb @@ -1,4 +1,4 @@ -$("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/course_homework', :locals => {:activity => @homework_common,:user_activity_id =>@user_activity_id,:hw_status=>@hw_status}) %>"); +$("#homework_post_reply_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/homework_post_reply', :locals => {:activity => @homework_common, :user_activity_id => @user_activity_id, :hw_status => @hw_status, :is_teacher => @is_teacher}) %>"); <% if @user_activity_id != @homework_common.id %> sd_create_editor_from_data(<%= @user_activity_id%>,"","100%", "UserActivity"); <% else %> diff --git a/app/views/words/reply_to_homework.js.erb b/app/views/words/reply_to_homework.js.erb index 61a8aca14..f6a89323f 100644 --- a/app/views/words/reply_to_homework.js.erb +++ b/app/views/words/reply_to_homework.js.erb @@ -1,4 +1,4 @@ -$("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/course_homework', :locals => {:activity => @homework_common,:user_activity_id =>@user_activity_id,:hw_status=>@hw_status}) %>"); +$("#homework_post_reply_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/homework_post_reply', :locals => {:activity => @homework_common, :user_activity_id => @user_activity_id, :hw_status => @hw_status, :is_teacher => @is_teacher}) %>"); <% if @user_activity_id != @homework_common.id %> sd_create_editor_from_data(<%= @user_activity_id%>,"","100%", "UserActivity"); <% else %> diff --git a/public/stylesheets/courses.css b/public/stylesheets/courses.css index 8f6c56a4b..a2117bdf3 100644 --- a/public/stylesheets/courses.css +++ b/public/stylesheets/courses.css @@ -130,7 +130,7 @@ a.hworkSearchIcon:hover {background:url(../images/nav_icon.png) -49px -1px no-re /*作业信息*/ .mt-2 {margin-top:-2px;} -.homeworkInfo {background:#F6F6F6; padding:10px; margin-bottom:10px;} +.homeworkInfo {background:#F6F6F6; padding:10px;} .homeworkDetail {line-height:18px; font-size:12px; color:#484848; overflow:hidden;} .homeworkDetail p,.homeworkDetail div,.homeworkDetail em, .homeworkDetail span{text-align: justify; text-justify:inter-ideograph; word-break: normal !important; word-wrap: break-word !important; line-height: 18px !important;} .max_h54 {max-height:54px; } diff --git a/public/stylesheets/css/courses.css b/public/stylesheets/css/courses.css index 1841e0348..eccbcc9b1 100644 --- a/public/stylesheets/css/courses.css +++ b/public/stylesheets/css/courses.css @@ -249,7 +249,7 @@ a.hworkSearchIcon:hover {background:url(../images/nav_icon.png) -49px -1px no-re .StudentName{display: table-cell;width: 115px;vertical-align: middle;text-align: left;height: 40px;} /*作业信息*/ -.homeworkInfo {background:#F6F6F6; padding:10px; margin-bottom:10px;} +.homeworkInfo {background:#F6F6F6; padding:10px;} .homeworkDetail {line-height:18px; font-size:12px; color:#484848; overflow:hidden;} .homeworkDetail p,.homeworkDetail div,.homeworkDetail em, .homeworkDetail span{text-align: justify; text-justify:inter-ideograph; word-break: normal !important; word-wrap: break-word !important; line-height: 18px !important;} .homeworkState {padding:3px 5px; background-color:#28be6c; border-radius:3px; float:left; margin-left:15px; color:#ffffff;} From 25b2418730e977e66edfebb6aa4a7c9786232dc4 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 21 Sep 2016 14:33:46 +0800 Subject: [PATCH 023/102] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=B5=84=E6=96=99?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E9=97=AE=E9=A2=98=E5=8F=8D=E9=A6=88=E6=A1=86?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../layouts/_forbidden_new_feedback.html.erb | 47 ++++++++++++------- public/stylesheets/nyan.css | 2 +- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/views/layouts/_forbidden_new_feedback.html.erb b/app/views/layouts/_forbidden_new_feedback.html.erb index 03c9855f9..9dc4a560b 100644 --- a/app/views/layouts/_forbidden_new_feedback.html.erb +++ b/app/views/layouts/_forbidden_new_feedback.html.erb @@ -3,38 +3,49 @@
    -
    - - - - +
    + 问题和建议 + × +
    -
    -
    +
    +
    <% get_memo %> <%= form_for(@new_memo, :url => create_feedback_forum_path(@public_forum)) do |f| %> - <%= f.text_area :subject, :id=>"subject", :class => "opnionText", :placeholder => l(:label_feedback_tips) %> + <%= f.text_area :subject, :id=>"subject", :class => "opnionText mb5", :placeholder => "完善您的基本资料后,可在此输入问题和建议", :disabled => "disabled" %> <%= f.hidden_field :content,:id => 'hidden', :required => true , :value => l(:label_feedback_value) %> - - - <%= l(:label_submit)%> - + + + <%#= l(:label_submit)%> + +
    <% end %>
    -
    +
    +
    +
    <%#= l(:label_technical_support) %> - Trustie师姐师兄答疑群 + +

    加入QQ群

    +
    +

    关注官方微信

    +
    +
    -
    -
    - <%= l(:label_submit)%> - +
    +
    +
    + +
    +
    + × +
    diff --git a/public/stylesheets/nyan.css b/public/stylesheets/nyan.css index 75da9349d..d219a8efb 100644 --- a/public/stylesheets/nyan.css +++ b/public/stylesheets/nyan.css @@ -1447,7 +1447,7 @@ ul.contest-notification-list li span{ .xls { /*background: url('../images/icon_excel.gif') no-repeat scroll 1px 50% transparent;*/ /*padding: 2px 0px 3px 16px;*/ - font-family:微软雅黑 !important; + font-family:"微软雅黑" !important; font-size: 12px !important; color: #136b3b !important; font-weight:normal !important; From d83441fe7ca7d2abdff5f015a80809d3d4f42684 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 21 Sep 2016 14:58:48 +0800 Subject: [PATCH 024/102] =?UTF-8?q?=E5=8F=8D=E9=A6=88=E6=A1=86=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E6=96=87=E5=AD=97=E5=A4=A7=E5=B0=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_new_feedback.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/_new_feedback.html.erb b/app/views/layouts/_new_feedback.html.erb index db90c47c4..ee8575a3c 100644 --- a/app/views/layouts/_new_feedback.html.erb +++ b/app/views/layouts/_new_feedback.html.erb @@ -15,7 +15,7 @@ <%= f.text_area :subject, :id=>"subject", :class => "opnionText mb5", :placeholder => l(:label_feedback_tips) %> <%= f.hidden_field :content,:id => 'hidden', :required => true , :value => l(:label_feedback_value) %> 还能输入50个字符 - + <%= l(:label_submit)%>
    From c718cb2144c60ca016f8f16f45fd5232af3f3452 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 21 Sep 2016 15:27:32 +0800 Subject: [PATCH 025/102] =?UTF-8?q?=E6=96=B0=E5=BB=BAissue=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=AF=84=E5=AE=A1=EF=BC=8C=E6=9D=A5?= =?UTF-8?q?=E6=BA=90=EF=BC=8C=E5=AE=9E=E9=99=85=E5=B7=A5=E6=97=B6=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/_attributes.html.erb | 16 +++++++++++++++- app/views/issues/_form.html.erb | 4 ++++ config/locales/projects/zh.yml | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/views/issues/_attributes.html.erb b/app/views/issues/_attributes.html.erb index 9dba6a6c8..80c8ad185 100644 --- a/app/views/issues/_attributes.html.erb +++ b/app/views/issues/_attributes.html.erb @@ -25,6 +25,14 @@
  • + + +
  • +
  • <% if @issue.safe_attribute? 'assigned_to_id' %> @@ -74,7 +82,13 @@ <% if @issue.safe_attribute? 'estimated_hours' %> <%= f.text_field :estimated_hours, :size => 22, :disabled => !@issue.leaf?, :no_label => true, :required => @issue.required_attribute?('estimated_hours') %> - <%= l(:field_hours) %> + <% end %> +
  • +
    +
  • + + <% if @issue.safe_attribute? 'estimated_hours' %> + <%= f.text_field :estimated_hours, :size => 22, :disabled => !@issue.leaf?, :no_label => true %> <% end %>
  • diff --git a/app/views/issues/_form.html.erb b/app/views/issues/_form.html.erb index 1be21cbc1..d58c4fb6f 100644 --- a/app/views/issues/_form.html.erb +++ b/app/views/issues/_form.html.erb @@ -18,6 +18,10 @@ <% end %> +
  • + + +
  • diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 906ae4243..2b63c45cf 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -232,7 +232,7 @@ zh: field_closed_on: 已关闭 field_start_date: 开始日期 field_due_date: 计划完成日期 - field_estimated_hours: 预期时间 + field_estimated_hours: 预计工时 (H) field_assigned_to: 指派给 field_priority: 优先级 field_done_ratio: "% 完成" From c37c880eb216031918655dba789e85658285b2e3 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 22 Sep 2016 08:40:41 +0800 Subject: [PATCH 026/102] =?UTF-8?q?=E9=87=8C=E7=A8=8B=E7=A2=91=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E5=AF=BC=E5=87=BAexcel=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/versions_controller.rb | 9 ++++++++- app/views/versions/index.html.erb | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index defc36868..2dce0f37f 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -53,7 +53,6 @@ class VersionsController < ApplicationController @offset ||= @versions_pages.offset @versions = @versions.slice(@offset, @limit) #end by young - @issues_by_version = {} if @selected_tracker_ids.any? && @versions.any? @@ -81,6 +80,14 @@ class VersionsController < ApplicationController all } format.api + format.xls { + @issues = @version.fixed_issues.visible. + includes(:status, :tracker, :priority). + reorder("#{Tracker.table_name}.position, #{Issue.table_name}.id"). + all + filename = "#{@version.name.to_s}_#{l(:label_issue_list_xls)}.xls" + send_data(issue_list_xls(@issues), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) + } end end diff --git a/app/views/versions/index.html.erb b/app/views/versions/index.html.erb index eec93c86c..6b36ed5ff 100644 --- a/app/views/versions/index.html.erb +++ b/app/views/versions/index.html.erb @@ -57,10 +57,10 @@

    »<%= l(:label_versions_description)%>

    <%=h version.description %>

    +

    »<%= link_to "导出:XLS", version_path(version, :format => 'xls') %>

    <% end %> -
      <%= pagination_links_full @versions_pages%>
    From 80105181ce7aa5ec34aaaa61f4ce82f504a6856d Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 22 Sep 2016 13:41:46 +0800 Subject: [PATCH 027/102] =?UTF-8?q?issue=E4=B8=AD=E6=88=91=E7=9A=84issue?= =?UTF-8?q?=EF=BC=8C=E6=8C=87=E6=B4=BE=E7=BB=99=E6=88=91=E7=9A=84issue?= =?UTF-8?q?=E5=92=8C=E5=85=A8=E9=83=A8issue=20js=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/index.html.erb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 83645720a..9e6b9fac2 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -43,6 +43,30 @@ } } + // 点击的时候让过滤条件选中assign_to + function switch_assign_to(assign) { + var assign = "option[value =" + assign + "]" + $("#assignToMe").click(function(){ + + }); + $("select[id='assigned_to_id']").find(assign).attr("selected", "selected"); + remote_function(); + } + + // 点击的时候让过滤条件选中user_id + function createByMe(user_id) { + var user = "option[value =" + user_id + "]" + $("#createByMe").click(function(){ + + }); + $("select[id='author_id']").find(user).attr("selected", "selected"); + remote_function(); + } + + function all_reset_form() { + $("#issue_query_form")[0].reset(); + remote_function(); + } @@ -92,6 +116,11 @@ ) %>
    + 指派我的 + 所有的 + 我发布的 + +
     
    @@ -113,6 +142,7 @@ <% end %>
    +
    <% if !@query.new_record? && @query.editable_by?(User.current) %> <%= link_to l(:button_edit), edit_query_path(@query), :class => 'icon icon-edit' %> From dac9502f1fbdc47e6a720f4857ca8cb28beec38e Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 22 Sep 2016 14:25:09 +0800 Subject: [PATCH 028/102] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=E6=9D=A5?= =?UTF-8?q?=E6=BA=90title=E6=98=BE=E7=A4=BA=E5=B8=A6html=E4=BB=A3=E7=A0=81?= =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_resources_list.html.erb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index d7f0dee7f..0190e60dc 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -267,4 +267,9 @@ } } + + $(".resource-list-from").each(function(){ + var titleContent = $(this).text(); + $(this).attr("title",titleContent); + }); From de0f49f8501da28df8106b2fe92f5cb2b552af53 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 22 Sep 2016 14:38:45 +0800 Subject: [PATCH 029/102] =?UTF-8?q?ISSUE=E5=88=97=E8=A1=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=96=B0=E7=9A=84=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/issues_controller.rb | 46 ++++++++++++++----------- app/views/issues/_list.html.erb | 11 ++++-- app/views/issues/index.js.erb | 8 ++--- app/views/users/_project_issue.html.erb | 4 +-- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 088ecac58..820b1d7ac 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -66,16 +66,16 @@ class IssuesController < ApplicationController @project_base_tag = (params[:project_id] || @issue.project) ? 'base_projects':'base' if @query.valid? - case params[:format] - when 'csv', 'pdf' - @limit = 10#Setting.issues_export_limit.to_i - when 'atom' - @limit = 10#Setting.feeds_limit.to_i - when 'xml', 'json' - @offset, @limit = api_offset_and_limit({:limit => 10}) - else - @limit = 10#per_page_option - end + # case params[:format] + # when 'csv', 'pdf' + # @limit = 10#Setting.issues_export_limit.to_i + # when 'atom' + # @limit = 10#Setting.feeds_limit.to_i + # when 'xml', 'json' + # @offset, @limit = api_offset_and_limit({:limit => 10}) + # else + # @limit = 10#per_page_option + # end @assign_to_id = params[:assigned_to_id] @author_id = params[:author_id] @priority_id = params[:priority_id] @@ -83,17 +83,23 @@ class IssuesController < ApplicationController @subject = params[:subject] @done_ratio = params[:done_ratio] @issue_count = @query.issue_count - @issue_pages = Paginator.new @issue_count, @limit, params['page'] - params[:page] = (params[:page] || 1).to_i + 1 #页码需要加1 + # @issue_pages = Paginator.new @issue_count, @limit, params['page'] + # params[:page] = (params[:page] || 1).to_i + 1 #页码需要加1 + # @offset ||= @issue_pages.offset + @issues_filter = @query.issues + # (:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], + # :order => 'issues.updated_on desc', + # :offset => @offset, + # :limit => @limit) + @limit = 10 + @is_remote = true + @issue_pages = Paginator.new @issue_count, @limit, params['page'] || 1 @offset ||= @issue_pages.offset - @issues = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version], - :order => 'issues.updated_on desc', - :offset => @offset, - :limit => @limit) - if params[:set_filter] - @set_filter = params[:set_filter] - end - @issue_count_by_group = @query.issue_count_by_group + @issues = paginateHelper @issues_filter, @limit + # if params[:set_filter] + # @set_filter = params[:set_filter] + # end + # @issue_count_by_group = @query.issue_count_by_group respond_to do |format| format.js format.html { render :template => 'issues/index', :layout => @project_base_tag }#by young diff --git a/app/views/issues/_list.html.erb b/app/views/issues/_list.html.erb index 0eb3b4a0c..4fee89d6a 100644 --- a/app/views/issues/_list.html.erb +++ b/app/views/issues/_list.html.erb @@ -6,6 +6,11 @@ <%= render :partial => 'users/project_issue', :locals => {:activity => issue, :user_activity_id => issue.id} %> <% end %> - <% if issues.count == 10%> - <%= link_to "点击展开更多",project_issues_path({:project_id => project.id}.merge(params)),:id => "show_more_issues",:remote => "true",:class => "loadMore mt10 f_grey"%> - <% end%> +
    +
    +
      + <%= pagination_links_full @issue_pages, @issue_count, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true%> +
    +
    +
    +
    diff --git a/app/views/issues/index.js.erb b/app/views/issues/index.js.erb index 399c6a977..9068aac9e 100644 --- a/app/views/issues/index.js.erb +++ b/app/views/issues/index.js.erb @@ -1,6 +1,4 @@ //$("#issue_list").html("<%#= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count})%>"); -<% if @set_filter && @issue_pages.page == 1%> //只有搜索的第一页才需要替换整个issue_list,其余的都是替换show_more_issues - $("#issue_list").html("<%= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project})%>"); -<%else%> - $("#show_more_issues").replaceWith("<%= escape_javascript( render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project} )%>"); -<%end%> +$("#issue_list").html("<%= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); +$("#issue_list_pagination").html('<%= pagination_links_full @issue_pages, @issue_count, :issues => @issues, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true %>'); + diff --git a/app/views/users/_project_issue.html.erb b/app/views/users/_project_issue.html.erb index 5a0065f86..e4f24d4e0 100644 --- a/app/views/users/_project_issue.html.erb +++ b/app/views/users/_project_issue.html.erb @@ -95,9 +95,7 @@
    -
    - <%= render :partial => 'users/project_issue_reply', :locals => {:activity => activity, :user_activity_id => user_activity_id} %> -
    +
    + <%= render :partial => 'issues/project_issue', :locals => {:activity => issue, :user_activity_id => issue.id} %> +<% end %> +
    +
    +
      + <%= pagination_links_full @issue_pages, @issue_count, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true%> +
    +
    +
    +
    diff --git a/app/views/issues/_project_issue.html.erb b/app/views/issues/_project_issue.html.erb new file mode 100644 index 000000000..683b512f0 --- /dev/null +++ b/app/views/issues/_project_issue.html.erb @@ -0,0 +1,36 @@ +<% unless activity.author.nil? %> +
    +
    + <% if activity.status_id.to_i == 5 %> + + <% else %> + + <% end %> +
    +
    + +
    + <% if activity.try(:author).try(:realname) == ' ' %> + <%= link_to activity.try(:author), user_path(activity.author_id), :class => "fl issues_list_name" %> + <% else %> + <%= link_to activity.try(:author).try(:realname), user_path(activity.author_id), :class => "fl issues_list_name" %> + <% end %> +

    2016-05-15发布

    +
    +
    +
      +
    • 需求
    • +
    • hushashahushashahushasha
    • +
    • 20161231
    • +
    • 草稿
    • +
    • 90%
    • +
    • +
    +
    +<% end %> + diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index c704f9847..13ea19882 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -1,8 +1,201 @@ + + + + + 缺陷列表及头部 + + + + + + +
    +
    +
    + +
    +
    + +

    邀请码
    Y7AUZ

    +
    +
    +

    尹刚/Trustie Forge

    私有 +
    +

    + 项目评分:123 + 浏览:123 + 关注:123 + 成员:123 +

    +
    + 关注 +
    +
    +
    +
    + + + +
    + + +
    + +
    + + 清除 +
    + + +
    +
    + + +
    + +
    +
    + + <%= select( :issue, :user_id, principals_options_for_isuue_list(@project), + { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0 + }, + {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"fl"} + ) + %> + + <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), + { :include_blank => false,:selected=>@status_id ? @status_id : 0 + }, + {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl issues_filter_select_min"} + ) + %> + + +
    +
    +
    +
    + <%= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> +
    + +
    + ddd + +
    +
    + + ddd +
    +
    + +
    + +
    + + + + + + + + + + + + + <%= content_for(:header_tags) do %> <%= import_ke(enable_at: true,init_activity: true) %> <% end %> \ No newline at end of file diff --git a/app/views/syllabuses/_syllabus_member_list.html.erb b/app/views/syllabuses/_syllabus_member_list.html.erb new file mode 100644 index 000000000..4ee3b9c28 --- /dev/null +++ b/app/views/syllabuses/_syllabus_member_list.html.erb @@ -0,0 +1,55 @@ +<% is_admin = User.current == @syllabus.user || User.current.admin? %> + + + + + + + + + <% if is_admin %> + + <% end %> + + + + <% @members.each_with_index do |member, i| %> + <% user = member.user %> + + + + + <% courses = user.courses.not_deleted %> + + + <% if is_admin %> + + <% end %> + + <% end %> + +
    序号姓名身份创建班级数参与班级数操作
    <%= member.rank %> + <% if member.rank == 1 %> +
    <%= user.show_name %>创建者
    + <% else %> + <%= user.show_name %> + <% end %> +
    + <% if user.user_extensions && user.user_extensions.identity %> + <%= get_user_roll user %> + <% end%> + <%= courses.where("tea_id = #{user.id}").count %><%= courses.where("tea_id != #{user.id}").count %> + <% if i == 0 %> +   + <% elsif i == 1 %> + <%= link_to('删除', {:controller => 'syllabus_member', :action => 'destroy', :id => member.id, :syllabus => @syllabus.id},:remote => true, :method => 'delete', :class => "fr sy_btn_grey mr5", :title => l(:button_delete)) %> + <%= link_to('下移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'down'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '下移') %> + <% elsif i == @members.count - 1 %> + <%= link_to('删除', {:controller => 'syllabus_member', :action => 'destroy', :id => member.id, :syllabus => @syllabus.id},:remote => true, :method => 'delete', :class => "fr sy_btn_grey mr5", :title => l(:button_delete)) %> + <%= link_to('上移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'up'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '上移') %> + <% else %> + <%= link_to('删除', {:controller => 'syllabus_member', :action => 'destroy', :id => member.id, :syllabus => @syllabus.id},:remote => true, :method => 'delete', :class => "fr sy_btn_grey mr5", :title => l(:button_delete)) %> + <%= link_to('下移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'down'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '下移') %> + <%= link_to('上移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'up'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '上移') %> + <% end %> +
    \ No newline at end of file diff --git a/app/views/syllabuses/members.html.erb b/app/views/syllabuses/members.html.erb new file mode 100644 index 000000000..fd4041b20 --- /dev/null +++ b/app/views/syllabuses/members.html.erb @@ -0,0 +1,51 @@ + + +
    +
    + <%= render :partial => 'syllabus_member_list' %> + 添加成员 +
    + +
    + + \ No newline at end of file diff --git a/app/views/syllabuses/show.html.erb b/app/views/syllabuses/show.html.erb index 17d03b8c5..03eb3f90a 100644 --- a/app/views/syllabuses/show.html.erb +++ b/app/views/syllabuses/show.html.erb @@ -14,6 +14,9 @@
  • 班级列表
  • +
  • + 教师团队 +
  • <% if @syllabus.des_status == 0 && User.current == @syllabus.user %> diff --git a/app/views/syllabuses/syllabus_courselist.html.erb b/app/views/syllabuses/syllabus_courselist.html.erb index ecb8ed7b8..123d1e332 100644 --- a/app/views/syllabuses/syllabus_courselist.html.erb +++ b/app/views/syllabuses/syllabus_courselist.html.erb @@ -5,6 +5,9 @@
  • 班级列表
  • +
  • + 教师团队 +
  • diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 792ff35fd..4040edcc8 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -369,7 +369,7 @@ zh: label_input_email: 请输入邮箱地址 label_invite_trustie_user: "邀请Trustie注册用户" - label_invite_trustie_user_tips: "支持姓名、邮箱、登录名搜索!" + label_invite_trustie_user_tips: "支持姓名、邮箱、登录名搜索" label_user_role_null: 用户和角色不能留空! label_invite_project: 邀请您加入项目 label_mail_invite_success: 您已成功加入项目! diff --git a/config/routes.rb b/config/routes.rb index afe30d4de..d3700bb73 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1140,6 +1140,7 @@ RedmineApp::Application.routes.draw do post 'update_base_info' get 'delete_syllabus' get 'delete_des' + get 'members' end collection do @@ -1147,6 +1148,16 @@ RedmineApp::Application.routes.draw do end end + resources :syllabus_member do + member do + post 'update_rank' + end + + collection do + get 'syl_member_autocomplete' + end + end + # add by nwb # 课程路由设置 resources :courses do diff --git a/db/migrate/20160921062340_create_syllabus_members.rb b/db/migrate/20160921062340_create_syllabus_members.rb new file mode 100644 index 000000000..c2e76ee3f --- /dev/null +++ b/db/migrate/20160921062340_create_syllabus_members.rb @@ -0,0 +1,23 @@ +class CreateSyllabusMembers < ActiveRecord::Migration + def change + create_table :syllabus_members do |t| + t.integer :rank + t.references :syllabus + t.references :user + + t.timestamps + end + add_index :syllabus_members, :syllabus_id + add_index :syllabus_members, :user_id + add_index :syllabus_members, :rank + + count = Syllabus.all.count / 30 + 2 + transaction do + for i in 1 ... count do i + Syllabus.page(i).per(30).each do |syllabus| + SyllabusMember.create(:user_id => syllabus.user_id, :syllabus_id => syllabus.id, :rank => 1) + end + end + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 443e8c426..d8a60c93f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160907080621) do +ActiveRecord::Schema.define(:version => 20160921062340) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -56,10 +56,10 @@ ActiveRecord::Schema.define(:version => 20160907080621) do t.integer "user_id" t.integer "applied_id" t.string "applied_type" - t.integer "viewed" - t.integer "status" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.integer "viewed", :default => 0 + t.integer "status", :default => 0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "name" t.integer "applied_user_id" t.integer "role" @@ -157,13 +157,13 @@ ActiveRecord::Schema.define(:version => 20160907080621) do create_table "attachments", :force => true do |t| t.integer "container_id" t.string "container_type", :limit => 30 - t.string "filename", :default => "", :null => false - t.string "disk_filename", :default => "", :null => false - t.integer "filesize", :default => 0, :null => false + t.string "filename", :default => "", :null => false + t.string "disk_filename", :default => "", :null => false + t.integer "filesize", :default => 0, :null => false t.string "content_type", :default => "" - t.string "digest", :limit => 40, :default => "", :null => false - t.integer "downloads", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false + t.string "digest", :limit => 40, :default => "", :null => false + t.integer "downloads", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false t.datetime "created_on" t.string "description" t.string "disk_directory" @@ -173,7 +173,6 @@ ActiveRecord::Schema.define(:version => 20160907080621) do t.integer "quotes" t.integer "is_publish", :default => 1 t.date "publish_time" - t.boolean "init_file", :default => false end add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" @@ -311,16 +310,14 @@ ActiveRecord::Schema.define(:version => 20160907080621) do add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" create_table "changesets", :force => true do |t| - t.integer "repository_id", :null => false - t.string "revision", :null => false + t.integer "repository_id", :null => false + t.string "revision", :null => false t.string "committer" - t.datetime "committed_on", :null => false + t.datetime "committed_on", :null => false t.text "comments" t.date "commit_date" t.string "scmid" t.integer "user_id" - t.integer "project_id" - t.integer "type", :default => 0 end add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" @@ -1881,6 +1878,9 @@ ActiveRecord::Schema.define(:version => 20160907080621) do t.datetime "updated_at", :null => false end + add_index "student_works_scores", ["student_work_id"], :name => "student_work_id" + add_index "student_works_scores", ["user_id"], :name => "user_id" + create_table "students_for_courses", :force => true do |t| t.integer "student_id" t.integer "course_id" @@ -1923,6 +1923,18 @@ ActiveRecord::Schema.define(:version => 20160907080621) do t.datetime "updated_at", :null => false end + create_table "syllabus_members", :force => true do |t| + t.integer "rank" + t.integer "syllabus_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "syllabus_members", ["rank"], :name => "index_syllabus_members_on_rank" + add_index "syllabus_members", ["syllabus_id"], :name => "index_syllabus_members_on_syllabus_id" + add_index "syllabus_members", ["user_id"], :name => "index_syllabus_members_on_user_id" + create_table "syllabuses", :force => true do |t| t.string "title" t.text "description" diff --git a/public/stylesheets/syllabus.css b/public/stylesheets/syllabus.css index 9aac34eae..1a04c73a5 100644 --- a/public/stylesheets/syllabus.css +++ b/public/stylesheets/syllabus.css @@ -617,3 +617,20 @@ a:hover.sy_class_ltitle{ color:#333;} /* 我的作业 */ .hw_classname{ width:180px; overflow:hidden; display:block;overflow:hidden;white-space: nowrap; text-overflow:ellipsis;} .hw_tab_top{ height: 50px; line-height: 50px; padding-left: 15px; border-bottom:1px solid #ddd; border-left:3px solid #3b94d6; } + +/*20160918教师团队*/ +.sy_new_tablebox{ padding:15px; padding-bottom:none;} +.sy_new_table{ width:100%; background:#fff; border:1px solid #e5e5e5; padding-bottom:30px;} +.sy_new_table thead tr{ height:40px; line-height:40px;} +.sy_new_table thead tr th{ border-bottom:1px solid #e5e5e5;} +.sy_new_table tbody tr:hover{ background:#f5f5f5;} +.sy_new_table tbody tr td{ height:40px; line-height:40px; border-bottom:1px dashed #e5e5e5; font-weight:normal; color:#888; text-align: center} +.sy_new_table tbody tr:last-child{ height:40px;} +.sy_new_tchlist li{ height:30px; line-height:30px;} +.sy_new_search{-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; border:1px solid #d3d3d3; background:#fff; padding-left:5px; color:#888; height:32px; width:370px;box-shadow: inset 0px 0px 3px #dcdcdc; } +.sy_new_tchbox{ background:#f5f5f5; padding:15px; margin:15px; margin-top:0px;} +.sy_new_orange{font-size: 12px;padding: 0 5px;border-radius: 3px;line-height: 14px;color: #ff4a1b;border: 1px solid #ff4a1b;} +.sy_new_namebox{ width:180px; overflow:hidden;} +.sy_new_name{ display:block;max-width:120px; overflow:hidden;white-space: nowrap; text-overflow:ellipsis;} +.sy_new_long_name{ display:block;width:180px; overflow:hidden;white-space: nowrap; text-overflow:ellipsis;} +.mt12{ margin-top:12px;} diff --git a/spec/controllers/syllabus_member_controller_spec.rb b/spec/controllers/syllabus_member_controller_spec.rb new file mode 100644 index 000000000..b56654f55 --- /dev/null +++ b/spec/controllers/syllabus_member_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe SyllabusMemberController, :type => :controller do + +end diff --git a/spec/factories/syllabus_members.rb b/spec/factories/syllabus_members.rb new file mode 100644 index 000000000..ab1bd6701 --- /dev/null +++ b/spec/factories/syllabus_members.rb @@ -0,0 +1,9 @@ +# Read about factories at https://github.com/thoughtbot/factory_girl + +FactoryGirl.define do + factory :syllabus_member do + rank 1 + syllabus nil + user nil + end +end diff --git a/spec/models/syllabus_member_spec.rb b/spec/models/syllabus_member_spec.rb new file mode 100644 index 000000000..464c1e965 --- /dev/null +++ b/spec/models/syllabus_member_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe SyllabusMember, :type => :model do + pending "add some examples to (or delete) #{__FILE__}" +end From e16b5b2f5d9dc4487cdece071f219a7409a0c9e7 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 23 Sep 2016 09:27:34 +0800 Subject: [PATCH 037/102] =?UTF-8?q?issue=E7=95=8C=E9=9D=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/issues/_project_issue.html.erb | 29 ++++++++++++++++++++---- public/stylesheets/css/project.css | 17 ++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/app/views/issues/_project_issue.html.erb b/app/views/issues/_project_issue.html.erb index 683b512f0..9c6e33630 100644 --- a/app/views/issues/_project_issue.html.erb +++ b/app/views/issues/_project_issue.html.erb @@ -10,8 +10,10 @@
    <%= activity.subject.to_s %> + <% if activity.journals.count > 0%> - 3 + <%= activity.journals.count %> + <% end %>
    @@ -20,12 +22,31 @@ <% else %> <%= link_to activity.try(:author).try(:realname), user_path(activity.author_id), :class => "fl issues_list_name" %> <% end %> -

    2016-05-15发布

    +

    <%=format_time(activity.created_on) %>发布

      -
    • 需求
    • -
    • hushashahushashahushasha
    • +
    • + <% case activity.tracker_id %> + <% when 1%> + 缺陷 + <% when 2%> + 功能 + <% when 3%> + 支持 + <% when 4%> + 任务 + <% when 5%> + 周报 + <% end %> +
    • + <% unless activity.assigned_to_id.nil? %> + <% if activity.try(:assigned_to).try(:realname) == ' ' %> + <%= link_to activity.try(:assigned_to), user_path(activity.assigned_to_id), :class => "c_grey" %> + <% else %> + <%= link_to activity.try(:assigned_to).try(:realname), user_path(activity.assigned_to_id), :class => "c_grey" %> + <% end %> + <% end %>
    • 20161231
    • 草稿
    • 90%
    • diff --git a/public/stylesheets/css/project.css b/public/stylesheets/css/project.css index bf906a38b..33b309605 100644 --- a/public/stylesheets/css/project.css +++ b/public/stylesheets/css/project.css @@ -875,3 +875,20 @@ a.sy_cgrey{ color: #888;} .sy_corange{ color: #ee4a1f;} a.sy_corange{ color: #ee4a1f;} a.sy_cblue{ color: #3b94d6;} +/* 新增粉色关注按钮*/ +a.sy_btn_pink{ + display: inline-block; + color: #fff; + background: #ff7d7d; + text-align: center; + font-size: 12px; + padding:0 15px; + height: 30px; + line-height: 30px; + -webkit-border-radius:3px; + -moz-border-radius:3px; + -o-border-radius:3px; + border-radius:3px; +} +a:hover.sy_btn_pink{ background: #e64c4c;} + From 5c54368518a701f95d48b2a48fca9d46ecd622ec Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 23 Sep 2016 09:29:31 +0800 Subject: [PATCH 038/102] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=96=B0=E7=89=88bas?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_base_project_top.html.erb | 22 ++++++++++++++++++++ app/views/layouts/base_projects.html.erb | 3 +++ 2 files changed, 25 insertions(+) create mode 100644 app/views/layouts/_base_project_top.html.erb diff --git a/app/views/layouts/_base_project_top.html.erb b/app/views/layouts/_base_project_top.html.erb new file mode 100644 index 000000000..22cb3f01a --- /dev/null +++ b/app/views/layouts/_base_project_top.html.erb @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb index 11cc8aada..e4f9dbd58 100644 --- a/app/views/layouts/base_projects.html.erb +++ b/app/views/layouts/base_projects.html.erb @@ -47,6 +47,9 @@
      + <%= render :partial => 'layouts/base_project_top' %> + +
    <% end %> diff --git a/public/images/sy/sy_icons02.png b/public/images/sy/sy_icons02.png new file mode 100644 index 0000000000000000000000000000000000000000..7d29ef2a9d231b23c3c502ade1f3b34e557c47b4 GIT binary patch literal 199603 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�m{XqI@Ou7k&ah6i{q1{JHfkf9xMXEt1 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 z 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 literal 0 HcmV?d00001 From 70042fe91fa016cf91f501fdd9416ed124af7aeb Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 23 Sep 2016 16:44:49 +0800 Subject: [PATCH 046/102] =?UTF-8?q?=E5=B8=96=E5=AD=90=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/messages_controller.rb | 56 +++++++++---------- app/helpers/application_helper.rb | 7 ++- app/models/blog_comment.rb | 2 + app/models/comment.rb | 2 + app/models/contest.rb | 1 + app/models/homework_common.rb | 2 + app/models/issue.rb | 1 + app/models/journal.rb | 2 + app/models/journals_for_message.rb | 2 + app/models/memo.rb | 2 + app/models/message.rb | 1 + app/models/news.rb | 3 + app/models/org_document_comment.rb | 2 + app/models/praise_tread_cache.rb | 3 +- app/models/syllabus.rb | 2 + app/views/messages/_course_show.html.erb | 6 +- .../messages/_org_subfield_show.html.erb | 6 +- app/views/messages/_project_show.html.erb | 6 +- app/views/praise_tread/_praise.html.erb | 4 +- 19 files changed, 68 insertions(+), 42 deletions(-) diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 37383712f..5731244c3 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -38,47 +38,45 @@ class MessagesController < ApplicationController # Show a topic and its replies def show @isReply = true - page = params[:page] - # Find the page of the requested reply - if params[:r] && page.nil? - offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i]) - page = 1 + offset / REPLIES_PER_PAGE - end + # page = params[:page] + # # Find the page of the requested reply + # if params[:r] && page.nil? + # offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i]) + # page = 1 + offset / REPLIES_PER_PAGE + # end all_comments = [] - @reply_count = get_all_children(all_comments, @topic).count + @replies = get_all_children(all_comments, @topic) + @reply_count = @replies.count @reply = Message.new(:subject => "RE: #{@message.subject}") if @course - messages_replies = @topic.children. - includes(:author, :attachments, {:board => :project}). - reorder("#{Message.table_name}.created_on DESC"). + #@replies = @topic.children. + #includes(:author, :attachments, :praise_tread_cache, {:board => :project}). + #reorder("#{Message.table_name}.created_on DESC"). #limit(@reply_pages.per_page). #offset(@reply_pages.offset). - all - @replies = paginateHelper messages_replies,10 - @reply = Message.new(:subject => "RE: #{@message.subject}") + #all + #@replies = paginateHelper messages_replies,10 @left_nav_type = 2 render :action => "show", :layout => "base_courses"#by young elsif @project - @reply_pages = Paginator.new @reply_count, REPLIES_PER_PAGE, page - @replies = @topic.children. - includes(:author, :attachments, {:board => :project}). - reorder("#{Message.table_name}.created_on DESC"). - limit(@reply_pages.per_page). - offset(@reply_pages.offset). - all + #@reply_pages = Paginator.new @reply_count, REPLIES_PER_PAGE, page + # @replies = @topic.children. + # includes(:author, :attachments, {:board => :project}). + # reorder("#{Message.table_name}.created_on DESC"). + # limit(@reply_pages.per_page). + # offset(@reply_pages.offset). + # all - @reply = Message.new(:subject => "RE: #{@message.subject}") render :action => "show", :layout => "base_projects"#by young else - @reply_pages = Paginator.new @reply_count, REPLIES_PER_PAGE, page - @replies = @topic.children. - includes(:author, :attachments, {:board => :project}). - reorder("#{Message.table_name}.created_on DESC"). - limit(@reply_pages.per_page). - offset(@reply_pages.offset). - all + # @reply_pages = Paginator.new @reply_count, REPLIES_PER_PAGE, page + # @replies = @topic.children. + # includes(:author, :attachments, {:board => :project}). + # reorder("#{Message.table_name}.created_on DESC"). + # limit(@reply_pages.per_page). + # offset(@reply_pages.offset). + # all - @reply = Message.new(:subject => "RE: #{@message.subject}") @organization = @org_subfield.organization render :action => "show", :layout => "base_org"#by young end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8b5b594bd..511266ba1 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -3246,7 +3246,12 @@ end #获取所有子节点 def get_all_children result, jour - if (jour.kind_of? JournalsForMessage) || (jour.kind_of? Message) || (jour.kind_of? BlogComment) || (jour.kind_of? OrgDocumentComment) + if jour.kind_of? JournalsForMessage + jour.children.includes(:author, :praise_tread_cache).each do |jour_child| + result << jour_child + get_all_children result, jour_child + end + elsif (jour.kind_of? Message) || (jour.kind_of? BlogComment) || (jour.kind_of? OrgDocumentComment) jour.children.each do |jour_child| result << jour_child get_all_children result, jour_child diff --git a/app/models/blog_comment.rb b/app/models/blog_comment.rb index 8959e9c29..6290840a3 100644 --- a/app/models/blog_comment.rb +++ b/app/models/blog_comment.rb @@ -12,6 +12,8 @@ class BlogComment < ActiveRecord::Base belongs_to :last_reply, :class_name => 'BlogComment', :foreign_key => 'last_comment_id' # 虚拟关联 has_many :user_acts, :class_name => 'UserAcivity',:as =>:act + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy acts_as_watchable validates_presence_of :title, :content diff --git a/app/models/comment.rb b/app/models/comment.rb index 633c9a825..27a917b93 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -27,6 +27,8 @@ class Comment < ActiveRecord::Base has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy has_many :forge_messages, :class_name => 'ForgeMessage', :as => :forge_message, :dependent => :destroy #end + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy acts_as_event :datetime => :updated_on, :description => :comments, :type => 'news', diff --git a/app/models/contest.rb b/app/models/contest.rb index 650e363a8..4fbd5441e 100644 --- a/app/models/contest.rb +++ b/app/models/contest.rb @@ -13,6 +13,7 @@ class Contest < ActiveRecord::Base has_many :join_in_competitions, foreign_key: 'competition_id', :dependent => :destroy has_many :join_in_contests, class_name: 'JoinInCompetition', foreign_key: 'competition_id', :dependent => :destroy has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy has_many :contestnotifications, :dependent => :destroy, :include => :author diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb index 7a082cecf..dfff273a0 100644 --- a/app/models/homework_common.rb +++ b/app/models/homework_common.rb @@ -19,6 +19,8 @@ class HomeworkCommon < ActiveRecord::Base has_many :student_works_evaluation_distributions, :through => :student_works #一个作业的分配的匿评列表 has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :apply_homeworks, :dependent => :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy #用户活动 # 课程动态 has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy diff --git a/app/models/issue.rb b/app/models/issue.rb index 222a4f4e2..9c3c8d168 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -53,6 +53,7 @@ class Issue < ActiveRecord::Base has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy # end has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy # ForgeMessage虚拟关联(多态) has_many :forge_messages, :class_name => 'ForgeMessage',:as =>:forge_message ,:dependent => :destroy diff --git a/app/models/journal.rb b/app/models/journal.rb index f22015f47..f14484a31 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -35,6 +35,8 @@ class Journal < ActiveRecord::Base # 被ForgeMessage虚拟关联 has_many :forge_messages, :class_name => 'ForgeMessage',:as =>:forge_message ,:dependent => :destroy has_many :at_messages, as: :at_message, dependent: :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy acts_as_attachable attr_accessor :indice acts_as_tree :counter_cache => :comments_count, :order => "#{Journal.table_name}.created_on ASC" diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb index 68cb9da15..30d8120ef 100644 --- a/app/models/journals_for_message.rb +++ b/app/models/journals_for_message.rb @@ -68,6 +68,8 @@ class JournalsForMessage < ActiveRecord::Base has_many :user_feedback_messages, :class_name => 'UserFeedbackMessage', :as =>:journals_for_message, :dependent => :destroy has_many :at_messages, as: :at_message, dependent: :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy validates :notes, presence: true, if: :is_homework_jour? after_create :act_as_activity, :act_as_course_activity, :act_as_course_message, diff --git a/app/models/memo.rb b/app/models/memo.rb index ee9f4c8db..793d534d4 100644 --- a/app/models/memo.rb +++ b/app/models/memo.rb @@ -48,6 +48,8 @@ class Memo < ActiveRecord::Base acts_as_attachable has_many :user_score_details, :class_name => 'UserScoreDetails',:as => :score_changeable_obj has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy + # 消息 has_many :memo_messages, :class_name =>'MemoMessage', :dependent => :destroy # end diff --git a/app/models/message.rb b/app/models/message.rb index 14add0d02..3192907fe 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -26,6 +26,7 @@ class Message < ActiveRecord::Base belongs_to :board,:touch => true belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy # has_many :org_subfield_messages, :dependent => :destroy # has_many :org_subfields, :through => :org_subfield_messages diff --git a/app/models/news.rb b/app/models/news.rb index 58bbc40ac..0a893e34e 100644 --- a/app/models/news.rb +++ b/app/models/news.rb @@ -40,6 +40,9 @@ class News < ActiveRecord::Base has_many :forge_messages, :class_name => 'ForgeMessage', :as => :forge_message, :dependent => :destroy #end + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy + #转发表 has_many :forwards, :as => :from, :dependent => :destroy diff --git a/app/models/org_document_comment.rb b/app/models/org_document_comment.rb index dd7734a54..a87fe783f 100644 --- a/app/models/org_document_comment.rb +++ b/app/models/org_document_comment.rb @@ -6,6 +6,8 @@ class OrgDocumentComment < ActiveRecord::Base belongs_to :organization belongs_to :creator, :class_name => 'User', :foreign_key => 'creator_id' has_many :editor_of_documents, :dependent => :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy acts_as_tree :order => "#{OrgDocumentComment.table_name}.sticky asc, #{OrgDocumentComment.table_name}.created_at desc" acts_as_attachable has_many :org_acts, :class_name => 'OrgActivity',:as =>:org_act ,:dependent => :destroy diff --git a/app/models/praise_tread_cache.rb b/app/models/praise_tread_cache.rb index 739b45876..27f4104fc 100644 --- a/app/models/praise_tread_cache.rb +++ b/app/models/praise_tread_cache.rb @@ -1,6 +1,7 @@ class PraiseTreadCache < ActiveRecord::Base attr_accessible :object_id,:object_type,:praise_num,:tread_num - + belongs_to :object, :polymorphic => true + def plus(flag,num) case flag when 0 diff --git a/app/models/syllabus.rb b/app/models/syllabus.rb index 0c23c1b13..f72463503 100644 --- a/app/models/syllabus.rb +++ b/app/models/syllabus.rb @@ -10,6 +10,8 @@ class Syllabus < ActiveRecord::Base has_many :courses has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :syllabus_members, :dependent => :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy + has_one :praise_tread_cache, as: :object, dependent: :destroy attr_accessible :description, :user_id, :title, :eng_name, :syllabus_type, :credit, :hours, :theory_hours, :practice_hours, :applicable_major, :pre_course safe_attributes 'title','user', 'description', 'eng_name', 'syllabus_type', 'credit', 'hours', 'theory_hours', 'practice_hours', 'credit', 'applicable_major', 'pre_course' diff --git a/app/views/messages/_course_show.html.erb b/app/views/messages/_course_show.html.erb index 95c9b7df1..abdeef255 100644 --- a/app/views/messages/_course_show.html.erb +++ b/app/views/messages/_course_show.html.erb @@ -93,10 +93,10 @@
    - <% all_comments = []%> - <% comments = get_all_children(all_comments, @topic) %> + <%# all_comments = []%> + <%# comments = get_all_children(all_comments, @topic) %>
    - <% comments.each_with_index do |reply,i| %> + <% @replies.each do |reply| %> -
    - <%= render :partial => 'issues/new_issue_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> -
    - <% if !@query.new_record? && @query.editable_by?(User.current) %> - <%= link_to l(:button_edit), edit_query_path(@query), :class => 'icon icon-edit' %> - <%= delete_link query_path(@query) %> + +
    +
    + + <% unless @project.enabled_modules.where("name = 'issue_tracking'").empty? %> + <%= form_tag({:controller => 'issues', :action => 'index', :project_id => @project},:remote=>'true', :method => :get,:id=>"issue_query_form", :class => 'query_form') do %> + <%= hidden_field_tag 'set_filter', '1' %> +
    + + 清除 +
    + + <%= text_field_tag 'issue_create_date_start_show', '开始日期', :readonly => true, :size => 13, :nhname => 'date_show', :class => 'issues_calendar_input fl '%> + <%= calendar_for('issue_create_date_start_show') %> + + + <%= text_field_tag 'issue_create_date_end_show', '结束日期', :readonly => true, :size => 13, :nhname => 'date_show', :class => 'issues_calendar_input fl'%> + <%= calendar_for('issue_create_date_end_show') %> + + + +
    +
    + +
    + +
    +
    + + <%= select( :issue, :user_id, principals_options_for_isuue_list(@project), + { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0 + }, + {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"w90 mr18"} + ) + %> + <%= select( :issue,:prior, [["低",1],["正常",2],["高",3],["紧急",4],["立刻",5]].unshift(["优先级",0]), + { :include_blank => false,:selected=>@priority_id ? @priority_id : 0 + }, + {:onchange=>"remote_function();",:id=>"priority_id",:name=>"priority_id",:class=>"w90 mr18"} + ) + %> + <%= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), + { :include_blank => false,:selected=>@status_id ? @status_id : 0 + }, + {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"w90 mr18"} + ) + %> + <%= select( :issue,:user_id, @project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["作者",0]), + { :include_blank => false,:selected=>@author_id ? @author_id : 0 + }, + {:onchange=>"remote_function();",:id=>"author_id",:name=>"author_id",:class=>"w90 mr18"} + ) + %> + + + <%#= select(:issue, :tracker_id, [["缺陷",1],["功能",2],["支持",3],["任务",4],["周报",5]].unshift(["类型",0]), + {:include_blank => false, :selected => @tracker_id ? @tracker_id : 0}, + {:onchange => "remote_function();", :id => "tracker_id", :name => "tracker_id", :class => "fl issues_filter_select_min"}) %> + <%#= select( :issue, :user_id, principals_options_for_isuue_list(@project), + { :include_blank => false,:selected=>@assign_to_id ? @assign_to_id : 0}, + {:onchange=>"remote_function();",:id=>"assigned_to_id",:name=>"assigned_to_id",:class=>"fl"}) + %> + + <%#= select(:issue, :fixed_version_id, options_for_version_isuue_list(@project), + {:include_blank => false, :selected => @fixed_version_id ? @fixed_version_id : 0}, + {:onchange => "remote_function();", :id => "fixed_version_id", :name => "fixed_version_id", :class => "f1"}) %> + + <%#= select( :issue,:status, [["新增",1],["正在解决",2],["已解决",3],["反馈",4],["关闭",5],["拒绝",6]].unshift(["状态",0]), + { :include_blank => false,:selected=>@status_id ? @status_id : 0 + }, + {:onchange=>"remote_function();",:id=>"status_id",:name=>"status_id",:class=>"fl issues_filter_select_min"} + ) %> + + <%#= select(:issue, :done_ratio, [["10%",1],["20%",2],["30%",3],["40%",4],["50%",5],["60%",6],["70%",7],["80%",8],["90%",9],["10%",10]].unshift(["完成度",0]), + {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0 }, + {:onchange => "remote_function();", :id => "done_ratio", :name => "done_ratio", :class => "f1"}) %> + + <%#= select(:issue, :test, [["最早创建",1],["最早更新",2]].unshift(["排序",0]), + {:include_blank => false, :selected => @order ? @order : 0 }, + {:onchange => "remote_function();", :id => "test", :name => "test", :class => "fr issues_filter_select_min"}) %> +
    +
    +
    + <% if @issues.empty? %> +

    <%= l(:label_no_data) %>

    + <% else %> +
    + <%= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> +
    + <% end %> + <%#= render :partial => 'issues/all_list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> +
    + + <% end %> <% end %>
    - - <% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %> -
    -
    - - <%= error_messages_for 'query' %> - - <% if @query.valid? %> - <% if @issues.empty? %> -

    - <%= l(:label_no_data) %> -

    - <% else %> -
    - <%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count,:project=>@project,:subject=>@subject} %> -
    - - - <% end %> - -
    - <%= link_to "导出:Excel", project_issues_path(:project_id => @project, :format => 'xls') %> - <%# other_formats_links do |f| %> - <%#= f.link_to "XLS", :url => params, :remote => false %> - <%#= f.link_to 'PDF', :url => params %> - <%# end %> -
    - - - <% end %> - <%= call_hook(:view_issues_index_bottom, {:issues => @issues, :project => @project, :query => @query}) %> - <% content_for :sidebar do %> - <%= render :partial => 'issues/sidebar' %> - <% end %> - - <% content_for :header_tags do %> - <%= auto_discovery_link_tag(:atom, - {:query_id => @query, :format => 'atom', - :page => nil, :key => User.current.rss_key}, - :title => l(:label_issue_plural)) %> - <%= auto_discovery_link_tag(:atom, - {:controller => 'journals', :action => 'index', - :query_id => @query, :format => 'atom', - :page => nil, :key => User.current.rss_key}, - :title => l(:label_changes_details)) %> - <% end %> - - <%= context_menu issues_context_menu_path %>
    \ No newline at end of file diff --git a/app/views/issues/index.js.erb b/app/views/issues/index.js.erb index 9068aac9e..c611706b2 100644 --- a/app/views/issues/index.js.erb +++ b/app/views/issues/index.js.erb @@ -1,4 +1,4 @@ //$("#issue_list").html("<%#= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query,:issue_pages=>@issue_pages,:issue_count=>@issue_count})%>"); -$("#issue_list").html("<%= escape_javascript(render :partial => 'issues/list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); +$("#issue_list").replaceWith("<%= escape_javascript(render :partial => 'issues/all_list',:locals => {:issues => @issues, :query => @query, :issue_pages=> @issue_pages, :issue_count => @issue_count, :project=> @project})%>"); $("#issue_list_pagination").html('<%= pagination_links_full @issue_pages, @issue_count, :issues => @issues, :per_page_links => false, :remote => @is_remote, :flag => true, :is_new => true %>'); From e75f32024471d09824920abd6430089f54ba3155 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 23 Sep 2016 17:55:29 +0800 Subject: [PATCH 052/102] =?UTF-8?q?=E5=88=86=E7=BB=84=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E7=9A=84=E4=BD=9C=E5=93=81=E9=BB=98=E8=AE=A4=E5=B1=95=E5=BC=80?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/student_work/_evaluation_un_group.html.erb | 2 +- app/views/student_work/_evaluation_un_group_work.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/student_work/_evaluation_un_group.html.erb b/app/views/student_work/_evaluation_un_group.html.erb index 75614a909..05cc7c5c1 100644 --- a/app/views/student_work/_evaluation_un_group.html.erb +++ b/app/views/student_work/_evaluation_un_group.html.erb @@ -5,7 +5,7 @@
    -
    +
    <%= render :partial => 'group_member_work', :locals => {:student_work => student_work} %>
    <% end %> diff --git a/app/views/student_work/_evaluation_un_group_work.html.erb b/app/views/student_work/_evaluation_un_group_work.html.erb index 5ce2545e7..25b42e5f6 100644 --- a/app/views/student_work/_evaluation_un_group_work.html.erb +++ b/app/views/student_work/_evaluation_un_group_work.html.erb @@ -1,5 +1,5 @@
    - + From b49e29860dde62eedb23884a2ad0f6b3fe7200d3 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 23 Sep 2016 18:24:30 +0800 Subject: [PATCH 053/102] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E7=9A=84=E6=B5=8B=E8=AF=95=E9=9B=86=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/student_work/_homework_post_brief.html.erb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/student_work/_homework_post_brief.html.erb b/app/views/student_work/_homework_post_brief.html.erb index 41dccfd92..6b3c0d542 100644 --- a/app/views/student_work/_homework_post_brief.html.erb +++ b/app/views/student_work/_homework_post_brief.html.erb @@ -52,14 +52,14 @@ - - + + <% homework.homework_tests.each_with_index do |test, i| %> - - + + <% end %>
     测试集输入测试集输出测试集输入测试集输出
    <%=i+1 %><%=test.input %><%=test.output %>
    <%=test.input %>
    <%=test.output %>
    From e1ce5d23053150f82ef6bca23a688449c5b599e3 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 23 Sep 2016 18:34:03 +0800 Subject: [PATCH 054/102] =?UTF-8?q?=E6=95=99=E5=B8=88=E5=9B=A2=E9=98=9F?= =?UTF-8?q?=E7=9A=84=E5=88=A0=E9=99=A4=E5=88=A4=E6=96=AD=E3=80=81=E2=80=9C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=99=E5=B8=88=E2=80=9D=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E6=97=B6=E5=B1=95=E5=BC=80=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=88=90=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/syllabuses_controller.rb | 1 + .../layouts/_syllabus_teacher_list.html.erb | 2 +- .../syllabuses/_syllabus_member_list.html.erb | 25 +++++++++++-------- app/views/syllabuses/members.html.erb | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/controllers/syllabuses_controller.rb b/app/controllers/syllabuses_controller.rb index 94f05409c..f0d1254bc 100644 --- a/app/controllers/syllabuses_controller.rb +++ b/app/controllers/syllabuses_controller.rb @@ -172,6 +172,7 @@ class SyllabusesController < ApplicationController def members @members = @syllabus.syllabus_members.includes(:user => {:user_extensions => [], :courses => []}).order("rank asc") + @show = params[:show] ? params[:show].to_i : 0 respond_to do |format| format.js format.html{render :layout => 'base_syllabus'} diff --git a/app/views/layouts/_syllabus_teacher_list.html.erb b/app/views/layouts/_syllabus_teacher_list.html.erb index c6d6fd59a..817836bbb 100644 --- a/app/views/layouts/_syllabus_teacher_list.html.erb +++ b/app/views/layouts/_syllabus_teacher_list.html.erb @@ -1,6 +1,6 @@

    教师团队 <% if User.current == @syllabus.user || User.current.admin? %> - 增加教师 + 增加教师 <% end %>

    diff --git a/app/views/syllabuses/_syllabus_member_list.html.erb b/app/views/syllabuses/_syllabus_member_list.html.erb index 4ee3b9c28..2a726ac18 100644 --- a/app/views/syllabuses/_syllabus_member_list.html.erb +++ b/app/views/syllabuses/_syllabus_member_list.html.erb @@ -4,7 +4,7 @@ 序号 姓名 - 身份 + 职业 创建班级数 参与班级数 <% if is_admin %> @@ -15,6 +15,7 @@ <% @members.each_with_index do |member, i| %> <% user = member.user %> + <% allow_delete = @syllabus.courses.where(:tea_id => member.user_id).empty? && i != 0 %> <%= member.rank %> @@ -36,16 +37,20 @@ <% if i == 0 %>   - <% elsif i == 1 %> - <%= link_to('删除', {:controller => 'syllabus_member', :action => 'destroy', :id => member.id, :syllabus => @syllabus.id},:remote => true, :method => 'delete', :class => "fr sy_btn_grey mr5", :title => l(:button_delete)) %> - <%= link_to('下移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'down'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '下移') %> - <% elsif i == @members.count - 1 %> - <%= link_to('删除', {:controller => 'syllabus_member', :action => 'destroy', :id => member.id, :syllabus => @syllabus.id},:remote => true, :method => 'delete', :class => "fr sy_btn_grey mr5", :title => l(:button_delete)) %> - <%= link_to('上移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'up'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '上移') %> <% else %> - <%= link_to('删除', {:controller => 'syllabus_member', :action => 'destroy', :id => member.id, :syllabus => @syllabus.id},:remote => true, :method => 'delete', :class => "fr sy_btn_grey mr5", :title => l(:button_delete)) %> - <%= link_to('下移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'down'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '下移') %> - <%= link_to('上移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'up'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '上移') %> + <% if allow_delete %> + <%= link_to('删除', {:controller => 'syllabus_member', :action => 'destroy', :id => member.id, :syllabus => @syllabus.id},:remote => true, :method => 'delete', :confirm => l(:text_are_you_sure), :class => "fr sy_btn_grey mr5", :title => l(:button_delete)) %> + <% else %> + 删除 + <% end %> + <% if i == 1 %> + <%= link_to('下移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'down'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '下移') %> + <% elsif i == @members.count - 1 %> + <%= link_to('上移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'up'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '上移') %> + <% else %> + <%= link_to('下移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'down'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '下移') %> + <%= link_to('上移', {:controller => 'syllabus_member', :action => 'update_rank', :id => member.id, :syllabus => @syllabus.id, :opr => 'up'},:remote => true, :method => 'post', :class => "fr sy_btn_blue mr5", :title => '上移') %> + <% end %> <% end %> <% end %> diff --git a/app/views/syllabuses/members.html.erb b/app/views/syllabuses/members.html.erb index fd4041b20..c9b117411 100644 --- a/app/views/syllabuses/members.html.erb +++ b/app/views/syllabuses/members.html.erb @@ -15,7 +15,7 @@ <%= render :partial => 'syllabus_member_list' %> 添加成员
    -