Merge branch 'szzh' of http://repository.trustie.net/xianbo/trustie2 into szzh
Conflicts: app/controllers/courses_controller.rb
This commit is contained in:
commit
d5de3dcb56
|
@ -79,6 +79,8 @@ class CoursesController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
def join_private_courses
|
||||
respond_to do |format|
|
||||
format.js
|
||||
|
@ -196,28 +198,102 @@ class CoursesController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def searchmembers
|
||||
@render_file = 'member_list'
|
||||
@canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
|
||||
@is_remote = true
|
||||
q = "#{params[:name].strip}"
|
||||
#(redirect_to stores_url, :notice => l(:label_sumbit_empty);return) if params[:name].blank?
|
||||
@results = searchStudent_by_name(@course, q)
|
||||
@result_count = @results.count
|
||||
@results = paginateHelper @results
|
||||
|
||||
end
|
||||
|
||||
def addgroups
|
||||
if params[:group_name]
|
||||
group = CourseGroup.new
|
||||
group.name = params[:group_name]
|
||||
group.course_id = @course.id
|
||||
group.save
|
||||
end
|
||||
@course_groups = @course.course_groups
|
||||
end
|
||||
|
||||
def updategroupname
|
||||
if params[:group_name]
|
||||
group = CourseGroup.find(params[:group_id])
|
||||
group.name = params[:group_name]
|
||||
group.save
|
||||
end
|
||||
@canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
|
||||
@is_remote = true
|
||||
@course_groups = @course.course_groups
|
||||
end
|
||||
def join_group
|
||||
group = CourseGroup.find(params[:object_id])
|
||||
member = Member.where(:course_id => @course.id, :user_id => User.current.id).first
|
||||
member.course_group_id = group.id
|
||||
member.save
|
||||
@group = group
|
||||
|
||||
search_group_members group
|
||||
end
|
||||
def unjoin_group
|
||||
group = CourseGroup.find(params[:object_id])
|
||||
member = Member.where(:course_id => @course.id, :user_id => User.current.id).first
|
||||
member.course_group_id = 0
|
||||
member.save
|
||||
@group = group
|
||||
|
||||
search_group_members group
|
||||
end
|
||||
def searchgroupmembers
|
||||
@render_file = 'member_list'
|
||||
@canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
|
||||
@is_remote = true
|
||||
if params[:group_id] && params[:group_id] != "0"
|
||||
@group = CourseGroup.find(params[:group_id])
|
||||
@results = searchStudent_by_group(@group, @course)
|
||||
else
|
||||
@results = searchStudent(@course)
|
||||
end
|
||||
|
||||
@results = paginateHelper @results
|
||||
end
|
||||
def search_group_members group
|
||||
@render_file = 'member_list'
|
||||
@canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
|
||||
@is_remote = true
|
||||
|
||||
@results = searchStudent_by_group(group, @course)
|
||||
@results = paginateHelper @results
|
||||
end
|
||||
def member
|
||||
## 有角色参数的才是课程,没有的就是项目
|
||||
if User.current.member_of_course?(@course) || User.current.admin?
|
||||
@render_file = 'member_list'
|
||||
@teachers= searchTeacherAndAssistant(@course)
|
||||
@canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
|
||||
case params[:role]
|
||||
when '1'
|
||||
@subPage_title = l :label_teacher_list
|
||||
@members = searchTeacherAndAssistant(@course)
|
||||
when '2'
|
||||
@subPage_title = l :label_student_list
|
||||
@members = searchStudent(@course)
|
||||
@render_file = 'member_list'
|
||||
@teachers= searchTeacherAndAssistant(@course)
|
||||
@canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
|
||||
@role = params[:role]
|
||||
@course_groups = @course.course_groups if @course.course_groups
|
||||
@course_group_id = params[:@course_group_id] unless params[:@course_group_id].nil?
|
||||
case params[:role]
|
||||
when '1'
|
||||
@subPage_title = l :label_teacher_list
|
||||
@members = searchTeacherAndAssistant(@course)
|
||||
when '2'
|
||||
@subPage_title = l :label_student_list
|
||||
if @course_group_id
|
||||
@members = search_student_in_group(@course, @course_group_id)
|
||||
else
|
||||
@subPage_title = ''
|
||||
@members = @course.member_principals.includes(:roles, :principal).all.sort
|
||||
end
|
||||
@members = paginateHelper @members
|
||||
render :layout => 'base_courses'
|
||||
else
|
||||
render_403
|
||||
@members = searchStudent(@course)
|
||||
end
|
||||
else
|
||||
@subPage_title = ''
|
||||
@members = @course.member_principals.includes(:roles, :principal).all.sort
|
||||
end
|
||||
@members = paginateHelper @members
|
||||
render :layout => 'base_courses'
|
||||
end
|
||||
|
||||
#判断指定用户是否为课程教师
|
||||
|
@ -270,11 +346,12 @@ class CoursesController < ApplicationController
|
|||
@course.setup_time = params[:setup_time]
|
||||
@course.endup_time = params[:endup_time]
|
||||
@course.class_period = params[:class_period]
|
||||
end
|
||||
|
||||
@issue_custom_fields = IssueCustomField.sorted.all
|
||||
@trackers = Tracker.sorted.all
|
||||
@issue_custom_fields = IssueCustomField.sorted.all
|
||||
@trackers = Tracker.sorted.all
|
||||
|
||||
if @course.save
|
||||
if @course.save
|
||||
#unless User.current.admin?
|
||||
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
|
||||
m = Member.new(:user => User.current, :roles => [r])
|
||||
|
@ -300,16 +377,13 @@ class CoursesController < ApplicationController
|
|||
}
|
||||
format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'courses', :action => 'show', :id => @course.id) }
|
||||
end
|
||||
else
|
||||
else
|
||||
#@course.destroy
|
||||
respond_to do |format|
|
||||
format.html { render :action => 'new', :layout => 'base' } #Added by young
|
||||
format.api { render_validation_errors(@course) }
|
||||
end
|
||||
end
|
||||
else
|
||||
redirect_to my_account_url
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def course
|
||||
|
@ -669,29 +743,24 @@ class CoursesController < ApplicationController
|
|||
end
|
||||
|
||||
def feedback
|
||||
if (User.current.admin? || @course.is_public == 1 || (@course.is_public == 0 && User.current.member_of_course?(@course)))
|
||||
page = params[:page]
|
||||
# Find the page of the requested reply
|
||||
@jours = @course.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
|
||||
@limit = 10
|
||||
if params[:r] && page.nil?
|
||||
offset = @jours.count(:conditions => ["#{JournalsForMessage.table_name}.id > ?", params[:r].to_i])
|
||||
page = 1 + offset / @limit
|
||||
end
|
||||
|
||||
#@feedback_count = @jours.count
|
||||
#@feedback_pages = Paginator.new @feedback_count, @limit, page
|
||||
#@offset ||= @feedback_pages.offset
|
||||
@jour = paginateHelper @jours,10
|
||||
@state = false
|
||||
respond_to do |format|
|
||||
format.html{render :layout => 'base_courses'}
|
||||
format.api
|
||||
end
|
||||
else
|
||||
render_403
|
||||
page = params[:page]
|
||||
# Find the page of the requested reply
|
||||
@jours = @course.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
|
||||
@limit = 10
|
||||
if params[:r] && page.nil?
|
||||
offset = @jours.count(:conditions => ["#{JournalsForMessage.table_name}.id > ?", params[:r].to_i])
|
||||
page = 1 + offset / @limit
|
||||
end
|
||||
|
||||
#@feedback_count = @jours.count
|
||||
#@feedback_pages = Paginator.new @feedback_count, @limit, page
|
||||
#@offset ||= @feedback_pages.offset
|
||||
@jour = paginateHelper @jours,10
|
||||
@state = false
|
||||
respond_to do |format|
|
||||
format.html{render :layout => 'base_courses'}
|
||||
format.api
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -155,7 +155,7 @@ module CoursesHelper
|
|||
members
|
||||
end
|
||||
|
||||
def searchStudent project
|
||||
def search_student_in_group(project, course_group_id)
|
||||
#searchPeopleByRoles(project, StudentRoles)
|
||||
members = []
|
||||
project.members.each do |m|
|
||||
|
@ -163,6 +163,35 @@ module CoursesHelper
|
|||
end
|
||||
members
|
||||
end
|
||||
def searchStudent project
|
||||
#searchPeopleByRoles(project, StudentRoles)
|
||||
members = []
|
||||
project.members.each do |m|
|
||||
members << m if m && m.user && m.user.allowed_to?(:as_student,project)
|
||||
end
|
||||
members
|
||||
end
|
||||
def searchStudent_by_name project, name
|
||||
#searchPeopleByRoles(project, StudentRoles)
|
||||
members = []
|
||||
project.members.each do |m|
|
||||
if m && m.user && m.user.allowed_to?(:as_student,project)
|
||||
username = m.user[:lastname].to_s + m.user[:firstname].to_s
|
||||
if(m.user[:login].to_s.include?(name) || m.user.user_extensions[:student_id].to_s.include?(name) || username.include?(name))
|
||||
members << m
|
||||
end
|
||||
end
|
||||
end
|
||||
members
|
||||
end
|
||||
def searchStudent_by_group group, project
|
||||
#searchPeopleByRoles(project, StudentRoles)
|
||||
members = []
|
||||
group.members.each do |m|
|
||||
members << m if m && m.user && m.user.allowed_to?(:as_student,project)
|
||||
end
|
||||
members
|
||||
end
|
||||
# =====================================================================================
|
||||
|
||||
#def searchCountByRoles project, roles_id
|
||||
|
|
|
@ -108,6 +108,37 @@ module WatchersHelper
|
|||
link_to text, url, :remote => true, :method => method, :id => "#{course.id}", :class => []+options
|
||||
end
|
||||
end
|
||||
def join_in_course_group(coursegroups,group, user, options=[])
|
||||
return '' unless user && user.logged?
|
||||
|
||||
@isjoin = false
|
||||
coursegroups.each do |g|
|
||||
g.members.each do |mem|
|
||||
if mem.user_id == user.id
|
||||
@isjoin = true
|
||||
end
|
||||
end
|
||||
end
|
||||
url_t = join_group_path(:object_id => group.id)
|
||||
url_f = join_group_path(:object_id => group.id)
|
||||
if @isjoin == true
|
||||
joined = user.member_of_course_group?(group)
|
||||
text = l(:label_exit_course)
|
||||
|
||||
if joined
|
||||
link_to text, {:controller => "courses", :action => "join_group", :object_id => "#{group.id}"},
|
||||
:remote => true, :method => 'delete',
|
||||
:id => "#{group.id}", :style => "padding: 8px 8px 4px;",
|
||||
:confirm => l(:text_are_you_sure_out_group), :class => 'group_in'
|
||||
|
||||
end
|
||||
else
|
||||
text = l(:label_new_join)
|
||||
form_tag({:controller => "courses", :action => "join_group", :object_id => "#{group.id}"}, :remote => true, :method => 'post') do
|
||||
submit_tag text, class: "group_in", style: "width: 43px;height: 21px;"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# 用户是否允许加入课程判断
|
||||
# add by nwb
|
||||
|
@ -124,7 +155,8 @@ module WatchersHelper
|
|||
if joined
|
||||
link_to text, url_t, :remote => true, :method => method, :id => "#{course.id}", :confirm => l(:text_are_you_sure_out), :class => []+options
|
||||
else
|
||||
link_to text, url_f, :remote => true, :method => method, :id => "#{course.id}", :class => []+options
|
||||
|
||||
link_to text, url_f, :remote => true, :method => method, :id => "#{course.id}", :class => []+options
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -29,6 +29,8 @@ class Course < ActiveRecord::Base
|
|||
has_many :news, :dependent => :destroy, :include => :author
|
||||
has_one :course_status, :class_name => "CourseStatus", :dependent => :destroy
|
||||
|
||||
has_many :course_groups, :dependent => :destroy
|
||||
|
||||
acts_as_taggable
|
||||
acts_as_nested_set :order => 'name', :dependent => :destroy
|
||||
acts_as_attachable :view_permission => :view_course_files,
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
class CourseGroup < ActiveRecord::Base
|
||||
# attr_accessible :title, :body
|
||||
belongs_to :course
|
||||
has_many :members
|
||||
has_many :memberships, :class_name => 'Member'
|
||||
has_many :member_principals, :class_name => 'Member',
|
||||
:include => :principal,
|
||||
:conditions => "#{Principal.table_name}.type='Group' OR (#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE})"
|
||||
has_many :principals, :through => :member_principals, :source => :principal
|
||||
has_many :users, :through => :members
|
||||
|
||||
before_destroy :set_member_nil
|
||||
|
||||
attr_accessible :name
|
||||
|
||||
def set_member_nil
|
||||
if self.members && self.members.count > 0
|
||||
self.members.update_all("course_group_id = 0")
|
||||
end
|
||||
end
|
||||
end
|
|
@ -24,6 +24,7 @@ class Member < ActiveRecord::Base
|
|||
belongs_to :project
|
||||
belongs_to :course
|
||||
|
||||
belongs_to :course_group
|
||||
validates_presence_of :principal
|
||||
validates_uniqueness_of :user_id, :scope => [:project_id,:course_id]
|
||||
validate :validate_role
|
||||
|
|
|
@ -26,10 +26,11 @@ class Principal < ActiveRecord::Base
|
|||
|
||||
has_many :members, :foreign_key => 'user_id', :dependent => :destroy
|
||||
has_many :memberships, :class_name => 'Member', :foreign_key => 'user_id', :include => [ :project, :roles ], :conditions => "#{Project.table_name}.status<>#{Project::STATUS_ARCHIVED}", :order => "#{Project.table_name}.name"
|
||||
has_many :coursememberships, :class_name => 'Member', :foreign_key => 'user_id', :include => [ :course, :roles ], :conditions => "#{Course.table_name}.status<>#{Course::STATUS_ARCHIVED}", :order => "#{Course.table_name}.name"
|
||||
has_many :coursememberships, :class_name => 'Member', :foreign_key => 'user_id', :include => [ :course, :roles ], :order => "#{Course.table_name}.name"
|
||||
has_many :projects, :through => :memberships
|
||||
#add by nwb
|
||||
has_many :courses, :through => :coursememberships
|
||||
has_many :course_groups, :through => :coursememberships
|
||||
has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify
|
||||
|
||||
# Groups and active users
|
||||
|
|
|
@ -690,6 +690,9 @@ class User < Principal
|
|||
courses.to_a.include?(course)
|
||||
end
|
||||
|
||||
def member_of_course_group?(course_group)
|
||||
course_groups.to_a.include?(course_group)
|
||||
end
|
||||
# Returns a hash of user's projects grouped by roles
|
||||
def projects_by_role
|
||||
return @projects_by_role if @projects_by_role
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
|
||||
|
||||
|
||||
<ul>
|
||||
|
||||
<li style=" color:#8b8b8b;">分班:</li>
|
||||
|
||||
<li class="classbox">
|
||||
<% course_member_count = l(:label_all) + "(" + @course.members.count.to_s + "人)" %>
|
||||
<%= form_tag( searchgroupmembers_course_path(@course, :group_id => 0), method: 'get',:remote=>true) do %>
|
||||
|
||||
|
||||
<%= hidden_field_tag "all", params[:group_id], name: 'all' %>
|
||||
<%= submit_tag course_member_count, :style => "background: #f8df8c; border:0px; color: black" %>
|
||||
|
||||
<% end %>
|
||||
</li>
|
||||
<% if course_groups.any? %>
|
||||
<% course_groups.each do |group| %>
|
||||
<% group_display = group.name + "(" + group.members.count.to_s + "人)" %>
|
||||
<li class="classbox" id="group_name_<%= group.id %>">
|
||||
<%= form_tag(searchgroupmembers_course_path(@course,:group_id => group.id), method: 'get', remote: true) do %>
|
||||
<%#= text_field_tag "group_id", params[:group_id] %>
|
||||
<%= submit_tag group_display, :onclick => "$asign_id(#{group.id})",:style => "background: #f8df8c; border:0px; color: black; float:left;"%>
|
||||
<% if @canShowCode %>
|
||||
<a href="javascript:void(0)" class="f_l" onclick="$('#add_tag_<%= group.id %>').slideToggle();"><img src="/images/pic_edit.png" width="14" height="15" alt="编辑班级" /></a>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</li>
|
||||
<li>
|
||||
<%= form_tag(updategroupname_course_path(@course,:group_id => group.id), method: 'get', remote:true, update: 'group_name') do %>
|
||||
<span id="add_tag_<%= group.id %>" style="display:none; vertical-align: middle;" class=" f_l">
|
||||
<%= text_field_tag "group_name", params[:group_name], :size=>10, :class=>"isTxt w90 f_l", :style=>"padding: 0px", :max => 100 %>
|
||||
<!--<input type="button" class="submit f_l" onclick="addTag();" style="width: 43px"/>-->
|
||||
<%= submit_tag '', class: "submit f_l", style: "width: 43px;height: 21px;background: url(/images/btn.png) no-repeat 0 0;" %>
|
||||
</span>
|
||||
<% end %>
|
||||
</li>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @canShowCode %>
|
||||
<li style="margin-left:15px;">
|
||||
<a href="javascript:void(0)" class="st_add f_l" onclick="$('#add_tag04').slideToggle();">+添加分班</a>
|
||||
</li>
|
||||
<li>
|
||||
<span id="add_tag04" style="display:none; vertical-align: middle;" class="ml10 f_l">
|
||||
<%= form_tag( addgroups_course_path(@course), method: 'get',:remote=>true) do %>
|
||||
|
||||
<%= text_field_tag "group_name", params[:group_name], size: "20", class: "isTxt w90 f_l", style: "padding: 0px", maxlength: "100" %>
|
||||
<%= submit_tag '', class: "submit f_l", style: "width: 43px;height: 21px;background: url(/images/btn.png) no-repeat 0 0;" %>
|
||||
<%= link_to_function '', "$('#add_tag04').slideToggle();", class: "submit_2", style: "width: 43px"%>
|
||||
|
||||
<% end %>
|
||||
</span>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
|
||||
|
||||
|
|
@ -1,4 +1,17 @@
|
|||
<div >
|
||||
<% if @group %>
|
||||
<% if !@canShowCode %>
|
||||
<%= join_in_course_group(@course.course_groups,@group, User.current) %>
|
||||
<% end %>
|
||||
<span style="font-size: 18px"><%= @group.name %><%= @subPage_title %></span>
|
||||
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<% if members.any? %>
|
||||
<% if @result_count %>
|
||||
<p style="font-size: 18px;"><%= l(:label_search_member_count) %><%= @result_count %><%= l(:label_member_people) %></p>
|
||||
<% end %>
|
||||
<% members.each do |member| %>
|
||||
<div class="well">
|
||||
<% next if member.new_record? %>
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
$("#st_groups").html("<%= escape_javascript( render :partial => 'groups_name', locals: {:course_groups => @course_groups})%>");
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
$("#member_content").html("<%= escape_javascript( render :partial => @render_file, :locals => {:members => @results})%>");
|
|
@ -1,10 +1,28 @@
|
|||
<div class="member_header">
|
||||
<p>
|
||||
<%= @subPage_title %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="member_content">
|
||||
<%= error_messages_for 'member' %>
|
||||
<%= render :partial => @render_file, :locals => {:members => @members} %>
|
||||
<%= stylesheet_link_tag 'course_group', :media => 'all' %>
|
||||
<script type="text/javascript" src="javascripts/jquery-1.8.3-ui-1.9.2-ujs-2.0.3.js"></script>
|
||||
<div class="st_list">
|
||||
<div class="st_search">
|
||||
<span class="f_l"><%= @subPage_title %></span>
|
||||
<% if @subPage_title == l(:label_student_list) %>
|
||||
<%= form_tag( searchmembers_course_path(@course), method: 'get',:class => "f_l",:remote=>true) do %>
|
||||
<%= text_field_tag 'name', params[:name], name: "name", :class => 'f_1'%>
|
||||
<%= submit_tag l(:label_search), :class => "f_2"%>
|
||||
<%#= link_to l(:label_search),'' , :class => 'f_2' %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="cl"></div>
|
||||
|
||||
<div class="st_addclass" id = "st_groups">
|
||||
<%= render :partial => 'groups_name', locals: {:course_groups => @course_groups} %>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="cl"></div>
|
||||
|
||||
<div class="member_content" id = "member_content">
|
||||
<%= error_messages_for 'member' %>
|
||||
<%= render :partial => @render_file, :locals => {:members => @members} %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
/**
|
||||
* Created by Administrator on 2014/12/3.
|
||||
*/
|
||||
$("#member_content").html("<%= escape_javascript( render :partial => @render_file, :locals => {:members => @results})%>");
|
|
@ -0,0 +1,4 @@
|
|||
/**
|
||||
* Created by Administrator on 2014/12/2.
|
||||
*/
|
||||
$("#member_content").html("<%= escape_javascript( render :partial => @render_file, :locals => {:members => @results})%>");
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
$("#member_content").html("<%= escape_javascript( render :partial => @render_file, :locals => {:members => @results})%>");
|
|
@ -0,0 +1,4 @@
|
|||
/**
|
||||
* Created by Administrator on 2014/12/3.
|
||||
*/
|
||||
$("#st_groups").html("<%= escape_javascript( render :partial => 'groups_name', locals: {:course_groups => @course_groups})%>");
|
|
@ -569,7 +569,9 @@ zh:
|
|||
label_role_plural: 角色
|
||||
label_role_new: 新建角色
|
||||
label_role_and_permissions: 角色和权限
|
||||
label_member: 成员
|
||||
label_member:
|
||||
label_search_member_count: 共搜索到
|
||||
label_member_people: 人
|
||||
label_member_new: 添加成员
|
||||
label_member_plural: 成员
|
||||
label_tracker: 跟踪标签
|
||||
|
@ -1120,6 +1122,7 @@ zh:
|
|||
text_workflow_edit: 选择角色和跟踪标签来编辑工作流程
|
||||
text_are_you_sure: 您确定要删除吗?
|
||||
text_are_you_sure_out: 你确定要退出该课程吗?
|
||||
text_are_you_sure_out_group: 你确定要退出该分组吗?
|
||||
text_journal_changed: "%{label} 从 %{old} 变更为 %{new}"
|
||||
text_journal_set_to: "%{label} 被设置为 %{value}"
|
||||
text_journal_deleted: "%{label} 已删除 (%{old})"
|
||||
|
|
|
@ -643,10 +643,16 @@ RedmineApp::Application.routes.draw do
|
|||
get 'member', :controller => 'courses', :action => 'member', :as => 'member'
|
||||
post 'finishcourse'
|
||||
post 'restartcourse'
|
||||
|
||||
match "searchmembers", :controller => 'courses', :action => 'searchmembers', :via => [:post,:get]
|
||||
match "searchgroupmembers", :via => [:post, :get]
|
||||
match "updategroupname", :via => [:post, :get]
|
||||
match "addgroups", :via => [:post, :get]
|
||||
post 'join_in/join_group', :to => 'courses#join_group', :as => 'join_group'
|
||||
delete 'join_in/join_group', :to => 'courses#unjoin_group'
|
||||
end
|
||||
collection do
|
||||
match 'join_private_courses', :via => [:get, :post]
|
||||
|
||||
end
|
||||
|
||||
match '/member', :to => 'courses#member', :as => 'member', :via => :get
|
||||
|
@ -739,6 +745,8 @@ RedmineApp::Application.routes.draw do
|
|||
|
||||
post 'join_in/join', :to => 'courses#join', :as => 'join'
|
||||
delete 'join_in/join', :to => 'courses#unjoin'
|
||||
post 'join_in/join_group', :to => 'courses#join_group', :as => 'join_group'
|
||||
delete 'join_in/join_group', :to => 'courses#unjoin_group'
|
||||
post 'calls/:id/join_in_contest', :to => 'bids#join_in_contest', :as => 'join_in_contest'
|
||||
delete 'calls/:id/join_in_contest', :to => 'bids#unjoin_in_contest'
|
||||
match 'calls/:id/show_participator', :to => 'bids#show_participator' # bai
|
||||
|
@ -747,6 +755,7 @@ RedmineApp::Application.routes.draw do
|
|||
|
||||
delete 'attachment/:id', :to => 'attachments#delete_homework'
|
||||
match 'new_join', :to => 'courses#new_join', :as => 'try_join'
|
||||
match 'new_join_group', :to => 'courses#new_join_group', :as => 'try_join_group'
|
||||
match 'new_join_in_contest', :to => 'bids#new_join', :as => 'try_join_in_contest'
|
||||
match 'projects/:id/respond', :to => 'projects#project_respond', :via => :post
|
||||
match 'calls/:id/manage',:to => 'bids#manage',:via => [:get,:post]
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
class CreateCourseGroups < ActiveRecord::Migration
|
||||
def change
|
||||
create_table :course_groups do |t|
|
||||
t.string :name
|
||||
t.integer :course_id
|
||||
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,5 @@
|
|||
class AddColumnToMembers < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :members, :course_group_id, :integer, default: 0
|
||||
end
|
||||
end
|
1327
db/schema.rb
1327
db/schema.rb
File diff suppressed because it is too large
Load Diff
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 769 B |
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 958 B |
Binary file not shown.
After Width: | Height: | Size: 629 B |
Binary file not shown.
After Width: | Height: | Size: 217 B |
|
@ -1,696 +0,0 @@
|
|||
//= require_directory ./rateable
|
||||
/* Redmine - project management software
|
||||
Copyright (C) 2006-2013 Jean-Philippe Lang */
|
||||
|
||||
function cleanArray (actual){
|
||||
var newArray = new Array();
|
||||
for (var i = 0; i< actual.length; i++){
|
||||
if (actual[i]){
|
||||
newArray.push(actual[i]);
|
||||
}
|
||||
}
|
||||
return newArray;
|
||||
}
|
||||
|
||||
function checkAll(id, checked) {
|
||||
if (checked) {
|
||||
$('#'+id).find('input[type=checkbox]').attr('checked', true);
|
||||
} else {
|
||||
$('#'+id).find('input[type=checkbox]').removeAttr('checked');
|
||||
}
|
||||
}
|
||||
|
||||
function toggleCheckboxesBySelector(selector) {
|
||||
var all_checked = true;
|
||||
$(selector).each(function(index) {
|
||||
if (!$(this).is(':checked')) { all_checked = false; }
|
||||
});
|
||||
$(selector).attr('checked', !all_checked);
|
||||
}
|
||||
|
||||
function showAndScrollTo(id, focus) {
|
||||
$('#'+id).show();
|
||||
if (focus !== null) {
|
||||
$('#'+focus).focus();
|
||||
}
|
||||
$('html, body').animate({scrollTop: $('#'+id).offset().top}, 400);
|
||||
}
|
||||
|
||||
function toggleRowGroup(el) {
|
||||
var tr = $(el).parents('tr').first();
|
||||
var n = tr.next();
|
||||
tr.toggleClass('open');
|
||||
while (n.length && !n.hasClass('group')) {
|
||||
n.toggle();
|
||||
n = n.next('tr');
|
||||
}
|
||||
}
|
||||
|
||||
function collapseAllRowGroups(el) {
|
||||
var tbody = $(el).parents('tbody').first();
|
||||
tbody.children('tr').each(function(index) {
|
||||
if ($(this).hasClass('group')) {
|
||||
$(this).removeClass('open');
|
||||
} else {
|
||||
$(this).hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function expandAllRowGroups(el) {
|
||||
var tbody = $(el).parents('tbody').first();
|
||||
tbody.children('tr').each(function(index) {
|
||||
if ($(this).hasClass('group')) {
|
||||
$(this).addClass('open');
|
||||
} else {
|
||||
$(this).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function toggleAllRowGroups(el) {
|
||||
var tr = $(el).parents('tr').first();
|
||||
if (tr.hasClass('open')) {
|
||||
collapseAllRowGroups(el);
|
||||
} else {
|
||||
expandAllRowGroups(el);
|
||||
}
|
||||
}
|
||||
|
||||
function toggleFieldset(el) {
|
||||
var fieldset = $(el).parents('fieldset').first();
|
||||
fieldset.toggleClass('collapsed');
|
||||
fieldset.children('div').toggle();
|
||||
}
|
||||
|
||||
function hideFieldset(el) {
|
||||
var fieldset = $(el).parents('fieldset').first();
|
||||
fieldset.toggleClass('collapsed');
|
||||
fieldset.children('div').hide();
|
||||
}
|
||||
|
||||
function initFilters(){
|
||||
$('#add_filter_select').change(function(){
|
||||
addFilter($(this).val(), '', []);
|
||||
});
|
||||
$('#filters-table td.field input[type=checkbox]').each(function(){
|
||||
toggleFilter($(this).val());
|
||||
});
|
||||
$('#filters-table td.field input[type=checkbox]').live('click',function(){
|
||||
toggleFilter($(this).val());
|
||||
});
|
||||
$('#filters-table .toggle-multiselect').live('click',function(){
|
||||
toggleMultiSelect($(this).siblings('select'));
|
||||
});
|
||||
$('#filters-table input[type=text]').live('keypress', function(e){
|
||||
if (e.keyCode == 13) submit_query_form("query_form");
|
||||
});
|
||||
}
|
||||
|
||||
function addFilter(field, operator, values) {
|
||||
var fieldId = field.replace('.', '_');
|
||||
var tr = $('#tr_'+fieldId);
|
||||
if (tr.length > 0) {
|
||||
tr.show();
|
||||
} else {
|
||||
buildFilterRow(field, operator, values);
|
||||
}
|
||||
$('#cb_'+fieldId).attr('checked', true);
|
||||
toggleFilter(field);
|
||||
$('#add_filter_select').val('').children('option').each(function(){
|
||||
if ($(this).attr('value') == field) {
|
||||
$(this).attr('disabled', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function buildFilterRow(field, operator, values) {
|
||||
var fieldId = field.replace('.', '_');
|
||||
var filterTable = $("#filters-table");
|
||||
var filterOptions = availableFilters[field];
|
||||
var operators = operatorByType[filterOptions['type']];
|
||||
var filterValues = filterOptions['values'];
|
||||
var i, select;
|
||||
|
||||
var tr = $('<tr class="filter">').attr('id', 'tr_'+fieldId).html(
|
||||
'<td class="field"><input checked="checked" id="cb_'+fieldId+'" name="f[]" value="'+field+'" type="checkbox"><label for="cb_'+fieldId+'"> '+filterOptions['name']+'</label></td>' +
|
||||
'<td class="operator"><select id="operators_'+fieldId+'" name="op['+field+']"></td>' +
|
||||
'<td class="values"></td>'
|
||||
);
|
||||
filterTable.append(tr);
|
||||
|
||||
select = tr.find('td.operator select');
|
||||
for (i=0;i<operators.length;i++){
|
||||
var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]);
|
||||
if (operators[i] == operator) { option.attr('selected', true); }
|
||||
select.append(option);
|
||||
}
|
||||
select.change(function(){ toggleOperator(field); });
|
||||
|
||||
switch (filterOptions['type']){
|
||||
case "list":
|
||||
case "list_optional":
|
||||
case "list_status":
|
||||
case "list_subprojects":
|
||||
tr.find('td.values').append(
|
||||
'<span style="display:none;"><select class="value" id="values_'+fieldId+'_1" name="v['+field+'][]"></select>' +
|
||||
' <span class="toggle-multiselect"><a>复选/multi-select</a></span></span>'
|
||||
);
|
||||
select = tr.find('td.values select');
|
||||
if (values.length > 1) { select.attr('multiple', true); }
|
||||
for (i=0;i<filterValues.length;i++){
|
||||
var filterValue = filterValues[i];
|
||||
var option = $('<option>');
|
||||
if ($.isArray(filterValue)) {
|
||||
option.val(filterValue[1]).text(filterValue[0]);
|
||||
if ($.inArray(filterValue[1], values) > -1) {option.attr('selected', true);}
|
||||
} else {
|
||||
option.val(filterValue).text(filterValue);
|
||||
if ($.inArray(filterValue, values) > -1) {option.attr('selected', true);}
|
||||
}
|
||||
select.append(option);
|
||||
}
|
||||
break;
|
||||
case "date":
|
||||
case "date_past":
|
||||
tr.find('td.values').append(
|
||||
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' +
|
||||
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' +
|
||||
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>'
|
||||
);
|
||||
$('#values_'+fieldId+'_1').val(values[0]).datepicker(datepickerOptions);
|
||||
$('#values_'+fieldId+'_2').val(values[1]).datepicker(datepickerOptions);
|
||||
$('#values_'+fieldId).val(values[0]);
|
||||
break;
|
||||
case "string":
|
||||
case "text":
|
||||
tr.find('td.values').append(
|
||||
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" /></span>'
|
||||
);
|
||||
$('#values_'+fieldId).val(values[0]);
|
||||
break;
|
||||
case "relation":
|
||||
tr.find('td.values').append(
|
||||
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="6" class="value" /></span>' +
|
||||
'<span style="display:none;"><select class="value" name="v['+field+'][]" id="values_'+fieldId+'_1"></select></span>'
|
||||
);
|
||||
$('#values_'+fieldId).val(values[0]);
|
||||
select = tr.find('td.values select');
|
||||
for (i=0;i<allProjects.length;i++){
|
||||
var filterValue = allProjects[i];
|
||||
var option = $('<option>');
|
||||
option.val(filterValue[1]).text(filterValue[0]);
|
||||
if (values[0] == filterValue[1]) { option.attr('selected', true); }
|
||||
select.append(option);
|
||||
}
|
||||
case "integer":
|
||||
case "float":
|
||||
tr.find('td.values').append(
|
||||
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="6" class="value" /></span>' +
|
||||
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="6" class="value" /></span>'
|
||||
);
|
||||
$('#values_'+fieldId+'_1').val(values[0]);
|
||||
$('#values_'+fieldId+'_2').val(values[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function toggleFilter(field) {
|
||||
var fieldId = field.replace('.', '_');
|
||||
if ($('#cb_' + fieldId).is(':checked')) {
|
||||
$("#operators_" + fieldId).show().removeAttr('disabled');
|
||||
toggleOperator(field);
|
||||
} else {
|
||||
$("#operators_" + fieldId).hide().attr('disabled', true);
|
||||
enableValues(field, []);
|
||||
}
|
||||
}
|
||||
|
||||
function enableValues(field, indexes) {
|
||||
var fieldId = field.replace('.', '_');
|
||||
$('#tr_'+fieldId+' td.values .value').each(function(index) {
|
||||
if ($.inArray(index, indexes) >= 0) {
|
||||
$(this).removeAttr('disabled');
|
||||
$(this).parents('span').first().show();
|
||||
} else {
|
||||
$(this).val('');
|
||||
$(this).attr('disabled', true);
|
||||
$(this).parents('span').first().hide();
|
||||
}
|
||||
|
||||
if ($(this).hasClass('group')) {
|
||||
$(this).addClass('open');
|
||||
} else {
|
||||
$(this).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function toggleOperator(field) {
|
||||
var fieldId = field.replace('.', '_');
|
||||
var operator = $("#operators_" + fieldId);
|
||||
switch (operator.val()) {
|
||||
case "!*":
|
||||
case "*":
|
||||
case "t":
|
||||
case "ld":
|
||||
case "w":
|
||||
case "lw":
|
||||
case "l2w":
|
||||
case "m":
|
||||
case "lm":
|
||||
case "y":
|
||||
case "o":
|
||||
case "c":
|
||||
enableValues(field, []);
|
||||
break;
|
||||
case "><":
|
||||
enableValues(field, [0,1]);
|
||||
break;
|
||||
case "<t+":
|
||||
case ">t+":
|
||||
case "><t+":
|
||||
case "t+":
|
||||
case ">t-":
|
||||
case "<t-":
|
||||
case "><t-":
|
||||
case "t-":
|
||||
enableValues(field, [2]);
|
||||
break;
|
||||
case "=p":
|
||||
case "=!p":
|
||||
case "!p":
|
||||
enableValues(field, [1]);
|
||||
break;
|
||||
default:
|
||||
enableValues(field, [0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function toggleMultiSelect(el) {
|
||||
if (el.attr('multiple')) {
|
||||
el.removeAttr('multiple');
|
||||
} else {
|
||||
el.attr('multiple', true);
|
||||
}
|
||||
}
|
||||
|
||||
function submit_query_form(id) {
|
||||
selectAllOptions("selected_columns");
|
||||
$('#'+id).submit();
|
||||
}
|
||||
|
||||
function showTab(name) {
|
||||
$('div#content .tab-content').hide();
|
||||
$('div.tabs a').removeClass('selected');
|
||||
$('#tab-content-' + name).show();
|
||||
$('#tab-' + name).addClass('selected');
|
||||
return false;
|
||||
}
|
||||
|
||||
function moveTabRight(el) {
|
||||
var lis = $(el).parents('div.tabs').first().find('ul').children();
|
||||
var tabsWidth = 0;
|
||||
var i = 0;
|
||||
lis.each(function(){
|
||||
if ($(this).is(':visible')) {
|
||||
tabsWidth += $(this).width() + 6;
|
||||
}
|
||||
});
|
||||
if (tabsWidth < $(el).parents('div.tabs').first().width() - 60) { return; }
|
||||
while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
|
||||
lis.eq(i).hide();
|
||||
}
|
||||
|
||||
function moveTabLeft(el) {
|
||||
var lis = $(el).parents('div.tabs').first().find('ul').children();
|
||||
var i = 0;
|
||||
while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
|
||||
if (i>0) {
|
||||
lis.eq(i-1).show();
|
||||
}
|
||||
}
|
||||
|
||||
function displayTabsButtons() {
|
||||
var lis;
|
||||
var tabsWidth = 0;
|
||||
var el;
|
||||
$('div.tabs').each(function() {
|
||||
el = $(this);
|
||||
lis = el.find('ul').children();
|
||||
lis.each(function(){
|
||||
if ($(this).is(':visible')) {
|
||||
tabsWidth += $(this).width() + 6;
|
||||
}
|
||||
});
|
||||
if ((tabsWidth < el.width() - 60) && (lis.first().is(':visible'))) {
|
||||
el.find('div.tabs-buttons').hide();
|
||||
} else {
|
||||
el.find('div.tabs-buttons').show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function setPredecessorFieldsVisibility() {
|
||||
var relationType = $('#relation_relation_type');
|
||||
if (relationType.val() == "precedes" || relationType.val() == "follows") {
|
||||
$('#predecessor_fields').show();
|
||||
} else {
|
||||
$('#predecessor_fields').hide();
|
||||
}
|
||||
}
|
||||
|
||||
function showModal(id, width) {
|
||||
var el = $('#'+id).first();
|
||||
if (el.length === 0 || el.is(':visible')) {return;}
|
||||
var title = el.find('h3.title').text();
|
||||
el.dialog({
|
||||
width: width,
|
||||
modal: true,
|
||||
resizable: false,
|
||||
dialogClass: 'modal',
|
||||
title: title
|
||||
});
|
||||
el.find("input[type=text], input[type=submit]").first().focus();
|
||||
}
|
||||
|
||||
function hideModal(el) {
|
||||
var modal;
|
||||
if (el) {
|
||||
modal = $(el).parents('.ui-dialog-content');
|
||||
} else {
|
||||
modal = $('#ajax-modal');
|
||||
}
|
||||
modal.dialog("close");
|
||||
}
|
||||
|
||||
function submitPreview(url, form, target) {
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'post',
|
||||
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
|
||||
data: $('#'+form).serialize(),
|
||||
success: function(data){
|
||||
$('#'+target).html(data);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function collapseScmEntry(id) {
|
||||
$('.'+id).each(function() {
|
||||
if ($(this).hasClass('open')) {
|
||||
collapseScmEntry($(this).attr('id'));
|
||||
}
|
||||
$(this).hide();
|
||||
});
|
||||
$('#'+id).removeClass('open');
|
||||
}
|
||||
|
||||
function expandScmEntry(id) {
|
||||
$('.'+id).each(function() {
|
||||
$(this).show();
|
||||
if ($(this).hasClass('loaded') && !$(this).hasClass('collapsed')) {
|
||||
expandScmEntry($(this).attr('id'));
|
||||
}
|
||||
});
|
||||
$('#'+id).addClass('open');
|
||||
}
|
||||
|
||||
function scmEntryClick(id, url) {
|
||||
el = $('#'+id);
|
||||
if (el.hasClass('open')) {
|
||||
collapseScmEntry(id);
|
||||
el.addClass('collapsed');
|
||||
return false;
|
||||
} else if (el.hasClass('loaded')) {
|
||||
expandScmEntry(id);
|
||||
el.removeClass('collapsed');
|
||||
return false;
|
||||
}
|
||||
if (el.hasClass('loading')) {
|
||||
return false;
|
||||
}
|
||||
el.addClass('loading');
|
||||
$.ajax({
|
||||
url: url,
|
||||
success: function(data){
|
||||
el.after(data);
|
||||
el.addClass('open').addClass('loaded').removeClass('loading');
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
function randomKey(size) {
|
||||
var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
|
||||
var key = '';
|
||||
for (i = 0; i < size; i++) {
|
||||
key += chars[Math.floor(Math.random() * chars.length)];
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
// Can't use Rails' remote select because we need the form data
|
||||
function updateIssueFrom(url) {
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'post',
|
||||
data: $('#issue-form').serialize()
|
||||
});
|
||||
}
|
||||
|
||||
function updateBulkEditFrom(url) {
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'post',
|
||||
data: $('#bulk_edit_form').serialize()
|
||||
});
|
||||
}
|
||||
|
||||
function clearMessage(id) {
|
||||
$('#'+id).val("");
|
||||
}
|
||||
|
||||
|
||||
function observeAutocompleteField(fieldId, url, options) {
|
||||
$(document).ready(function() {
|
||||
$('#'+fieldId).autocomplete($.extend({
|
||||
source: url,
|
||||
select: function(e,ui){self.location="/issues/"+ui.item.value;},
|
||||
minLength: 2,
|
||||
search: function(){$('#'+fieldId).addClass('ajax-loading');},
|
||||
response: function(){$('#'+fieldId).removeClass('ajax-loading');
|
||||
}
|
||||
}, options));
|
||||
$('#'+fieldId).addClass('autocomplete');
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function observeSearchfield(fieldId, targetId, url) {
|
||||
$('#'+fieldId).each(function() {
|
||||
var $this = $(this);
|
||||
$this.addClass('autocomplete');
|
||||
$this.attr('data-value-was', $this.val());
|
||||
var check = function() {
|
||||
var val = $this.val();
|
||||
if ($this.attr('data-value-was') != val){
|
||||
$this.attr('data-value-was', val);
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'get',
|
||||
data: {q: $this.val()},
|
||||
success: function(data){ if(targetId) $('#'+targetId).html(data); },
|
||||
beforeSend: function(){ $this.addClass('ajax-loading'); },
|
||||
complete: function(){ $this.removeClass('ajax-loading'); }
|
||||
});
|
||||
}
|
||||
};
|
||||
var reset = function() {
|
||||
if (timer) {
|
||||
clearInterval(timer);
|
||||
timer = setInterval(check, 300);
|
||||
}
|
||||
};
|
||||
var timer = setInterval(check, 300);
|
||||
$this.bind('keyup click mousemove', reset);
|
||||
});
|
||||
}
|
||||
|
||||
function observeProjectModules() {
|
||||
var f = function() {
|
||||
/* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
|
||||
if ($('#project_enabled_module_names_issue_tracking').attr('checked')) {
|
||||
$('#project_trackers').show();
|
||||
}else{
|
||||
$('#project_trackers').hide();
|
||||
}
|
||||
};
|
||||
|
||||
$(window).load(f);
|
||||
$('#project_enabled_module_names_issue_tracking').change(f);
|
||||
}
|
||||
|
||||
function initMyPageSortable(list, url) {
|
||||
$('#list-'+list).sortable({
|
||||
connectWith: '.block-receiver',
|
||||
tolerance: 'pointer',
|
||||
update: function(){
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'post',
|
||||
data: {'blocks': $.map($('#list-'+list).children(), function(el){return $(el).attr('id');})}
|
||||
});
|
||||
}
|
||||
});
|
||||
$("#list-top, #list-left, #list-right").disableSelection();
|
||||
}
|
||||
|
||||
var warnLeavingUnsavedMessage;
|
||||
function warnLeavingUnsaved(message) {
|
||||
warnLeavingUnsavedMessage = message;
|
||||
|
||||
$('form').submit(function(){
|
||||
$('textarea').removeData('changed');
|
||||
});
|
||||
$('textarea').change(function(){
|
||||
$(this).data('changed', 'changed');
|
||||
});
|
||||
window.onbeforeunload = function(){
|
||||
var warn = false;
|
||||
$('textarea').blur().each(function(){
|
||||
if ($(this).data('changed')) {
|
||||
warn = true;
|
||||
}
|
||||
});
|
||||
if (warn) {return warnLeavingUnsavedMessage;}
|
||||
};
|
||||
}
|
||||
|
||||
function setupAjaxIndicator() {
|
||||
|
||||
$('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) {
|
||||
|
||||
if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') {
|
||||
$('#ajax-indicator').show();
|
||||
}
|
||||
});
|
||||
|
||||
$('#ajax-indicator').bind('ajaxStop', function() {
|
||||
$('#ajax-indicator').hide();
|
||||
});
|
||||
}
|
||||
|
||||
function hideOnLoad() {
|
||||
$('.hol').hide();
|
||||
}
|
||||
|
||||
function addFormObserversForDoubleSubmit() {
|
||||
$('form[method=post]').each(function() {
|
||||
if (!$(this).hasClass('multiple-submit')) {
|
||||
$(this).submit(function(form_submission) {
|
||||
if ($(form_submission.target).attr('data-submitted')) {
|
||||
form_submission.preventDefault();
|
||||
} else {
|
||||
$(form_submission.target).attr('data-submitted', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function blockEventPropagation(event) {
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
function toggleAndSettingWordsVal(parent_widget, text_widget, value){
|
||||
text_widget.val(value)
|
||||
parent_widget.slideToggle(400)
|
||||
}
|
||||
function transpotUrl (scope) {
|
||||
$(scope).each(function(){
|
||||
var tmpContent = $(this).html();
|
||||
tmpContent = tmpContent.replace(/(^|[^\"\'])(http|ftp|mms|rstp|news|https)(\:\/\/[^<\s\+,,]+)/gi,"$1<a href='$2$3' target='_blank'>$2$3<\/a>");
|
||||
// tmpContent = tmpContent.replace(/(^|[^\/])(www\.[^<\s\+,,]+)/gi,"$1<a href='http:\/\/$2' style='color:blue' target='_blank'>$2</a>");
|
||||
$(this).html(tmpContent);
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(setupAjaxIndicator);
|
||||
$(document).ready(hideOnLoad);
|
||||
$(document).ready(addFormObserversForDoubleSubmit);
|
||||
$(document).ready(function(){
|
||||
$.ajaxSetup({
|
||||
headers: {
|
||||
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
|
||||
}
|
||||
});
|
||||
}
|
||||
)
|
||||
|
||||
function img_thumbnails() {
|
||||
$('.thumbnails a').colorbox({rel:'nofollow'});
|
||||
$('.attachments').find('a').each(function(index, element) {
|
||||
var href_value = $(element).attr('href');
|
||||
if (/\.(jpg|png|gif|bmp)$/.test(href_value)) {
|
||||
$(element).colorbox({rel:'nofollow'});
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
$(document).ready(img_thumbnails);
|
||||
|
||||
function TimeClose(dateText, inst) {
|
||||
if(inst.id=="issue_start_date"){
|
||||
time=dateText;
|
||||
}
|
||||
}
|
||||
var time=new Date();
|
||||
function TimeBeforeShow(input){
|
||||
if(input.id=="issue_due_date"){
|
||||
//var minDate = $(input).datepicker('option', 'minDate');
|
||||
var tempdata=$("#issue_start_date").attr("value");
|
||||
|
||||
$(input).datepicker('option', 'minDate',new Date(tempdata.replace(/-/g, "/")));
|
||||
//$('.selector').datepicker('option', 'minDate', '12/25/2012');
|
||||
}
|
||||
}
|
||||
|
||||
function SetMinValue(){
|
||||
/// var tempdata=$("#issue_start_date").attr("value");
|
||||
//$('.selector').datepicker('option', 'minDate', '12/25/2012');
|
||||
//alert(tempdata);
|
||||
//$("#issue_due_date").datepicker({
|
||||
// minDate: new Date(2014,08,23)
|
||||
//var datepickerOptions=
|
||||
//{dateFormat: 'yy-mm-dd',minDate: new Date(2014,08,23), showOn: 'button', buttonImageOnly: true, buttonImage: "path_to_image('/images/calendar.png')", showButtonPanel: true, showWeek: true, showOtherMonths: true, selectOtherMonths: true};
|
||||
//alert( $('.issue_due_date').length);
|
||||
//$('.selector')[1].datepicker('option', 'minDate', new Date(2014, 0 - 8, 23));
|
||||
//$("#issue_due_date").datepicker(datepickerOptions);
|
||||
//$("##{issue_due_date}").datepicker(datepickerOptions);
|
||||
//$("#issue_due_date").datepicker(
|
||||
// {dateFormat: 'yy-mm-dd',minDate: new Date(2014,08,23), showOn: 'button', buttonImageOnly: true, buttonImage: "path_to_image('/images/calendar.png')", showButtonPanel: true, showWeek: true, showOtherMonths: true, selectOtherMonths: true}
|
||||
//)
|
||||
//});
|
||||
}
|
||||
function PrecentChange(obj){
|
||||
var _v= obj;
|
||||
if(_v==100)
|
||||
{
|
||||
//var select=$("select[id='issue_status_id']");
|
||||
$("select[id='issue_status_id']").find("option[value='3']").attr("selected","selected");
|
||||
}
|
||||
else if(_v==0)
|
||||
{
|
||||
//alert(1);
|
||||
$("select[id='issue_status_id']").find("option[value='1']").attr("selected","selected");
|
||||
}
|
||||
else if(_v!=100&&_v!=0)
|
||||
{
|
||||
// alert(2);
|
||||
$("select[id='issue_status_id']").find("option[value='2']").attr("selected","selected");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
body{ font-size:12px; font-family:"微软雅黑","宋体"; line-height:1.9; background:#fff; font-style:normal;}
|
||||
div,html,img,ul,li,p,body,h1,h2,h3,h4,p,a,table,tr,td,fieldset,input,span,textarea,form{ margin:0; padding:0;}
|
||||
div,img,tr,td,textarea,form{ border:0;}
|
||||
table,tr,td{border:0; cellspacing:0; cellpadding:0;}
|
||||
ul,li{ list-style-type:none}
|
||||
.cl{ clear:both; overflow:hidden; }
|
||||
a{ text-decoration:none; }
|
||||
a:hover{ }
|
||||
/**** 常用***/
|
||||
.f_l{ float:left;}
|
||||
.f_r{ float:right;}
|
||||
.b_lblue{ background:#64bdd9;}
|
||||
.b_dblue{ background:#55a1b9; cursor:pointer;}
|
||||
.f_b{ font-weight: bold;}
|
||||
.c_blue{ color:#64bdd9;}
|
||||
.c_grey{ color:#999999;}
|
||||
.c_grey02{ color:#666666;}
|
||||
.f_14{ font-size:14px;}
|
||||
.c_dblue{ color:#3e6d8e;}
|
||||
.c_red{ color:#ec0016;}
|
||||
.w90{width:90px;}
|
||||
.ml10{margin-left:10px;}
|
||||
.st_search input.f_2 {
|
||||
width:60px !important;
|
||||
height:28px !important;
|
||||
color:#fff !important;
|
||||
margin-right:5px !important;
|
||||
border:none !important;
|
||||
margin-left:0px !important;
|
||||
box-shadow: none !important;
|
||||
padding: 0px !important;
|
||||
border-radius: 0 !important;
|
||||
text-shadow: none !important;
|
||||
border:1px solid #1c9ec7;
|
||||
background:#1c9ec7;
|
||||
|
||||
}
|
||||
.container{ width:940px; margin:0 auto; font-size:12px;}
|
||||
|
||||
.st_list{ width:688px; padding-left:5px; height:800px;}
|
||||
.st_search{ margin:10px 0;}
|
||||
.st_search span{ font-size:14px; font-weight:bold; color:#606060; margin-right:35px;}
|
||||
.st_search input{ border:1px solid #1c9ec7; background:#fff; height:20px; color:#c4c4c4; width:200px;}
|
||||
.st_search a:hover{ background:#048fbb; text-decoration:none;}
|
||||
/*.st_search input.f_2{ background:#1c9ec7; padding: 3px; margin-left: 3px; color:#fff;border:1px solid #1c9ec7; text-align:center; display:block; width:45px; height:28px; font-size:12px; }*/
|
||||
|
||||
.classbox{ border:1px solid #f8df8c; background:#fffce6; color:#0d90c3; padding:0 3px; float:left; margin-left:15px;}
|
||||
.st_addclass{ margin-top:5px;}
|
||||
.st_addclass ul li{ margin-bottom:10px;}
|
||||
.st_addclass ul li,.st_addclass a,.st_addclass img{ float:left;}
|
||||
.st_addclass img{ margin-top:3px;}
|
||||
.st_addclass a{ color:#0d90c3;}
|
||||
|
||||
.st_box{ margin-top:10px; border-top:1px solid #CCC; padding-top:10px;}
|
||||
.st_box ul li{ float:left;}
|
||||
.st_box_top a{ font-weight:bold; color:#7a7a7a; float:left;}
|
||||
.st_box_top a:hover{ color:#1c9ec7;}
|
||||
.st_up{ display: block; width:8px; float:left; height:13px; background:url(../images/pic_up.png) 0 0 no-repeat; margin-top:5px; margin-left:3px;}
|
||||
.st_down{ display: block; width:8px; float:left; height:13px; background:url(../images/pic_up.png) 0 -22px no-repeat; margin-top:5px; margin-left:3px;}
|
||||
a.st_img { display:block;width:40px; height:40px; border:1px solid #CCC; padding:1px;}
|
||||
a:hover.st_img { border:1px solid #1c9ec7; }
|
||||
.st_boxlist{ border-bottom:1px dashed #CCC; height:53px; padding-top:10px; }
|
||||
.st_boxlist a{ float:left;}
|
||||
.st_boxlist ul{ float:left; width:200px; margin-left:10px;}
|
||||
.st_boxlist ul li a{ color:#5d5d5d;}
|
||||
.st_boxlist ul li a span{ color:#1c9ec7;}
|
||||
.st_boxlist ul li a:hover span{ color:#ff8e15;}
|
||||
.ml50{ margin-left:50px;}
|
||||
.ml358{ margin-left:358px;}
|
||||
.ml258{ margin-left:254px;}
|
||||
.ml65{ margin-left:65px;}
|
||||
a:hover.st_add{ color:#ff8e15;}
|
||||
|
||||
/****翻页***/
|
||||
.wlist{ margin-top:15px; float:right;}
|
||||
.wlist a{ float:left; border:1px solid #15bccf; padding:0 5px; margin-left:3px; color:#15bccf;}
|
||||
.wlist a:hover{border:1px solid #15bccf; background-color:#15bccf; color:#fff;}
|
||||
.wlist_select a { background-color:#64bdd9; color:#fff;}
|
||||
|
||||
.submit{height:21px;border:0; cursor:pointer; background:url(../images/btn.png) no-repeat 0 0;width:42px; margin-top:2px; margin-left:3px; }
|
||||
.submit_2{height:21px;border:0; cursor:pointer; background:url(../images/btn1.png) no-repeat 0 0;width:42px; margin-top:2px; margin-left:3px; }
|
||||
.isTxt{background:#fbfbfb url(../images/inputBg.png) repeat-x left top;height:22px;line-height:22px;border:1px solid #c1c1c1;padding:0 5px;color:#666666;}
|
||||
.group_in {
|
||||
width:60px !important;
|
||||
height:28px !important;
|
||||
color:#fff !important;
|
||||
margin-right:5px !important;
|
||||
border:none !important;
|
||||
margin-left:0px !important;
|
||||
box-shadow: none !important;
|
||||
|
||||
border-radius: 0 !important;
|
||||
text-shadow: none !important;
|
||||
border:1px solid #1c9ec7;
|
||||
background:#1c9ec7;
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the '{}' from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
|
@ -0,0 +1,7 @@
|
|||
require 'test_helper'
|
||||
|
||||
class CourseGroupTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
Loading…
Reference in New Issue