From 89b9a5c09dbc269981b9ea5fc094d78cefd2d93a Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Sat, 15 Aug 2015 17:06:41 +0800 Subject: [PATCH 01/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 77 +++++++++++++++++- app/helpers/application_helper.rb | 3 +- app/helpers/users_helper.rb | 23 ++++++ app/models/user.rb | 9 ++- app/views/layouts/base_users_new.html.erb | 12 +++ config/routes.rb | 7 ++ db/schema.rb | 10 +++ public/stylesheets/public.css | 65 ++++++++++++++++ public/stylesheets/public_new.css | 95 +++++++++++++++++++++++ 9 files changed, 297 insertions(+), 4 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 39a467d53..0b3302fae 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -46,7 +46,7 @@ class UsersController < ApplicationController :user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, :watch_contests, :info, :watch_projects, :show_score, :topic_score_index, :project_score_index, :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, - :activity_new_score_index, :influence_new_score_index, :score_new_index,:user_projects_index, + :activity_new_score_index, :influence_new_score_index, :score_new_index,:user_projects_index,:user_resource, :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist] before_filter :auth_user_extension, only: :show #before_filter :rest_user_score, only: :show @@ -807,6 +807,27 @@ class UsersController < ApplicationController end end + # 上传用户资源 + def user_resource_create + @user = User.find(params[:id]) + #@user.save_attachments(params[:attachments],User.current) + # Container_type为Principal + Attachment.attach_filesex(@user, params[:attachments], params[:attachment_type]) + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + respond_to do |format| + format.js + end + end + + # 删除用户资源 + def user_resource_delete + Attachment.delete(params[:resource_id]) + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + respond_to do |format| + format.js + end + end + def destroy @user.destroy respond_to do |format| @@ -1008,6 +1029,55 @@ class UsersController < ApplicationController @user = User.find(params[:id]) end + # 资源库 分为全部 课程资源 项目资源 附件 + def user_resource + #确定container_type + # @user = User.find(params[:id]) + if(params[:type].nil? || params[:type] == "1") #全部 + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + end + elsif params[:type] == "2" #课程资源 + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course'").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Course' ").order("created_on desc") + end + elsif params[:type] == "3" #项目资源 + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc") + end + elsif params[:type] == "4" #附件 + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + end + end + @type = params[:type] + respond_to do |format| + format.js + format.html {render :layout => 'base_users_new'} + end + end + + # 根据资源关键字进行搜索 + def resource_search + search = params[:search].to_s.strip.downcase + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and (filename like '%#{search}%') ").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and is_public = 1 and (filename like '%#{search}%') ").order("created_on desc") + end + respond_to do |format| + format.js + end + end + private def find_user @@ -1021,7 +1091,7 @@ class UsersController < ApplicationController render_404 end - def setting_layout(default_base='base_users') + def setting_layout(default_base='base_users_new') User.current.admin? ? default_base : default_base end @@ -1071,4 +1141,7 @@ class UsersController < ApplicationController impl.save end end + + + end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6ac3c234a..cdcb6fc4d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1852,7 +1852,8 @@ module ApplicationHelper candown = true elsif attachment.container.class.to_s=="StudentWork" candown = true - + elsif attachment.container.class.to_s == "User" + candown = (attachment.is_public == 1 || attachment.is_public == true || attachment.author_id == User.current.id) elsif attachment.container_type == "Bid" && attachment.container && attachment.container.courses course = attachment.container.courses.first candown = User.current.member_of_course?(attachment.container.courses.first) || (course.is_public == 1 && attachment.is_public == 1) diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 49865d335..41458bc90 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -29,6 +29,29 @@ module UsersHelper ["#{l(:status_locked)} (#{user_count_by_status[3].to_i})", '3']], selected.to_s) end + def get_resource_type type + case type + when 'Course' + '课程资源' + when 'Project' + '项目资源' + when 'Issue' + '缺陷附件' + when 'Message' + '讨论区附件' + when 'Document' + '文档附件' + when 'News' + '通知附件' + when 'HomewCommon' + '作业附件' + when 'StudentWorkScore' + '批改附件' + when 'Principal' + '用户资源' + end + end + def user_mail_notification_options(user) user.valid_notification_options.collect {|o| [l(o.last), o.first]} end diff --git a/app/models/user.rb b/app/models/user.rb index 1cd0675c8..4fae33185 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -150,7 +150,8 @@ class User < Principal nil } - + acts_as_attachable :view_permission => :view_files, + :delete_permission => :manage_files acts_as_customizable ############################added by william acts_as_taggable @@ -239,6 +240,12 @@ class User < Principal self.user_extensions ||= UserExtensions.new end + # User现在可以作为一个Container_type,而Attachment的Container方法会有一个Container.try(:project), + # 所以这里定义一个空方法,保证不报错 + def project + + end + def user_score_attr self.user_score ||= UserScore.new end diff --git a/app/views/layouts/base_users_new.html.erb b/app/views/layouts/base_users_new.html.erb index 09d437da4..f9f065e2a 100644 --- a/app/views/layouts/base_users_new.html.erb +++ b/app/views/layouts/base_users_new.html.erb @@ -146,6 +146,12 @@ <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=@user.projects.count%>)</span> </a> </div> + <div class="subNav"> + <a href="<%=url_for(:controller => 'users', :action => 'user_resource',:id=>@user.id,:type=>1)%>" class=" f14 c_blue02"> + 我的资源库 + <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("author_id = #{@user.id} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").count%>)</span> + </a> + </div> <% else%> <div class="subNav"> @@ -160,6 +166,12 @@ <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=@user.projects.visible.count%>)</span> </a> </div> + <div class="subNav"> + <a href="<%=url_for(:controller => 'users', :action => 'user_resource',:id=>@user.id,:type=>1)%>" class=" f14 c_blue02"> + TA的资源库 + <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("author_id = #{@user.id} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").count%>)</span> + </a> + </div> <% end %> <div class="subNav "> <%= link_to "留言",feedback_path(@user),:class => "f14 c_blue02"%> diff --git a/config/routes.rb b/config/routes.rb index cdcb1126c..79ee367bb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -344,12 +344,18 @@ RedmineApp::Application.routes.draw do match 'file_score_index', :to => 'projects#file_score_index', :via => [:get, :post] match 'code_submit_score_index', :to => 'projects#code_submit_score_index', :via => [:get, :post] match 'projects_topic_score_index', :to => 'projects#projects_topic_score_index', :via => [:get, :post] + get "user_resource" + post "resource_search" + post "user_resource_create" + post "user_resource_delete" # end end end match 'users/:id/user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "feedback" match 'users/:id/user_projects', :to => 'users#user_projects', :via => :get + + #end match 'my/account', :via => [:get, :post] match 'my/account/destroy', :to => 'my#destroy', :via => [:get, :post] @@ -841,6 +847,7 @@ RedmineApp::Application.routes.draw do match 'system_log/clear' ##ended by lizanle + resources :git_callback do collection do post 'post_update' diff --git a/db/schema.rb b/db/schema.rb index 30ca29d12..d9511818e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -746,6 +746,16 @@ ActiveRecord::Schema.define(:version => 20150801034945) do add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" + create_table "journal_details_copy", :force => true do |t| + t.integer "journal_id", :default => 0, :null => false + t.string "property", :limit => 30, :default => "", :null => false + t.string "prop_key", :limit => 30, :default => "", :null => false + t.text "old_value" + t.text "value" + end + + add_index "journal_details_copy", ["journal_id"], :name => "journal_details_journal_id" + create_table "journal_replies", :id => false, :force => true do |t| t.integer "journal_id" t.integer "user_id" diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css index 82b3f17aa..4cc859721 100644 --- a/public/stylesheets/public.css +++ b/public/stylesheets/public.css @@ -467,3 +467,68 @@ img,embed{max-width: 100%;} /*.copyright{ width:390px; margin:0 auto;height:20px;line-height:20px;}*/ /*a.f_grey {color:#666666;}*/ /*a.f_grey:hover {color:#000000;}*/ + +/*资源库*/ +.resources {width:730px; background-color:#ffffff; padding:10px;} +.resourcesBanner {width:730px; height:40px; background-color:#eaeaea; margin-bottom:10px;} +.bannerName {background:#64bdd9; color:#ffffff; height:40px; line-height:40px; width:90px; text-align:center; font-weight:normal; vertical-align:middle; font-size: 16px; float:left;} +.resourcesSelect {width:40px; height:40px; float:right; position:relative;} +.resourcesSelected {width:25px; height:20px;} +.resourcesIcon {margin-top:15px; display:block; position:relative; background:url(../images/resource_icon_list.png) 0px 0px no-repeat; width:25px; height:20px;} +.resourcesIcon:hover { background:url(../images/resource_icon_list.png) 0px -25px no-repeat;} +.resourcesType {width:50px; background-color:#ffffff; float:left; list-style:none; position:absolute; border:1px solid #eaeaea; border-radius:5px; top:35px; padding:5px 10px; left:-30px; font-size:12px; color:#888888; display:none;} +a.resourcesGrey {font-size:12px; color:#888888;} +a.resourcesGrey:hover {font-size:12px; color:#15bccf;} +.resourcesBanner ul li:hover ul.resourcesType {display:block;} +ul li:hover ul {display:block;} +.resourcesUploadBox {float:right; width:103px; height:34px; background-color:#64bdd9; line-height:34px; vertical-align:middle; text-align:center; margin-left:12px;} +.uploadIcon {background:url(../images/resource_icon_list.png) -35px 10px no-repeat; float:left; display:block; width:30px; height:30px; margin-left:-3px;} +a.uploadText {color:#ffffff; font-size:14px;} +.resourcesSearchloadBox {border:1px solid #e6e6e6; width:225px; float:right; background-color:#ffffff;} +.searchResource {border:none; outline:none; background-color:#ffffff; width:184px; height:32px; padding-left:10px; display:block; float:left;} +.searchIcon{width:31px; height:32px; background-color:#ffffff; background:url(../images/resource_icon_list.png) -40px -15px no-repeat; display:block; float:left;} +.resourcesSearchBanner {height:34px; margin-bottom:10px;} +.resourcesListTab {width:730px; height:40px; background-color:#f6f6f6; border-bottom:1px solid #eaeaea; font-size:14px; color:#7a7a7a;} +.resourcesListName {width:175px; height:40px; line-height:40px; text-align:center;} +.resourcesListSize {width:110px; height:40px; line-height:40px; text-align:center;} +.resourcesListType {width:150px; height:40px; line-height:40px; text-align:center;} +.resourcesListUploader {width:130px; height:40px; line-height:40px; text-align:center;} +.resourcesListTime {width:165px; height:40px; line-height:40px; text-align:center;} +.resourcesList {width:730px; height:39px; background-color:#ffffff; border-bottom:1px dashed #eaeaea; color:#9a9a9a; font-size:12px;} +a.resourcesBlack {font-size:12px; color:#4c4c4c;} +a.resourcesBlack:hover {font-size:12px; color:#000000;} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 80px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 12px; + text-align: left; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.5; + color:#616060; + white-space: nowrap; +} +.dropdown-menu > li > a:hover{ + color: #ffffff; + text-decoration: none; + background-color: #64bdd9; + outline:none; +} diff --git a/public/stylesheets/public_new.css b/public/stylesheets/public_new.css index 7389dff8a..684213f20 100644 --- a/public/stylesheets/public_new.css +++ b/public/stylesheets/public_new.css @@ -444,4 +444,99 @@ div.ke-statusbar{height:1px; border-top:none;} /*.copyright{ width:390px; margin:0 auto;height:20px;line-height:20px;}*/ /*a.f_grey {color:#666666;}*/ /*a.f_grey:hover {color:#000000;}*/ +/*资源库*/ +.resources {width:730px; background-color:#ffffff; padding:10px;float: right} +.resourcesBanner {width:730px; height:40px; background-color:#eaeaea; margin-bottom:10px;} +.bannerName {background:#64bdd9; color:#ffffff; height:40px; line-height:40px; width:90px; text-align:center; font-weight:normal; vertical-align:middle; font-size: 16px; float:left;} +.resourcesSelect {width:40px; height:40px; float:right; position:relative;} +.resourcesSelected {width:25px; height:20px;} +.resourcesIcon {margin-top:15px; display:block; position:relative; background:url(images/resource_icon_list.png) 0px 0px no-repeat; width:25px; height:20px;} +.resourcesIcon:hover { background:url(images/resource_icon_list.png) 0px -25px no-repeat;} +.resourcesType {width:50px; background-color:#ffffff; float:left; list-style:none; position:absolute; border:1px solid #eaeaea; border-radius:5px; top:35px; padding:5px 10px; left:-30px; font-size:12px; color:#888888; display:none;} +a.resourcesGrey {font-size:12px; color:#888888;} +a.resourcesGrey:hover {font-size:12px; color:#15bccf;} +.resourcesBanner ul li:hover ul.resourcesType {display:block;} +ul li:hover ul {display:block;} +.resourcesUploadBox {float:right; width:103px; height:34px; background-color:#64bdd9; line-height:34px; vertical-align:middle; text-align:center; margin-left:12px;} +.uploadIcon {background:url(images/resource_icon_list.png) -35px 10px no-repeat; float:left; display:block; width:30px; height:30px; margin-left:-3px;} +a.uploadText {color:#ffffff; font-size:14px;} +.resourcesSearchloadBox {border:1px solid #e6e6e6; width:225px; float:right; background-color:#ffffff;} +.searchResource {border:none; outline:none; background-color:#ffffff; width:184px; height:32px; padding-left:10px; display:block; float:left;} +.searchIcon{width:31px; height:32px; background-color:#ffffff; background:url(images/resource_icon_list.png) -40px -15px no-repeat; display:block; float:left;} +.resourcesSearchBanner {height:34px; margin-bottom:10px;} +.resourcesListTab {width:730px; height:40px; background-color:#f6f6f6; border-bottom:1px solid #eaeaea; font-size:14px; color:#7a7a7a;} +.resourcesListName {width:175px; height:40px; line-height:40px; text-align:center;} +.resourcesListSize {width:110px; height:40px; line-height:40px; text-align:center;} +.resourcesListType {width:150px; height:40px; line-height:40px; text-align:center;} +.resourcesListUploader {width:130px; height:40px; line-height:40px; text-align:center;} +.resourcesListTime {width:165px; height:40px; line-height:40px; text-align:center;} +.resourcesList {width:730px; height:39px; background-color:#ffffff; border-bottom:1px dashed #eaeaea; color:#9a9a9a; font-size:12px;} +a.resourcesBlack {font-size:12px; color:#4c4c4c;white-space: nowrap;text-align: left} +a.resourcesBlack:hover {font-size:12px; color:#000000;} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 80px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 12px; + text-align: left; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.5; + color:#616060; + white-space: nowrap; +} +.dropdown-menu > li > a:hover{ + color: #ffffff; + text-decoration: none; + background-color: #64bdd9; + outline:none; +} + +/*上传资源弹窗*/ +.resourceUploadPopup {width:400px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-200px; z-index:1000;} +.uploadDialogText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:140px; display:inline-block;} +.uploadBoxContainer {height:33px; line-height:33px; margin-top:10px; position:relative} +.uploadBox {width:100px; height:33px; line-height:33px; text-align:center; vertical-align:middle; background-color:#64bdd9; border-radius:3px; float:left; margin-right:12px;} +a.uploadIcon {background:url(images/resource_icon_list.png) 8px -60px no-repeat; width:100px; height:33px;} +.chooseFile {color:#ffffff; display:block; margin-left:32px;} +.uploadResourceIntr {width:250px; height:33px; float:left; line-height:33px; font-size:12px;} +.uploadResourceName {width:250px; display:inline-block; line-height:15px; font-size:12px; color:#444444; margin-bottom:2px;} +.uploadResourceIntr2 {width:250px; display:inline-block; line-height:15px; font-size:12px; color:#444444;} +.uploadType {margin:10px 0; border:1px solid #e6e6e6; width:100px; height:30px; outline:none; font-size:12px; color:#888888;} +.uploadKeyword {margin-bottom:10px; outline:none; border:1px solid #e6e6e6; height:30px; width:280px;} + +/*发送资源弹窗*/ +/*.resourceShareContainer {width:100%; height:100%; background:#666; filter:alpha(opacity=50); opacity:0.5; -moz-opacity:0.5; position:absolute; left:0; top:0; z-index:-999;}*/ +.resourceSharePopup {width:300px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-150px; z-index:1000;} +.sendText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:140px; display:inline-block;} +.resourcePopupClose {width:20px; height:20px; display:inline-block; float:right;} +.resourceClose {background:url(images/resource_icon_list.png) 0px -40px no-repeat; width:20px; height:20px; display:inline-block;} +.resourcesSearchBox {border:1px solid #e6e6e6; width:225px; height:25px; background-color:#ffffff; margin-top:12px; margin-bottom:15px;} +.searchResourcePopup {border:none; outline:none; background-color:#ffffff; width:184px; height:25px; padding-left:10px; display:inline-block; float:left;} +.searchIconPopup{width:31px; height:25px; background-color:#ffffff; background:url(images/resource_icon_list.png) -40px -18px no-repeat; display:inline-block; float:left;} +.courseSend {width:260px; height:15px; line-height:15px; margin-bottom:10px;} +.courseSendCheckbox {padding:0px; margin:0px; width:12px; height:12px; margin-right:10px; display:inline-block; margin-top:2px;} +.sendCourseName {font-size:12px; color:#5f6060;} +.courseSendSubmit {width:50px; height:25px; line-height:25px; text-align:center; vertical-align:middle; background-color:#64bdd9; margin-right:25px; float:left;} +.courseSendCancel {width:50px; height:25px; line-height:25px; text-align:center; vertical-align:middle; background-color:#c1c1c1; float:left} +a.sendSourceText {font-size:14px; color:#ffffff;} +input.sendSourceText {font-size:14px;color:#ffffff;background-color:#64bdd9;} + From 421f86cdafc167e97861abdec162d50ae50f1bf1 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Sat, 15 Aug 2015 17:07:50 +0800 Subject: [PATCH 02/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_attachment_list.html.erb | 30 + .../users/_resource_upload_popup.html.erb | 43 + app/views/users/_resources_list.html.erb | 17 + app/views/users/_upload_resource.html.erb | 53 + app/views/users/resource_search.js.erb | 1 + app/views/users/user_resource.html.erb | 177 ++ app/views/users/user_resource.js.erb | 1 + app/views/users/user_resource_create.js.erb | 3 + app/views/users/user_resource_delete.js.erb | 1 + public/javascripts/bootstrap.js | 2363 +++++++++++++++++ public/javascripts/jquery-1.3.2.js | 19 + public/javascripts/sidebar.js | 64 + .../stylesheets/images/resourceSearch_03.png | Bin 0 -> 1405 bytes .../stylesheets/images/resourceSelect_03.png | Bin 0 -> 1087 bytes .../images/resourceSelected_03.png | Bin 0 -> 1057 bytes .../stylesheets/images/resourceUplaod_03.png | Bin 0 -> 1056 bytes .../stylesheets/images/resource_icon_list.png | Bin 0 -> 2476 bytes 17 files changed, 2772 insertions(+) create mode 100644 app/views/users/_attachment_list.html.erb create mode 100644 app/views/users/_resource_upload_popup.html.erb create mode 100644 app/views/users/_resources_list.html.erb create mode 100644 app/views/users/_upload_resource.html.erb create mode 100644 app/views/users/resource_search.js.erb create mode 100644 app/views/users/user_resource.html.erb create mode 100644 app/views/users/user_resource.js.erb create mode 100644 app/views/users/user_resource_create.js.erb create mode 100644 app/views/users/user_resource_delete.js.erb create mode 100644 public/javascripts/bootstrap.js create mode 100644 public/javascripts/jquery-1.3.2.js create mode 100644 public/javascripts/sidebar.js create mode 100644 public/stylesheets/images/resourceSearch_03.png create mode 100644 public/stylesheets/images/resourceSelect_03.png create mode 100644 public/stylesheets/images/resourceSelected_03.png create mode 100644 public/stylesheets/images/resourceUplaod_03.png create mode 100644 public/stylesheets/images/resource_icon_list.png diff --git a/app/views/users/_attachment_list.html.erb b/app/views/users/_attachment_list.html.erb new file mode 100644 index 000000000..33e944498 --- /dev/null +++ b/app/views/users/_attachment_list.html.erb @@ -0,0 +1,30 @@ + + +<!--<button name="button" class="sub_btn" onclick="_file.click()" onmouseover="this.focus()" style="<%#= ie8? ? 'display:none' : ''%>" type="button" ><%#= l(:label_browse) %></button>--> +<a href="javascript:void(0);" class="uploadIcon f14" name="button" onclick="_file.click()" onmouseover="" style="<%= ie8? ? 'display:none' : ''%>"> + <span class="chooseFile">选择文件</span></a> +<%= file_field_tag 'attachments[dummy][file]', + :id => '_file', + :class => ie8? ? '':'file_selector', + :multiple => true, + :onchange => 'addInputFiles(this);', + :style => ie8? ? '': 'display:none', + :data => { + :max_file_size => Setting.attachment_max_size.to_i.kilobytes, + :max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)), + :max_concurrent_uploads => Redmine::Configuration['max_concurrent_ajax_uploads'].to_i, + :upload_path => uploads_path(:format => 'js'), + :description_placeholder => l(:label_optional_description), + :field_is_public => l(:field_is_public), + :are_you_sure => l(:text_are_you_sure), + :file_count => l(:label_file_count), + :delete_all_files => l(:text_are_you_sure_all) + } %> +<!--<input type="submit" name="" value="上传文件" class="f_l ml10" style="width:80px; height:26px;">--> + +<!--<span id="upload_file_count">--> + <!--<%#= l(:label_no_file_uploaded)%>--> + <!--</span>--> +<!--(<%#= l(:label_max_size) %>:--> +<%#= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %> +<!--)--> diff --git a/app/views/users/_resource_upload_popup.html.erb b/app/views/users/_resource_upload_popup.html.erb new file mode 100644 index 000000000..27eebceec --- /dev/null +++ b/app/views/users/_resource_upload_popup.html.erb @@ -0,0 +1,43 @@ + +<script> +$(document).ready(function(){ + var popupHeight = $(".resourceUploadPopup").outerHeight(true); + $(".resourceUploadPopup").css("marginTop",-popupHeight/2); + + + $(".resourcePopupClose").click(function(){ + $(".resourceUploadPopup").css("display","none"); + }); + }); +</script> + + + +<div class="resourceUploadPopup"><span class="uploadText">上传资源 </span> + <div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose"></a></div> + <div class="uploadBoxContainer"> + <div class="uploadBox"><a href="javascript:void(0);" class="uploadIcon f14"><span class="chooseFile">选择文件</span></a></div> + <div class="uploadResourceIntr"> + <div class="uploadResourceName">(未选择文件)</div> + <div class="uploadResourceIntr2">您可以上传小于<span class="c_red">50MB</span>的文件</div> + </div> + </div> + <div> + <select class="uploadType"> + <option value="">资源类型</option> + <option value="课件资源">课件资源</option> + <option value=“"项目资源">项目资源</option> + <option value="附件">附件</option> + <option value="无">无</option> + </select> + </div> + <div> + <input type="text" name="" placeholder="关键词" class="uploadKeyword" /> + </div> + <div> + <div class="courseSendSubmit"><a href="javascript:void(0);" class="sendSourceText">确定</a></div> + <div class="courseSendCancel"><a href="javascript:void(0);" class="sendSourceText">取消</a></div> + </div> + <div class="cl"></div> +</div> + diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb new file mode 100644 index 000000000..078ee2c94 --- /dev/null +++ b/app/views/users/_resources_list.html.erb @@ -0,0 +1,17 @@ +<% if attachments.nil? || attachments.empty? %> +<% else %> + <% attachments.each do |attach| %> + <ul> + <li class="resourcesListName fl"> + <!--<a href="javascript:void(0);" class="resourcesBlack"><%#=truncate(attach.filename,:length=>18)%></a>--> + <%= link_to truncate(attach.filename,:length=>18), download_named_attachment_path(attach.id, attach.filename), + :title => attach.filename+"\n"+attach.description.to_s,:class=>'resourcesBlack'%> + </li> + <li class="resourcesListSize fl"><%= number_to_human_size(attach.filesize) %></li> + <li class="resourcesListType fl"><%= get_resource_type(attach.container_type)%></li> + <li class="resourcesListUploader fl"><%=User.find(attach.author_id).realname %></li> + <li class="resourcesListTime fl"><%= format_date(attach.created_on) %></li> + <li style="display: none"><%= attach.id %></li> + </ul> + <% end %> +<% end %> \ No newline at end of file diff --git a/app/views/users/_upload_resource.html.erb b/app/views/users/_upload_resource.html.erb new file mode 100644 index 000000000..50807b080 --- /dev/null +++ b/app/views/users/_upload_resource.html.erb @@ -0,0 +1,53 @@ +<div class="resourceUploadPopup"><span class="uploadDialogText">上传资源 </span> + <div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div> + <div class="uploadBoxContainer"> + <%= form_tag(user_resource_create_user_path, :multipart => true,:remote => !ie8?,:name=>"upload_form",:id=>'upload_form') do %> + <div> + <span id="attachments_fields" xmlns="http://www.w3.org/1999/html"> + <% if defined?(container) && container && container.saved_attachments %> + <script>alert('<% container%>')</script> + <% container.attachments.each_with_index do |attachment, i| %> + <span id="attachments_p<%= i %>" class="attachment"> + <%= text_field_tag("attachments[p#{i}][filename]", attachment.filename, :class => 'filename readonly', :readonly=>'readonly')%> + <%= text_field_tag("attachments[p#{i}][description]", attachment.description, :maxlength => 254, :placeholder => l(:label_optional_description), :class => 'description', :style=>"display: inline-block;") %> + <span class="ispublic-label"><%= l(:field_is_public)%>:</span> + <%= check_box_tag("attachments[p#{i}][is_public_checkbox]", attachment.is_public,attachment.is_public == 1 ? true : false,:class => 'remove-upload')%> + <%= if attachment.id.nil? + #待补充代码 + else + link_to(' '.html_safe, attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'remove-upload') + end + %> + <%#= render :partial => 'tags/tag', :locals => {:obj => attachment, :object_flag => "6"} %> + + <%= hidden_field_tag "attachments[p#{i}][token]", "#{attachment.token}" %> + </span> + <% end %> + <% end %> + </span> + </div> + <div class="uploadBox"> + + <input type="hidden" name="attachment_type" value="1"> + <%= render :partial => 'attachment_list' %> + <div class="cl"></div> + <!--<a href="javascript:void(0);" class=" fr grey_btn mr40" onclick="closeModal();"><%#= l(:button_cancel)%></a>--> + <!--<a id="submit_resource" href="javascript:void(0);" class="blue_btn fr" onclick="submit_resource();"><%#= l(:button_confirm)%></a>--> + + </div> + <div class="uploadResourceIntr"> + <div class="uploadResourceName"><span id="upload_file_count">(未选择文件)</span></div> + <div class="uploadResourceIntr2">您可以上传小于<span class="c_red">50MB</span>的文件</div> + </div> + </div> + <div class="cl"></div> + <div style="margin-top: 10px" > + <div class="courseSendSubmit"> + <!--<a href="javascript:void(0);" class="sendSourceText" onclick="">确定</a>--> + <%= submit_tag '确定',:onclick=>'submit_files();',:onfocus=>'this.blur()',:class=>'sendSourceText' %> + </div> + <div class="courseSendCancel"><a href="javascript:void(0);" class="sendSourceText" onclick="closeModal();">取消</a></div> + </div> + <% end %> + <div class="cl"></div> + </div> \ No newline at end of file diff --git a/app/views/users/resource_search.js.erb b/app/views/users/resource_search.js.erb new file mode 100644 index 000000000..69fc3dd43 --- /dev/null +++ b/app/views/users/resource_search.js.erb @@ -0,0 +1 @@ +$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); \ No newline at end of file diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb new file mode 100644 index 000000000..aff14c2a3 --- /dev/null +++ b/app/views/users/user_resource.html.erb @@ -0,0 +1,177 @@ + +<%= javascript_include_tag 'bootstrap'%> +<%= stylesheet_link_tag 'project' %> +<%= stylesheet_link_tag 'leftside' %> +<%= javascript_include_tag 'attachments'%> + +<script> + function remote_get_resources(user_id,type){ + + } + function remote_search(){ + $("#resource_search_form").submit(); + } + + function show_upload(){ + var screenWidth = $(window).width(); + var screenHeight = $(window).height(); //当前浏览器窗口的 宽高 + var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度 + var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改 + var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改 + var popupHeight = $(".resourceUploadPopup").outerHeight(true); + $(".resourceUploadPopup").css("marginTop",-popupHeight/2); + + $("#upload_box").css('left',objLeft).css('top',objTop); + $("#upload_box").html('<%= escape_javascript( render :partial => 'upload_resource' ,:locals => {:user=>@user})%>'); + $("#upload_box").css('display','block'); + } + + function closeModal() + { + //hideModal($("#popbox_upload")); + //$("#attachments_fields").html(''); + $("#upload_box").css("display","none"); + } + + function check_files(){ + return $("#attachments_fields").children().length == 0; + } + + function submit_files(){ + $("#upload_form").submit(); + } +</script> +<div class="resources"> + <div class="resourcesBanner"> + <div class="bannerName">资源</div> + <ul class="resourcesSelect"> + <li class="resourcesSelected"><a href="javascript:void(0);" class="resourcesIcon"></a> + <ul class="resourcesType"> + <li> + <!--<a href="javascript:void(0);" remote="true" onclick="remote_get_resources('',1)" class="resourcesGrey">全部</a>--> + <%= link_to '全部' ,user_resource_user_path(:id=>@user.id,:type=>1),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> + </li> + <li> + <!--<a href="javascript:void(0);" class="resourcesGrey">课程资源</a>--> + <%= link_to '课程资源' ,user_resource_user_path(:id=>@user.id,:type=>2),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> + </li> + <li> + <!--<a href="javascript:void(0);" class="resourcesGrey">项目资源</a>--> + <%= link_to '项目资源' ,user_resource_user_path(:id=>@user.id,:type=>3),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> + </li> + <li> + <!--<a href="javascript:void(0);" class="resourcesGrey">附件</a>--> + <%= link_to '附件' ,user_resource_user_path(:id=>@user.id,:type=>4),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> + </li> + </ul> + </li> + </ul> + </div> + <div class="resourcesSearchBanner"> + <div class="resourcesUploadBox"> + <div class="uploadIcon"></div> + <a href="javascript:void(0);" onclick="show_upload();" class="uploadText">上传资源</a></div> + <div> + <%= form_tag( url_for(:controller => 'users',:action => 'resource_search',:id=>@user.id), + :remote=>true ,:method => 'post',:class=>'resourcesSearchloadBox',:id=>'resource_search_form') do %> + <input type="text" name="search" placeholder="输入资源关键词进行" class="searchResource" /> + <%= submit_tag '',:class=>'searchIcon',:style=>'border-style:none' %> + <!--<a href="javascript:void(0);" onclick='this.parent.submit();return false;' class="searchIcon"></a>--> + <% end %> + </div> + </div> + <div class="resourcesListBanner"> + <ul class="resourcesListTab"> + <li class="resourcesListName fl">资源名称</li> + <li class="resourcesListSize fl">大小</li> + <li class="resourcesListType fl">类别</li> + <li class="resourcesListUploader fl">上传者</li> + <li class="resourcesListTime fl">上传时间</li> + </ul> + </div> + <div> + <ul id="resources_list" class="resourcesList"> + + <%= render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments} %> + </ul> + </div> +</div> +<div id="upload_box" style="display: none"> + <%= render :partial => 'upload_resource' ,:locals => {:user=>@user}%> +</div> +<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu" id="contextMenu"> + <li><a tabindex="-1" href="#">预览</a></li> + <li><a tabindex="-1" href="#">重命名</a></li> + <li><a tabindex="-1" href="#" onclick="show_send();">发送</a></li> + <li><a tabindex="-1" href="#" onclick="delete_file();">删除</a></li> +</ul> + +<script> + var pageX = 0; + var pageY = 0; + var line; + var last_line; +$(".resourcesList").mousedown(function(e) { + if (3 == e.which) { + document.oncontextmenu = function() {return false;} + pageX = e.clientX; + pageY = e.clientY; + $("#contextMenu").hide(); + $("#contextMenu").attr("style","display: block; position: fixed; top:" + + pageY + + "px; left:" + + pageX + + "px; width: 80px;"); + $("#contextMenu").show(); + //当前光标所在的对象 + var ele = document.elementFromPoint(pageX,pageY); + //转换为jquery对象 + line = $(ele).parent(); + //如果上一条存在被选中,那么将上一条的背景色改为白色 + if(last_line){ + last_line.children().css("background-color", 'white'); + last_line == null; + } + //如果当前的tag是li,那么还要li的父级元素 + if(line.get(0).tagName === 'LI'){ + line = line.parent(); + } + //将当前的元素的所有子元素的背景色改为蓝色 + line.children().css("background-color", '#00ffff'); + //将当前元素赋给 上一个对象 保存起来。 + last_line = line; + } +}); +$(".resourcesList").click(function(e) { + $("#contextMenu").hide(); + document.oncontextmenu = function() {return true;} + if(line == null){ + var ele = document.elementFromPoint(e.clientX, e.clientY); + line = $(ele).parent(); + if(line.get(0).tagName === 'LI'){ + line = line.parent(); + } + } + line.children().css("background-color", 'white'); + line = null; +}); + function show_send(){ + $("#contextMenu").hide(); + document.oncontextmenu = function() {return true;} + line.children().css("background-color",'white'); + line.children().last().html(); + } + + function delete_file(){ + $("#contextMenu").hide(); + document.oncontextmenu = function() {return true;} + line.children().css("background-color",'white'); + id = line.children().last().html(); + $.ajax({ + type:'post', + url:'<%= user_resource_delete_user_path(@user)%>'+'?resource_id='+id + }); + } + +</script> + diff --git a/app/views/users/user_resource.js.erb b/app/views/users/user_resource.js.erb new file mode 100644 index 000000000..69fc3dd43 --- /dev/null +++ b/app/views/users/user_resource.js.erb @@ -0,0 +1 @@ +$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); \ No newline at end of file diff --git a/app/views/users/user_resource_create.js.erb b/app/views/users/user_resource_create.js.erb new file mode 100644 index 000000000..7e7cd2919 --- /dev/null +++ b/app/views/users/user_resource_create.js.erb @@ -0,0 +1,3 @@ + +closeModal(); +$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); diff --git a/app/views/users/user_resource_delete.js.erb b/app/views/users/user_resource_delete.js.erb new file mode 100644 index 000000000..69fc3dd43 --- /dev/null +++ b/app/views/users/user_resource_delete.js.erb @@ -0,0 +1 @@ +$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); \ No newline at end of file diff --git a/public/javascripts/bootstrap.js b/public/javascripts/bootstrap.js new file mode 100644 index 000000000..5debfd7de --- /dev/null +++ b/public/javascripts/bootstrap.js @@ -0,0 +1,2363 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.5 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.5 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.5' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.5 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.5' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.5 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.5' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.5 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.5' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.5 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.5' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger('shown.bs.dropdown', relatedTarget) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.5 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.5' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.5 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.5' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.5 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.5' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.5 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.5' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.5 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.5' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.5 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.5' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/public/javascripts/jquery-1.3.2.js b/public/javascripts/jquery-1.3.2.js new file mode 100644 index 000000000..b1ae21d8b --- /dev/null +++ b/public/javascripts/jquery-1.3.2.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/public/javascripts/sidebar.js b/public/javascripts/sidebar.js new file mode 100644 index 000000000..4c18b6423 --- /dev/null +++ b/public/javascripts/sidebar.js @@ -0,0 +1,64 @@ +/* ================================================= +// +// jQuery Fixed Plugins 1.3.1 +// author : +// Url: +// Data : 2012-03-30 +// +// ���� : float --> ��������[left or right] +// minStatue --> ��С״̬��ֻ��show_btn +// skin --> Ƥ������ +// durationTime --> ���ʱ�� +//���� : + $("#scrollsidebar2").fix({ + float : 'right', //default.left or right + minStatue : true, //default.false or true + skin : 'green', //default.gray or yellow ��blue ��green ��orange ��white + durationTime : 1000 // + }); +// +// =================================================*/ + +;(function($){ + $.fn.fix = function(options){ + var defaults = { + float : 'left', + minStatue : false, + skin : 'blue', + durationTime : 1000 + } + var options = $.extend(defaults, options); + + this.each(function(){ + //��ȡ���� + var thisBox = $(this), + closeBtn = thisBox.find('.close_btn' ), + show_btn = thisBox.find('.show_btn' ), + sideContent = thisBox.find('.side_content'), + sideList = thisBox.find('.side_list') + ; + var defaultTop = thisBox.offset().top; //�����Ĭ��top + + thisBox.css(options.float, 0); + if(options.minStatue){ + $(".show_btn").css("float", options.float); + sideContent.css('width', 0); + show_btn.css('width', 25); + + } + + //close�¼� + closeBtn.bind("click",function(){ + sideContent.animate({width: '0px'},"fast"); + show_btn.stop(true, true).delay(300).animate({ width: '25px'},"fast"); + }); + //show�¼� + show_btn.click(function() { + $(this).animate({width: '0px'},"fast"); + sideContent.stop(true, true).delay(200).animate({ width: '154px'},"fast"); + }); + + }); //end this.each + + }; +})(jQuery); \ No newline at end of file diff --git a/public/stylesheets/images/resourceSearch_03.png b/public/stylesheets/images/resourceSearch_03.png new file mode 100644 index 0000000000000000000000000000000000000000..702ce0e29ba5a2a7ab15d6cf137c6aab9ab80b57 GIT binary patch literal 1405 zcmbVMeM}o=7(bXJ1ZdnQYh*}r9<xJd+q-_TyR|@j*K-}TVyS?OSvc;lv_kK?>#-IT zvw_>PgqdXnGC!ux#**R3aGAle#fVHB2N4!Cw~3j|3@ix>28}E_H{Sw9{~-Ir%Y8iW z^FF`d^SsZ;9V~Y}qsZ8h0YQ+$v5j(rZw`2})6>8^67Kpmp^)v>a)s!X!;Hj3R!*$t zVMl<e<J~;NHSN00n;~eG*YBy8tDR*8D+V-7!bTGb1OXa?%*Bx)!`AaMT+7$_1q(8J z@iPSWa~7n^=tP}ClK1(yHA{R&v&+La*Rwc>6c@qf2muHJyv)FnK!Xq>A{JzUmjH4? ztwrDk6S>}kECyBWEQd)^;$fpkuVzsUgH0w4W-yve*we5M#dKN}+$J?<AdDtLR|qd% z2=FFxUcyb$OTNI$g7{=PNNBa;a99)8YecC|i{Ut);Lz#Rz(O5r5@aT#7DD++28s`{ zl0PW>MFCDQGPPo(Y(YSzi$@3qoz7)qA+(ezkTPwA32HG7stp7Z=UT81$!`ANFjlk< zd76T}*3E~+Mu`RW@a8AMAa@UTlrRL*5YI|}P!y(t64}N8FUStcf`A<j=jR9mMv;Yu zm>t7t+-|_IEp{tyrEONDfij^ug(f*x!fvsG0@!iAo~DdIFxvDKZnc|e(r6_q(ncq- z4k08n0?Q};`hnjitnPtWf|Phh7A21;HY7Ws+$YLn$R`G2vcd!xRQUx?42PaflxOj@ z6fgOA^BgUS0eB(5gntG9xQ?`;C{B|GJ#7ck+YFeVM2$wP0Y&vRX+xH<-2cg$76hYB zG{=9MC8+`(m=Kp+A1s!KhZn%aNMJOIUg(~Hpp*|Cl+_a%`=HZVKt1>9{yG)SRaPpy zIkIhiZg+KoJtJ3{U!1ADapZW%p?%%nk2Vet)|&1qUp37gUA?(*a+8uek-dNZ{rRhb z3*i}y_lM>;d-3u9S$zEOk^Y^RP_v3}6|Q6ql|be_tI&sco9`dK&bd=6ORTMT6>Cy^ z302X(w9i$FqJb<Q^n5gvdgFRlUrE=DiyK_6ICCd>38~tCKK*WuGHdGR?gMGF(UDlm z$7%a>=J%TOj+$bjTd~KBQw8gW()ifMuWmTwue7zqP7$h<n5c=L9+{gyc6#0V{<lxg z&B$eaIR{>xh_~&CT_jY@ubJ=Vjk$-;LEl*0<8>XMyms<3wzbrtP&sEEJ;yfp7Jfbb z(Cu5<o(uhzT<36f-~Hj9;?&XTnvPP<os{Y5%@flq-=CdRGe^Ev>|J}9JsZ`d>8|s8 z*1h%EcR!vwe$bsZjKtwwb1T_pcMRcQevj;Yx2F9zw)K%b<6O&6JKBFa%l5XsGm$;{ zdX+l%(g5z;evSJ53wjFD?qc27f=`uobd`-iajv$<u=eI}FJB!U?Yr{VrU7Vbl5?5= RXmccfhz`4pI%BJ8{Rc*K_XPj| literal 0 HcmV?d00001 diff --git a/public/stylesheets/images/resourceSelect_03.png b/public/stylesheets/images/resourceSelect_03.png new file mode 100644 index 0000000000000000000000000000000000000000..f5995a980950a3c14fe5a966ae91b8be89f04c4f GIT binary patch literal 1087 zcmbVLO=#0l9FK~+O*ceA)Pu$hhJtNA+GK55H`2V+71lYs%F0k!n!Ih<mb@%^wb@Yo zIJgaV5vS<Mi+FJeg5tr$P9D6>i%k4LJc#IJI|$wezI5&MFm^B`c`q;j-|zSToa^g7 z+uU@liK3|HY&Xc0^$2<PH|!zrfV)~I%TcTqaX%Wy72SiBVxkhHv$j40^H4XZCf~pg zirO`76^gi+>yZs)NA=Jq8rUvDQ&dM+;OfRW#B>RcSWb#rd$q*SmYHG(#2lA%RXA#O zPkXR`y0>6Vj~hvo>FT6A0+|rl5bJbcPdL6Dq?jtNO!nb1%g|L5Jf31UoGRw}Xcc*o z7NfC<!SOsTNl`v7N)msD7C2sDIdV%8J}!%rEVR?Liy>;BIV|Tvrlv){Qp_mEuFSHP zN+nu}MUgkc^2uZ}<Pd}iv55Fn4%UN+<G0os0Q3#da<PRRI%L#KsEkt#@pK~u+s)-R zi5<U|D3UTZ&|Q{~a;$BKaaFB-oQHqi*wWfBOu3NFLm!nrgVbZVwGJk^+g>O%B;Ls9 zJc|@Xp8&`x+t9&TkYdQ6sA-vUf=|R$5yXXbETf4$37-c^P60p=l=ieH)j77pY6&%? zsqsWC14tz_QAsNxsl`P#)~=`-0o1Ws$H%&3z`CwQbZgl5ZLzZIK^-HnfY3y}1Nuf0 zM*b*rX|-RXPYqa(i7Ni-usj>l0_a(np_%cJO;__PTU+RhKuYogkkne-={O%#IZ;&N z92d)|X{LrX|0icGafS_><DX`!ACV3Wx0|g`J~oF3I%HxzG8!-TUbsib3T1&(2tIzk zqcl+`8?^Ngjf0iB)oU}4Ru8o-j~(9K@~-s##y(}~>%j9BJg*$T|G-;b$nQ+ft$ceu zw&UgR=EB|HgFm>*nc3Mh@2_8KdwXjke_-)vZm~ytW;tzZ^Mg-1f1S8^er^5J!z+y( XHB*`x`f~fR6OMFN>jh8KLpT2b3ME|< literal 0 HcmV?d00001 diff --git a/public/stylesheets/images/resourceSelected_03.png b/public/stylesheets/images/resourceSelected_03.png new file mode 100644 index 0000000000000000000000000000000000000000..9b18c5dfa7b83695c09ed510b227690498493b69 GIT binary patch literal 1057 zcmbVLJ8#oa6gCu9RcXb7Q0R2!GEhYPO6)dPLveg<8i}MKiD<?;_D$oo_BHlR<5prp zs89wrgpgQ}Ixr!jN-PXWFd!Cw01^_v00ss&%5@%vq3VET`@YWio%5Z0&R(T_V|sFC zl3|$X;xeq#F-5<riE;Xmg}YrkTqH(=)NqURtPnApgPRBxJ!>6Rk>zaP`Ggi3W~}Ab z8>CUXsoL1%ti*<ky?~+_W^pMFEPDeH&_wI5pJ#u(ea8aV$+N3+Nhk$6YP-ujA*$_^ z>-NruopacwYhW=}DS?NG1!8a0kJLEN_IXu0Pquj$^i9Y{o*e|$C{=)tLj+_llePs> z1d76mSy@rUt3VP&i5KXrq{XZ%E2=aPh7U`<g-%PYLUZVguJUY~kU-`6Ua!aXG8_)q zc`=vEB^;8JrWWaF+b33>_M_Pm14NM>x&d*q4-!VJiMu4v(ntpqyr5J%BKD(UqG-za z*a~=&6L`-{boH$xQbm8mIMzC<ZwH94q6l|Go8Cujb_AxmJK0fUNTX3#LYH2OwF$A^ z^^i}BFwfEx&T$=eL0rh_GR#VajA_Usl`q1apg|}}+I+!KMjXds1<f>}Vh9-%ilS)9 zxvZcSGy|H7VQ3k_7-5TkL@eJ%Bfl>7JHSHoM69ZZ$RaqbW4t-4fJz$^9JO%(^qK-L zue!d2d(m8SJp;86h3*z|%n*B^pI_BI#=i`eoG3v>AL=e-#f&b<vX&L79=*U0vCjYG zjHkiyNpbvBETb)2fywl!^y%WLd5}*#CZw&QzubyxTiq%`tsZ}Ap8p#CUK-o`_T=Ey z?CZ|6RC_9QczC!{JKO#~cA=AE-~2lLd2Ma~_9gq^%>Lt!cHf_Se(sUeX;vPBpAWPv g@1LIDh2`-Hfq600{P6Mm?nKhGMWYN~71r+k0Sc>0sQ>@~ literal 0 HcmV?d00001 diff --git a/public/stylesheets/images/resourceUplaod_03.png b/public/stylesheets/images/resourceUplaod_03.png new file mode 100644 index 0000000000000000000000000000000000000000..6f915a517afbe4a3d9407179c9560eb46578940c GIT binary patch literal 1056 zcmbVLO=#3W6pjjYsZ=}^L=Q5i9#p!UOg70jp=+C;ja_u>vR&*Rn<lf}&?Xa;shjpB z#fvvVLGWY`B8Vt>(;ixBFXG9oM-eI_t=@WcvfZs7N)LvRc{6$6_q};P52};b2l~(V zGYm6Oo-k{4J(Jp*KKgyOwsVOt=SZnRrf`$A?FccNi)Rri`}Q2FA=_QL^AU|Q%!#H~ zZ;(dirs`lnXQw{7#1AQ&VMfQ2(01k#0kde%3ySRS+Byq7x5!RQ6}}Q0sO3#8M`&t! zvhFO;JBrJWT?3<uN(p>KY>@a1L98Z4w!^DZJ3Z!D&~YL2MRq@^Mx_c293dd(@>z$6 z5Xf>4ijpkDVIc5O;CTAVStzQKtO^CteORg%xlOfZT3s!=E3z#@LY3p%?RKu6&*5l} zgNmZ09D<Og9@%&)Aa;@s;-MaciDD=6LgL{7q>T0~UL-}9M!J6mKde*^h=aJBD4H@Z zu|p2#c+U6Jdv&~HQbT{kIMh3?FNKJ!p%^bl4y{LXs0XIGJ6b4pq|vCiB99iuUNEt< z=%av?%_2+x<Xq2HMQ9p@0xUsjDJ2oYk&<R<maa*nDf5cS_c#v2>WW^HEG3_}ObNo0 zq)8(MMb`{V7DavpDm`pDh>0CIsHf{u-7Z!*5~~^!vI&mr7%%iXpxVL&$1NNJV@d{> zr@g?%?f6Psp8eaJDDv(i*NU(YI{8(-L-ZBF(0N|53^8w&X!N=W^9C<Tn#l8c%h1^_ z*8QKHaWoh%ZH|AMrFTR-Ff|WapKcC@2L*IuB03s-H^3=6R@Jhp)sru;s#-q-GV$m2 z=TEp5@NjUm@9PI;d%Sl1`_3jBKKA1A$sfOkPpg@gvp<<a?GgL_-TiMD*41D4UXEYg i+C9DZR8zLzZVb*a7c=pj)!W+}>CBc(ljduEX5|lxoK3C( literal 0 HcmV?d00001 diff --git a/public/stylesheets/images/resource_icon_list.png b/public/stylesheets/images/resource_icon_list.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5bc6f58c73e58545a57fc4e29463d4ef7a0e9b GIT binary patch literal 2476 zcmaJ@eLR!>8sFo!6rNP_QkqFh*=%gt3}Iv~WT|;gv)vfBd$zIBybtNcOG3~2WX@BL zULGu+h+~m@Bzoc$oxCM_ColUDAy4PrD|(*K`5fo|T=)I^UBA!w`d-)XdtHCr*$2J$ zX=@p2!C)|LvImI@t=`a^yGjH4HVkB9pv6$&<|jA=h6#jp9sqM@f}sGM%%+C}RDjNm zk7)ylFqkTW<?AQ#^E^OcfNUgPi9w3kTqqg_BRYw=bVd{)fQJI%ERF+WvY`n9XE7ZR zG_0q!C)X8-V0k3)fI|shzKnz@2A+v<a)c8_1c-nQ2<UJTJDS5Mh#U}Kc?r;7d5l89 zzd{624v23>`FS3MyMjCbjz!v7F|5&OI1YzI+hTDz^lmuD8jV3&Lx!_L+Y+!i0%i|< z=|Mo*c+4;YmE^vZ3-TNg5ds01fI<m{LZr|J3G%{GXgnUT<iKF8AcPe^o+F@(tT=qL zWd;(!XYg2D0Sn~7m5lUIFjnAzfGYiV1vd9PEr-7(6C@Z)MCYQ=NNeSlmVut0{~yX` ze@F8LRN#+#|0gluH=YZir~n^~<uRbfg_$W+aS5(GfGz-ez91OAtm454Pyq5HKrY<% z5DvbB#^NwRA%Evryr(CD%;5{@90oupIUpbgB#Xr)*y3^Su2`2nwrD)0x*Hbn=0>u^ zW2|l6&{zz9kLz+Q31q~w0ghlfmib4l-HNfwQDAeS%p`!viUXMLJdh3ldSwD@<yx>S z@-4+OSFQ!OVk`<O2BmE5pBlY<1Wk`}`+aO7=lkFT9BA5k&{!AJl0g_u15PG6`-=L; zE*wAMdw6qe=U7fyk$zx99(!Gso<X1v$y8r``vzyqK|NLtkPSRuGx8`PJ0KugVi={r z(bwom9lWs0m?;~t?n3(I*XPgX*`7LDgttjdE_v~`x4)#7^J(I@fzQ9+eP;jZx1a1M z!aJvh9lazF1d#=8=c&Gdfl)@r#-72!!FPSL`aULv80dOy<x$P!*Jno#&+67?bR;TZ z{Q95`&x=0G`qI8gC5!8Q;*+o6`Q-rSL{?eXh`cG)*Rt@$C}^?HH)~jvE4lM#>RgqJ zIcgIryJ8*OHKtML-Wtnx^NEmA=Ueeqm3;;S-2FaqbClK=_ugx4OnZ&x7|LUIX2y+` ziN5%BN4w4G(GS+wuHS6=$D>_=hp*7zm=W(nc4<|v!jg8_zT?B>q|=6CyrM;MRbe-0 zKW8P1J#?t+tzN0kdy~>rvujnI6eD#N8Qwec*bW0)22L63vU06v?5i6-&A)5NQaaN+ zC9<?V5&zN`t)I#TYHEhmNSb1`#f-hK<lYHpym6Aze3_+_W~l}${au!dj6U7!T6OD% zcPX`M{xvq>Wm3jv)d8KR10EroDcYiW1L7uGF@haFaJ--Lae?H>%{kI+UlUg&p-#2? zoy@!xc3Xd({KF^M{sDcte63@~E2918b-xFNeo2+a30mR|GWs5+P-b=5)7zT^_djqV z%R*?;S*D+oI#>Tpe&6kNX=Bngk4`ZW`R+ZN=0*#2`m5<;a{n3ahEjFA=`|?@kqg_1 zS{?0kx-8*`ifz{Fj`#BP48knbU@F`y7k?d;%R9xX=`YN2*5!HeqD@Jxpp}<U{<lbN zasKwU-LDeoG(`wvOHZt}zjxwl=}7#qKZvSb{=F-QAIRcxGAGk=r`pbDf@x0F>lW|Y zY>dA!dlaMgT~BTADO`wZ#r)XKLOVI7JOcL5SFiJjADQ(%7R_jiWsRk0Hp)%Y8ux~6 zSD+oirmGHf#rc)BgR?9Hg3-~D1Jgm|%QnUe0>b$0LTTTnEf03j?JMo296xtC+<7Fv z!~*<S7QR|$o5+a%aVCLr@6*euhXjwDg1Q8Ek%Sg|Hm}>R#6qg(q?#-Z7YlX`Xv$jQ z@mnAF9=mc{Ui|)Jn2LOFtE+0HM3z3;T@|Ep9<{!tvbG<KL7Oyo_jILd8~yYn_tu?h z+hi26s7L2+!GrYO`c102k7GJ7DXJB0!tB*9@hL$Hd8fQ0EpS!xl@V&;vu0XEY*Cyd zsj|vH)Oeu3-J_mD>AS2ow$>_UGV=JX)Ve9%!`r47QmY$I58QOnvUUxcANK6Vjk_>h zpCa(Xn2n7-6w^0`*G}Z5Po~Ih<65p#tbQ3U*eI>oLR6c?nTZcvJxh^FytZ27q^P06 z^sSO&qXw_*p8b1Sy2T&-@~EPn<H5lB8;6}aPjD03b8!sXs9W(pn-k;5YQ`VuxEy_0 zR6#3=+{q5fN{jAF<?pHXM@w6;XbrD38TOIv6G65?xo<HX?7hz!FUAJ-_HX}rcW--w zfvV~e6_<|McFz86d32Yc_hO$^vvIRQ{@;%}#AFJwi`L?@L5gU9=yBeZdrnx6r6MRB z_t0@TIHsbO$~$5|MADlq@R%~v97uYVtW#mqXj;XVM%OF)Z(6Zb?WN{>E%V<@55Gv9 zDu21kTR)*(fBr&uY_GrKV)dH0RsmYUXR^)YtIa>&y|JpXy}tOUu-s5y`?)fEp;7-G z$}2aMcIPucqo(XmNTpOg{DS=R(6eEd&mv`L;?a$u7zZ7TlSF~Zg&FaLx5)k6@HkRs zLcOl`S51^+UhLgHRBv&+b<>sSPm0>`m4#k?QHos)0UA&E;`<3R9f|zzzsSqN!}2DF z3dj6eGiBqkLnRSohCMEQ#%~5|ZC+1~=3wM4gl1hzr@P@G?Y=blxsgKX5qrC}r=-04 z<h6rqGxba$P2H5@F6+CJ3rYXgmcZZKrN&71{g<n@Oqfy8q;3Gqc$=VRCaGMn{C^_5 Ld6BAIj-~wv_3j;A literal 0 HcmV?d00001 From 25460cd255660f5e8d1cdd7345840bec19690d60 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Tue, 18 Aug 2015 09:31:03 +0800 Subject: [PATCH 03/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 54 +++++++++++++++++++ .../users/_resource_share_popup.html.erb | 39 ++++++++++++++ .../users/add_exist_file_to_course.js.erb | 1 + app/views/users/resource_preview.js.erb | 3 ++ app/views/users/search_user_course.js.erb | 11 ++++ app/views/users/user_resource.html.erb | 49 ++++++++++++++--- config/routes.rb | 3 ++ 7 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 app/views/users/_resource_share_popup.html.erb create mode 100644 app/views/users/add_exist_file_to_course.js.erb create mode 100644 app/views/users/resource_preview.js.erb create mode 100644 app/views/users/search_user_course.js.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 0b3302fae..6a56b1b71 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -828,6 +828,60 @@ class UsersController < ApplicationController end end + #根据id或者名称搜索教师或者助教为当前用户的课程 + def search_user_course + @user = User.current + if !params[:search].nil? + @course = @user.courses.where(" #{Course.table_name}.id = #{params[:search].to_i } or #{Course.table_name}.name like '%#{params[:search.to_s]}%'") + .select { |course| @user.allowed_to?(:as_teacher,course)} + else + @course = @user.courses + .select { |course| @user.allowed_to?(:as_teacher,course)} + end + @send_id = params[:send_id] + respond_to do |format| + format.js + end + end + + # 将资源发送到对应的课程 + def add_exist_file_to_course + send_id = params[:send_id] + course_ids = params[:course_ids] + unless course_ids.nil? + course_ids.each do |id| + ori = Attachment.find_by_id(send_id) + next if ori.blank? + attach_copied_obj = ori.copy + attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 + attach_copied_obj.container = Course.find(id) + attach_copied_obj.created_on = Time.now + attach_copied_obj.author_id = User.current.id + if attach_copied_obj.attachtype == nil + attach_copied_obj.attachtype = 4 + end + attach_copied_obj.save + @save_message = attach_copied_obj.errors.full_messages + end + end + respond_to do |format| + format.js + end + end + + # 资源预览 + def resource_preview + preview_id = params[:resource_id] + @file = Attachment.find(preview_id) + @preview_able = false; + if %w(pdf pptx doc docx xls xlsx).any?{|x| @file.filename.downcase.end_with?(x)} + @preview_able = true; + end + respond_to do |format| + format.js + end + end + def destroy @user.destroy respond_to do |format| diff --git a/app/views/users/_resource_share_popup.html.erb b/app/views/users/_resource_share_popup.html.erb new file mode 100644 index 000000000..01ac79075 --- /dev/null +++ b/app/views/users/_resource_share_popup.html.erb @@ -0,0 +1,39 @@ + + +<div class="resourceSharePopup"> <span class="sendText">将资源移动至 </span> + <div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div> + <div> + <%= form_tag search_user_course_user_path(user),:method => 'get', + :remote=>true,:id=>'search_user_course_form',:class=>'resourcesSearchBox' do %> + <%= hidden_field_tag(:send_id, @send_id) %> + <input type="text" name="search" placeholder="输入课程ID或者名称搜索" class="searchResourcePopup" /> + <!--<a href="javascript:void(0);" class="searchIconPopup"></a>--> + <%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %> + <% end %> + </div> + <%= form_tag add_exist_file_to_course_user_path(user),:remote=>true,:id=>'course_list_form' %> + <div> + + <%= hidden_field_tag(:send_id, @send_id) %> + <% if !courses.empty? %> + <% courses.each do |course| %> + <ul class="courseSend"> + <li class="fl"> + <input name="course_ids[]" type="checkbox" value="<%= course.id %>" class="courseSendCheckbox"/> + </li> + <li class="sendCourseName fl"><%= course.name%></li> + </ul> + <% end %> + + </div> + <div> + <div class="courseSendSubmit"> + <!--<a href="javascript:void(0);" class="sendSourceText">确定</a>--> + <%= submit_tag '确定',:class=>'sendSourceText',:onfocus=>'this.blur();' %> + </div> + <div class="courseSendCancel"><a href="javascript:void(0);" class="sendSourceText" onclick="closeModal();">取消</a></div> + </div> + <div class="cl"></div> + <% end %> +</div> + diff --git a/app/views/users/add_exist_file_to_course.js.erb b/app/views/users/add_exist_file_to_course.js.erb new file mode 100644 index 000000000..903212798 --- /dev/null +++ b/app/views/users/add_exist_file_to_course.js.erb @@ -0,0 +1 @@ +closeModal(); \ No newline at end of file diff --git a/app/views/users/resource_preview.js.erb b/app/views/users/resource_preview.js.erb new file mode 100644 index 000000000..a38d46374 --- /dev/null +++ b/app/views/users/resource_preview.js.erb @@ -0,0 +1,3 @@ +<% if @preview_able %> +top.location.href = '<%=download_named_attachment_path(@file.id, @file.filename, preview: true) %>' +<% end %> \ No newline at end of file diff --git a/app/views/users/search_user_course.js.erb b/app/views/users/search_user_course.js.erb new file mode 100644 index 000000000..e3d4bb2d4 --- /dev/null +++ b/app/views/users/search_user_course.js.erb @@ -0,0 +1,11 @@ +var screenWidth = $(window).width(); +var screenHeight = $(window).height(); //当前浏览器窗口的 宽高 +var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度 +var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改 +var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改 +var popupHeight = $(".resourceSharePopup").outerHeight(true); +$(".resourceSharePopup").css("marginTop",-popupHeight/2); + +$("#upload_box").css('left',objLeft).css('top',objTop); +$("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_popup" ,:locals => {:courses=>@course,:user=>@user})%>'); +$("#upload_box").css('display','block'); \ No newline at end of file diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index aff14c2a3..19ff146ea 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -100,10 +100,10 @@ <%= render :partial => 'upload_resource' ,:locals => {:user=>@user}%> </div> <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu" id="contextMenu"> - <li><a tabindex="-1" href="#">预览</a></li> - <li><a tabindex="-1" href="#">重命名</a></li> - <li><a tabindex="-1" href="#" onclick="show_send();">发送</a></li> - <li><a tabindex="-1" href="#" onclick="delete_file();">删除</a></li> + <li><a tabindex="-1" href="#" onclick="preview();" onfocus="this.blur()">预览</a></li> + <li><a tabindex="-1" href="#" onclick="rename();" onfocus="this.blur()">重命名</a></li> + <li><a tabindex="-1" href="#" onclick="show_send();" onfocus="this.blur()" >发送</a></li> + <li><a tabindex="-1" href="#" onclick="delete_file();" onfocus="this.blur()">删除</a></li> </ul> <script> @@ -111,6 +111,8 @@ var pageY = 0; var line; var last_line; + var res_name; + var res_link; $(".resourcesList").mousedown(function(e) { if (3 == e.which) { document.oncontextmenu = function() {return false;} @@ -129,7 +131,9 @@ $(".resourcesList").mousedown(function(e) { line = $(ele).parent(); //如果上一条存在被选中,那么将上一条的背景色改为白色 if(last_line){ + last_line.children().css("background-color", 'white'); + restore(); last_line == null; } //如果当前的tag是li,那么还要li的父级元素 @@ -151,15 +155,48 @@ $(".resourcesList").click(function(e) { if(line.get(0).tagName === 'LI'){ line = line.parent(); } + }else{ + restore(); } line.children().css("background-color", 'white'); - line = null; + }); function show_send(){ $("#contextMenu").hide(); document.oncontextmenu = function() {return true;} line.children().css("background-color",'white'); - line.children().last().html(); + id = line.children().last().html(); + $.ajax({ + type:'get', + url:'<%= search_user_course_user_path(@user)%>'+'?send_id='+id + }); + } + + function preview(){ + $("#contextMenu").hide(); + document.oncontextmenu = function() {return true;} + line.children().css("background-color",'white'); + id = line.children().last().html(); + $.ajax({ + type:'get', + url:'<%= resource_preview_user_path(@user)%>'+"?resource_id="+id + }); + } + + function rename(){ + $("#contextMenu").hide(); + document.oncontextmenu = function() {return true;} + line.children().css("background-color",'white'); + id = line.children().last().html(); + res_name = line.children().first().children().html(); + res_link = line.children().first().html(); + line.children().first().html('<form id="res_name_form"><input name="res_name" id="res_name" class="" onblur="restore();" value="'+res_name+'"/> </form>'); + $("#res_name").focus(); + } + function restore(){ + if( line != null && res_link != null && res_link != '') { + line.children().first().html(res_link); + } } function delete_file(){ diff --git a/config/routes.rb b/config/routes.rb index 79ee367bb..43d27ce4f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -348,6 +348,9 @@ RedmineApp::Application.routes.draw do post "resource_search" post "user_resource_create" post "user_resource_delete" + get "search_user_course" + post "add_exist_file_to_course" + get 'resource_preview' # end end end From 76be15f79b5fa487cdc839d6e9119578913e521a Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Tue, 18 Aug 2015 11:53:54 +0800 Subject: [PATCH 04/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 17 +++++ app/views/users/user_resource.html.erb | 97 +++++++++++++++++++++----- config/routes.rb | 1 + 3 files changed, 96 insertions(+), 19 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6a56b1b71..0df07acff 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -882,6 +882,23 @@ class UsersController < ApplicationController end end + # 重命名资源 + def rename_resource + @attachment = Attachment.find(params[:res_id]) + if @attachment != nil + @attachment.filename = params[:res_name] + @flag = @attachment.save + end + # respond_to do |format| + # format.js + # end + if @flag + render :text=>'sucess' + else + render :text=>'fail' + end + end + def destroy @user.destroy respond_to do |format| diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 19ff146ea..d9b992129 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -109,11 +109,17 @@ <script> var pageX = 0; var pageY = 0; + //当前选中的行 var line; + //已经选中的行,和当前选中的行的区别是:右键选中为line,换一行右键后,line变为last_line,line变为换行后的line var last_line; + //资源名称 var res_name; + //资源名称的链接 var res_link; -$(".resourcesList").mousedown(function(e) { + var id; //资源id +$(".resourcesList").mousedown(function(e) { + //如果是右键的话 if (3 == e.which) { document.oncontextmenu = function() {return false;} pageX = e.clientX; @@ -130,8 +136,7 @@ $(".resourcesList").mousedown(function(e) { //转换为jquery对象 line = $(ele).parent(); //如果上一条存在被选中,那么将上一条的背景色改为白色 - if(last_line){ - + if(last_line != null){ last_line.children().css("background-color", 'white'); restore(); last_line == null; @@ -147,19 +152,27 @@ $(".resourcesList").mousedown(function(e) { } }); $(".resourcesList").click(function(e) { + //在列表上的任何单击事件都要恢复原来的样子 + //隐藏右键菜单 $("#contextMenu").hide(); document.oncontextmenu = function() {return true;} - if(line == null){ - var ele = document.elementFromPoint(e.clientX, e.clientY); + //如果当前行为空,那么要将当前行的拿到 + var ele; + if(line == null){ + ele = document.elementFromPoint(e.clientX, e.clientY); line = $(ele).parent(); + //如果是在li上点击事件,那么要获得父组件 if(line.get(0).tagName === 'LI'){ line = line.parent(); } - }else{ - restore(); } + //将当前行改变为白色 line.children().css("background-color", 'white'); - + //当前行恢复编辑状态 + if(ele.nodeName != 'INPUT') { + restore(); + } + line = null; }); function show_send(){ $("#contextMenu").hide(); @@ -188,26 +201,72 @@ $(".resourcesList").click(function(e) { document.oncontextmenu = function() {return true;} line.children().css("background-color",'white'); id = line.children().last().html(); - res_name = line.children().first().children().html(); + res_name = line.children().first().children().attr('title'); res_link = line.children().first().html(); - line.children().first().html('<form id="res_name_form"><input name="res_name" id="res_name" class="" onblur="restore();" value="'+res_name+'"/> </form>'); + line.children().first().html('<%= form_tag(url_for(:controller => 'users',:action => 'rename_resource',:method => 'post',:remote=>true,:id=>@user.id),:id=>"res_name_form" ) do%>' + + '<input name="res_name" id="res_name" ' + + 'style="height: 2em;line-height: 2em;overflow: hidden;" onblur="restore();" ' + + 'value="'+res_name+ + '"/> <input type="hidden" name="res_id" value="'+id+'"/>'+ + '<% end %>'); $("#res_name").focus(); } + String.prototype.trim = function() { + var str = this, + str = str.replace(/^\s\s*/, ''), + ws = /\s/, + i = str.length; + while (ws.test(str.charAt(--i))); + return str.slice(0, i + 1); + } function restore(){ - if( line != null && res_link != null && res_link != '') { - line.children().first().html(res_link); + if( last_line != null && res_link != null && res_link != '') { + name = $("#res_name").val().trim(); + if(name != res_name.trim()){ + + if(confirm('确定修改为 '+name)){ + //$("#res_name_form").submit(); +// $.ajax({ +// type:'post', +// url:'<%#=rename_resource_user_path(@user) %>', +// data: $("#res_name_form").serialize() +// }); + $.post( + '<%=rename_resource_user_path(@user) %>', + $("#res_name_form").serialize(), + function (data){ + if(data =='sucess'){ + last_line.children().first().html(res_link); + last_line.children().first().children().attr('title',name); + last_line.children().first().children().html(name); + }else{ + last_line.children().first().html(res_link); + } + }, + 'text' + ); + }else{ + //last_line.children().first().html(res_link); + } + }else { + last_line.children().first().html(res_link); + } } } - function delete_file(){ + function delete_file() { $("#contextMenu").hide(); - document.oncontextmenu = function() {return true;} - line.children().css("background-color",'white'); + document.oncontextmenu = function () { + return true; + } + line.children().css("background-color", 'white'); id = line.children().last().html(); - $.ajax({ - type:'post', - url:'<%= user_resource_delete_user_path(@user)%>'+'?resource_id='+id - }); + if (confirm('确定要删除资源' + line.children().first().children().attr('title').trim() + '么')){ + $.ajax({ + type: 'post', + url: '<%= user_resource_delete_user_path(@user)%>' + '?resource_id=' + id + }); + } } </script> diff --git a/config/routes.rb b/config/routes.rb index 43d27ce4f..c77a1e892 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -351,6 +351,7 @@ RedmineApp::Application.routes.draw do get "search_user_course" post "add_exist_file_to_course" get 'resource_preview' + post 'rename_resource' # end end end From 7219586b1e1cfb34b258052f6ab7ecaf3bfda01e Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Tue, 18 Aug 2015 15:25:36 +0800 Subject: [PATCH 05/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 37 ++++++++++++++--- .../users/_resource_search_form.html.erb | 7 ++++ app/views/users/_resources_list.html.erb | 2 +- app/views/users/rename_resource.js.erb | 1 + app/views/users/resource_preview.js.erb | 2 + app/views/users/user_resource.html.erb | 41 ++++++++++--------- app/views/users/user_resource.js.erb | 1 + 7 files changed, 65 insertions(+), 26 deletions(-) create mode 100644 app/views/users/_resource_search_form.html.erb create mode 100644 app/views/users/rename_resource.js.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 0df07acff..6bbfbd12b 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -40,7 +40,8 @@ class UsersController < ApplicationController :user_watchlist, :user_fanslist,:update, :user_courses, :user_homeworks, :watch_projects, :show_score, :topic_score_index, :project_score_index, :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, :activity_new_score_index, :influence_new_score_index, :score_new_index,:update_score,:user_activities,:user_projects_index, - :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist] + :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist, + :user_resource,:user_resource_create,:user_resource_delete,:rename_resource,:search_user_course,:add_exist_file_to_course,:resource_preview,:resource_search] #edit has been deleted by huang, 2013-9-23 before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses, :user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, @@ -1139,11 +1140,37 @@ class UsersController < ApplicationController # 根据资源关键字进行搜索 def resource_search search = params[:search].to_s.strip.downcase - if User.current.id == params[:id] - @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and (filename like '%#{search}%') ").order("created_on desc") - else - @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and is_public = 1 and (filename like '%#{search}%') ").order("created_on desc") + # if User.current.id == params[:id] + # @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and (filename like '%#{search}%') ").order("created_on desc") + # else + # @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and is_public = 1 and (filename like '%#{search}%') ").order("created_on desc") + # end + if(params[:type].nil? || params[:type] == "1") #全部 + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%') ").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%') ").order("created_on desc") + end + elsif params[:type] == "2" #课程资源 + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course' and (filename like '%#{search}%')").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Course' and (filename like '%#{search}%') ").order("created_on desc") + end + elsif params[:type] == "3" #项目资源 + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project' and (filename like '%#{search}%')").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' and (filename like '%#{search}%') ").order("created_on desc") + end + elsif params[:type] == "4" #附件 + if User.current.id == params[:id] + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%')").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%')").order("created_on desc") + end end + @type = params[:type] respond_to do |format| format.js end diff --git a/app/views/users/_resource_search_form.html.erb b/app/views/users/_resource_search_form.html.erb new file mode 100644 index 000000000..0c48514b3 --- /dev/null +++ b/app/views/users/_resource_search_form.html.erb @@ -0,0 +1,7 @@ +<%= form_tag( url_for(:controller => 'users',:action => 'resource_search',:id=>user.id), + :remote=>true ,:method => 'post',:class=>'resourcesSearchloadBox',:id=>'resource_search_form') do %> + <input type="text" name="search" placeholder="输入资源关键词进行" class="searchResource" /> + <%= hidden_field_tag(:type,type) %> + <%= submit_tag '',:class=>'searchIcon',:style=>'border-style:none' %> + <!--<a href="javascript:void(0);" onclick='this.parent.submit();return false;' class="searchIcon"></a>--> +<% end %> \ No newline at end of file diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index 078ee2c94..6f9ba0fee 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -5,7 +5,7 @@ <li class="resourcesListName fl"> <!--<a href="javascript:void(0);" class="resourcesBlack"><%#=truncate(attach.filename,:length=>18)%></a>--> <%= link_to truncate(attach.filename,:length=>18), download_named_attachment_path(attach.id, attach.filename), - :title => attach.filename+"\n"+attach.description.to_s,:class=>'resourcesBlack'%> + :title => attach.filename,:class=>'resourcesBlack'%> </li> <li class="resourcesListSize fl"><%= number_to_human_size(attach.filesize) %></li> <li class="resourcesListType fl"><%= get_resource_type(attach.container_type)%></li> diff --git a/app/views/users/rename_resource.js.erb b/app/views/users/rename_resource.js.erb new file mode 100644 index 000000000..5556fb313 --- /dev/null +++ b/app/views/users/rename_resource.js.erb @@ -0,0 +1 @@ +alert(1) \ No newline at end of file diff --git a/app/views/users/resource_preview.js.erb b/app/views/users/resource_preview.js.erb index a38d46374..c3e1fb3ab 100644 --- a/app/views/users/resource_preview.js.erb +++ b/app/views/users/resource_preview.js.erb @@ -1,3 +1,5 @@ <% if @preview_able %> top.location.href = '<%=download_named_attachment_path(@file.id, @file.filename, preview: true) %>' +<% else %> +window.alert('该资源不可预览') <% end %> \ No newline at end of file diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index d9b992129..1c54fc67e 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -71,13 +71,9 @@ <div class="resourcesUploadBox"> <div class="uploadIcon"></div> <a href="javascript:void(0);" onclick="show_upload();" class="uploadText">上传资源</a></div> - <div> - <%= form_tag( url_for(:controller => 'users',:action => 'resource_search',:id=>@user.id), - :remote=>true ,:method => 'post',:class=>'resourcesSearchloadBox',:id=>'resource_search_form') do %> - <input type="text" name="search" placeholder="输入资源关键词进行" class="searchResource" /> - <%= submit_tag '',:class=>'searchIcon',:style=>'border-style:none' %> - <!--<a href="javascript:void(0);" onclick='this.parent.submit();return false;' class="searchIcon"></a>--> - <% end %> + <div id="search_div"> + <%= render :partial => 'resource_search_form',:locals => {:user=>@user,:type=>@type} %> + </div> </div> <div class="resourcesListBanner"> @@ -168,7 +164,7 @@ $(".resourcesList").click(function(e) { } //将当前行改变为白色 line.children().css("background-color", 'white'); - //当前行恢复编辑状态 + //当前行恢复编辑状态到链接状态 if(ele.nodeName != 'INPUT') { restore(); } @@ -210,6 +206,7 @@ $(".resourcesList").click(function(e) { '"/> <input type="hidden" name="res_id" value="'+id+'"/>'+ '<% end %>'); $("#res_name").focus(); + document.getElementById('res_name').scrollIntoView() } String.prototype.trim = function() { var str = this, @@ -219,38 +216,42 @@ $(".resourcesList").click(function(e) { while (ws.test(str.charAt(--i))); return str.slice(0, i + 1); } + + //恢复编辑状态到链接状态 + //如果当前是编辑状态,任何的不在输入框里的单击右键事件都需要将编辑状态变回链接状态 + //如果是编辑状态,且做了修改,那么久要进行修改,并且将修改值经过处理替换到页面显示 function restore(){ + //上一行不为空 且链接不为空 if( last_line != null && res_link != null && res_link != '') { - name = $("#res_name").val().trim(); - if(name != res_name.trim()){ + name = $("#res_name") ? $("#res_name").val().trim() : $("#res_name") ; + if( name && name != res_name.trim()){ if(confirm('确定修改为 '+name)){ - //$("#res_name_form").submit(); -// $.ajax({ -// type:'post', -// url:'<%#=rename_resource_user_path(@user) %>', -// data: $("#res_name_form").serialize() -// }); $.post( '<%=rename_resource_user_path(@user) %>', $("#res_name_form").serialize(), function (data){ - if(data =='sucess'){ + if(data =='sucess'){//修改成功,那么将链接恢复,并且将链接的显示内容改变。链接可以不变 last_line.children().first().html(res_link); last_line.children().first().children().attr('title',name); - last_line.children().first().children().html(name); + last_line.children().first().children().html(name.length > 17? name.substring(0,17)+'...' : name); }else{ last_line.children().first().html(res_link); + res_link = null; //如果修改失败,恢复之后将res_link置空 } }, 'text' ); }else{ - //last_line.children().first().html(res_link); + last_line.children().first().html(res_link); + res_link = null; //如果没有做修改,恢复之后将res_link置空 } }else { last_line.children().first().html(res_link); + res_link = null;//如果没有做修改,恢复之后将res_link置空 } + + } } @@ -261,7 +262,7 @@ $(".resourcesList").click(function(e) { } line.children().css("background-color", 'white'); id = line.children().last().html(); - if (confirm('确定要删除资源' + line.children().first().children().attr('title').trim() + '么')){ + if (confirm('确定要删除资源"' + line.children().first().children().attr('title').trim() + '"么?')){ $.ajax({ type: 'post', url: '<%= user_resource_delete_user_path(@user)%>' + '?resource_id=' + id diff --git a/app/views/users/user_resource.js.erb b/app/views/users/user_resource.js.erb index 69fc3dd43..d69a769af 100644 --- a/app/views/users/user_resource.js.erb +++ b/app/views/users/user_resource.js.erb @@ -1 +1,2 @@ +$("#search_div").html('<%= escape_javascript( render :partial => 'resource_search_form',:locals => {:user=>@user,:type=>@type} ) %>'); $("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); \ No newline at end of file From 32aef6f2891fd0fd50edd29b2ea88dc6c941c402 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Tue, 18 Aug 2015 15:36:15 +0800 Subject: [PATCH 06/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/user_resource.html.erb | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 1c54fc67e..98984b3f9 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -28,8 +28,6 @@ function closeModal() { - //hideModal($("#popbox_upload")); - //$("#attachments_fields").html(''); $("#upload_box").css("display","none"); } @@ -48,19 +46,15 @@ <li class="resourcesSelected"><a href="javascript:void(0);" class="resourcesIcon"></a> <ul class="resourcesType"> <li> - <!--<a href="javascript:void(0);" remote="true" onclick="remote_get_resources('',1)" class="resourcesGrey">全部</a>--> <%= link_to '全部' ,user_resource_user_path(:id=>@user.id,:type=>1),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> </li> <li> - <!--<a href="javascript:void(0);" class="resourcesGrey">课程资源</a>--> <%= link_to '课程资源' ,user_resource_user_path(:id=>@user.id,:type=>2),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> </li> <li> - <!--<a href="javascript:void(0);" class="resourcesGrey">项目资源</a>--> <%= link_to '项目资源' ,user_resource_user_path(:id=>@user.id,:type=>3),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> </li> <li> - <!--<a href="javascript:void(0);" class="resourcesGrey">附件</a>--> <%= link_to '附件' ,user_resource_user_path(:id=>@user.id,:type=>4),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> </li> </ul> @@ -73,7 +67,6 @@ <a href="javascript:void(0);" onclick="show_upload();" class="uploadText">上传资源</a></div> <div id="search_div"> <%= render :partial => 'resource_search_form',:locals => {:user=>@user,:type=>@type} %> - </div> </div> <div class="resourcesListBanner"> From 375c016783b00bbbae617181011af267593b797c Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Tue, 18 Aug 2015 15:42:36 +0800 Subject: [PATCH 07/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/user_resource.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 98984b3f9..f5a6c57f0 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -199,7 +199,7 @@ $(".resourcesList").click(function(e) { '"/> <input type="hidden" name="res_id" value="'+id+'"/>'+ '<% end %>'); $("#res_name").focus(); - document.getElementById('res_name').scrollIntoView() + $("html,body").animate({scrollTop:$("#res_name").offset().top},1000) } String.prototype.trim = function() { var str = this, From ae6260571b4d4321cf68d433f8d0c793dd9d0c94 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Tue, 18 Aug 2015 16:57:41 +0800 Subject: [PATCH 08/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 8 ++++---- app/views/users/user_resource.html.erb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6bbfbd12b..c3c5da9cf 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1106,25 +1106,25 @@ class UsersController < ApplicationController #确定container_type # @user = User.find(params[:id]) if(params[:type].nil? || params[:type] == "1") #全部 - if User.current.id == params[:id] + if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") end elsif params[:type] == "2" #课程资源 - if User.current.id == params[:id] + if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course'").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Course' ").order("created_on desc") end elsif params[:type] == "3" #项目资源 - if User.current.id == params[:id] + if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc") end elsif params[:type] == "4" #附件 - if User.current.id == params[:id] + if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index f5a6c57f0..09bee5ac6 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -199,7 +199,7 @@ $(".resourcesList").click(function(e) { '"/> <input type="hidden" name="res_id" value="'+id+'"/>'+ '<% end %>'); $("#res_name").focus(); - $("html,body").animate({scrollTop:$("#res_name").offset().top},1000) + $("html,body").animate({scrollTop:$("#res_name").offset().top},1000) } String.prototype.trim = function() { var str = this, From 43d57074e51277b505fc7d7f7ed781c2a81cb2a8 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Tue, 18 Aug 2015 17:26:39 +0800 Subject: [PATCH 09/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 2 +- app/views/users/user_resource.html.erb | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c3c5da9cf..2caae19e1 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -894,7 +894,7 @@ class UsersController < ApplicationController # format.js # end if @flag - render :text=>'sucess' + render :text=> download_named_attachment_path(@attachment.id, @attachment.filename) else render :text=>'fail' end diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 09bee5ac6..1cad8f2de 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -158,7 +158,7 @@ $(".resourcesList").click(function(e) { //将当前行改变为白色 line.children().css("background-color", 'white'); //当前行恢复编辑状态到链接状态 - if(ele.nodeName != 'INPUT') { + if(ele && ele.nodeName != 'INPUT') { restore(); } line = null; @@ -224,9 +224,10 @@ $(".resourcesList").click(function(e) { '<%=rename_resource_user_path(@user) %>', $("#res_name_form").serialize(), function (data){ - if(data =='sucess'){//修改成功,那么将链接恢复,并且将链接的显示内容改变。链接可以不变 + if(data != 'fail'){//修改成功,那么将链接恢复,并且将链接的显示内容改变。链接可以不变 last_line.children().first().html(res_link); last_line.children().first().children().attr('title',name); + last_line.children().first().children().attr('href',data); last_line.children().first().children().html(name.length > 17? name.substring(0,17)+'...' : name); }else{ last_line.children().first().html(res_link); From 3836cfb40ba4bcd3b07b3a8dfb7698f24dddb3d6 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Tue, 18 Aug 2015 17:45:14 +0800 Subject: [PATCH 10/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_resource_search_form.html.erb | 2 +- app/views/users/user_resource.html.erb | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/views/users/_resource_search_form.html.erb b/app/views/users/_resource_search_form.html.erb index 0c48514b3..725167b65 100644 --- a/app/views/users/_resource_search_form.html.erb +++ b/app/views/users/_resource_search_form.html.erb @@ -1,6 +1,6 @@ <%= form_tag( url_for(:controller => 'users',:action => 'resource_search',:id=>user.id), :remote=>true ,:method => 'post',:class=>'resourcesSearchloadBox',:id=>'resource_search_form') do %> - <input type="text" name="search" placeholder="输入资源关键词进行" class="searchResource" /> + <input type="text" name="search" placeholder="输入资源关键词进行搜索" class="searchResource" /> <%= hidden_field_tag(:type,type) %> <%= submit_tag '',:class=>'searchIcon',:style=>'border-style:none' %> <!--<a href="javascript:void(0);" onclick='this.parent.submit();return false;' class="searchIcon"></a>--> diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 1cad8f2de..621b0c17d 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -216,7 +216,10 @@ $(".resourcesList").click(function(e) { function restore(){ //上一行不为空 且链接不为空 if( last_line != null && res_link != null && res_link != '') { - name = $("#res_name") ? $("#res_name").val().trim() : $("#res_name") ; + name = $("#res_name").lenght != 0 && $("#res_name").val() != undefined ? $("#res_name").val().trim() : undefined ; + if (name == undefined || name === 'undefined' ){ //只要res_name没有值,那么就不是编辑状态 + return; + } if( name && name != res_name.trim()){ if(confirm('确定修改为 '+name)){ From e7f818deb9e62b599ab126b781eedbeef148a4bb Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Wed, 19 Aug 2015 09:20:39 +0800 Subject: [PATCH 11/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 2caae19e1..bc9394716 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1146,25 +1146,25 @@ class UsersController < ApplicationController # @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and is_public = 1 and (filename like '%#{search}%') ").order("created_on desc") # end if(params[:type].nil? || params[:type] == "1") #全部 - if User.current.id == params[:id] + if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%') ").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "2" #课程资源 - if User.current.id == params[:id] + if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course' and (filename like '%#{search}%')").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Course' and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "3" #项目资源 - if User.current.id == params[:id] + if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project' and (filename like '%#{search}%')").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "4" #附件 - if User.current.id == params[:id] + if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%')").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%')").order("created_on desc") From 0ef7d5f0fa23ac6f4e099770c8197242a4fc2228 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Wed, 19 Aug 2015 12:04:06 +0800 Subject: [PATCH 12/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=E5=8F=AF?= =?UTF-8?q?=E8=A7=81=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index bc9394716..c523bbb3d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,3 +1,4 @@ +#encoding: utf-8 # Redmine - project management software # Copyright (C) 2006-2013 Jean-Philippe Lang # @@ -14,6 +15,7 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + class UsersController < ApplicationController layout :setting_layout @@ -1109,13 +1111,18 @@ class UsersController < ApplicationController if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") else - @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + + "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course'").order("created_on desc") else - @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Course' ").order("created_on desc") + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ + "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "3" #项目资源 if User.current.id.to_i == params[:id].to_i @@ -1140,22 +1147,24 @@ class UsersController < ApplicationController # 根据资源关键字进行搜索 def resource_search search = params[:search].to_s.strip.downcase - # if User.current.id == params[:id] - # @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and (filename like '%#{search}%') ").order("created_on desc") - # else - # @attachments = Attachment.where("author_id = #{params[:id]} and container_type not in ('Version','PhoneAppVersion','StudentWork') and is_public = 1 and (filename like '%#{search}%') ").order("created_on desc") - # end if(params[:type].nil? || params[:type] == "1") #全部 if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%') ").order("created_on desc") else - @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%') ").order("created_on desc") + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type in" + + " ('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon'))"+ + " or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')})) )" + + " and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course' and (filename like '%#{search}%')").order("created_on desc") else - @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Course' and (filename like '%#{search}%') ").order("created_on desc") + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type = 'Course') "+ + "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')})) )"+ + " and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "3" #项目资源 if User.current.id.to_i == params[:id].to_i From 929da7512da5d1c17d8e913b7e7937424faabead Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Wed, 19 Aug 2015 17:13:57 +0800 Subject: [PATCH 13/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=95=8C=E9=9D=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 33 ++++++++- .../users/_resource_search_form.html.erb | 2 +- .../users/_resource_share_popup.html.erb | 15 +++- app/views/users/_resources_list.html.erb | 5 +- app/views/users/user_resource.html.erb | 58 +++++++++------- public/stylesheets/images/homepage_icon.png | Bin 0 -> 6829 bytes public/stylesheets/images/nav_icon.png | Bin 0 -> 3204 bytes public/stylesheets/public_new.css | 65 ++++++++++++++---- 8 files changed, 133 insertions(+), 45 deletions(-) create mode 100644 public/stylesheets/images/homepage_icon.png create mode 100644 public/stylesheets/images/nav_icon.png diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c523bbb3d..e4109e5bb 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -825,7 +825,38 @@ class UsersController < ApplicationController # 删除用户资源 def user_resource_delete Attachment.delete(params[:resource_id]) - @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + #@attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + if(params[:type].nil? || params[:type] == "1") #全部 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + else + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + + "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + end + elsif params[:type] == "2" #课程资源 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course'").order("created_on desc") + else + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ + "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + end + elsif params[:type] == "3" #项目资源 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc") + end + elsif params[:type] == "4" #附件 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + end + end + @type = params[:type] respond_to do |format| format.js end diff --git a/app/views/users/_resource_search_form.html.erb b/app/views/users/_resource_search_form.html.erb index 725167b65..5f854cba0 100644 --- a/app/views/users/_resource_search_form.html.erb +++ b/app/views/users/_resource_search_form.html.erb @@ -2,6 +2,6 @@ :remote=>true ,:method => 'post',:class=>'resourcesSearchloadBox',:id=>'resource_search_form') do %> <input type="text" name="search" placeholder="输入资源关键词进行搜索" class="searchResource" /> <%= hidden_field_tag(:type,type) %> - <%= submit_tag '',:class=>'searchIcon',:style=>'border-style:none' %> + <%= submit_tag '',:class=>'homepageSearchIcon',:onfocus=>'this.blur();',:style=>'border-style:none' %> <!--<a href="javascript:void(0);" onclick='this.parent.submit();return false;' class="searchIcon"></a>--> <% end %> \ No newline at end of file diff --git a/app/views/users/_resource_share_popup.html.erb b/app/views/users/_resource_share_popup.html.erb index 01ac79075..cad94056c 100644 --- a/app/views/users/_resource_share_popup.html.erb +++ b/app/views/users/_resource_share_popup.html.erb @@ -1,8 +1,17 @@ -<div class="resourceSharePopup"> <span class="sendText">将资源移动至 </span> - <div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div> +<div class="resourceSharePopup"> <div> + <div class="sendText fl">将资源发送至</div> + <div class="resourcesSendTo"> + <select class="resourcesSendType"> + <option value="课程">课程</option> + <option value="项目">项目</option> + </select> + </div> + </div> + <div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div> + <div class="fl"> <%= form_tag search_user_course_user_path(user),:method => 'get', :remote=>true,:id=>'search_user_course_form',:class=>'resourcesSearchBox' do %> <%= hidden_field_tag(:send_id, @send_id) %> @@ -17,7 +26,7 @@ <%= hidden_field_tag(:send_id, @send_id) %> <% if !courses.empty? %> <% courses.each do |course| %> - <ul class="courseSend"> + <ul class="courseSend fl"> <li class="fl"> <input name="course_ids[]" type="checkbox" value="<%= course.id %>" class="courseSendCheckbox"/> </li> diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index 6f9ba0fee..b344c737d 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -1,7 +1,10 @@ <% if attachments.nil? || attachments.empty? %> <% else %> <% attachments.each do |attach| %> - <ul> + <ul class="resourcesList"> + <li class="resourcesListCheckbox fl"> + <input name="checkbox1" type="checkbox" class="resourcesCheckbox" /> + </li> <li class="resourcesListName fl"> <!--<a href="javascript:void(0);" class="resourcesBlack"><%#=truncate(attach.filename,:length=>18)%></a>--> <%= link_to truncate(attach.filename,:length=>18), download_named_attachment_path(attach.id, attach.filename), diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 621b0c17d..5867c463f 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -40,22 +40,22 @@ } </script> <div class="resources"> - <div class="resourcesBanner"> - <div class="bannerName">资源</div> + <div class="homepageRightBanner"> + <div class="NewsBannerName">资源库</div> <ul class="resourcesSelect"> <li class="resourcesSelected"><a href="javascript:void(0);" class="resourcesIcon"></a> <ul class="resourcesType"> <li> - <%= link_to '全部' ,user_resource_user_path(:id=>@user.id,:type=>1),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> + <%= link_to '全部' ,user_resource_user_path(:id=>@user.id,:type=>1),:remote=>true,:method => 'get',:class=>'resourcesTypeAll resourcesGrey' %> </li> <li> - <%= link_to '课程资源' ,user_resource_user_path(:id=>@user.id,:type=>2),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> + <%= link_to '课程资源' ,user_resource_user_path(:id=>@user.id,:type=>2),:remote=>true,:method => 'get',:class=>'homepagePostTypeAssignment postTypeGrey' %> </li> <li> - <%= link_to '项目资源' ,user_resource_user_path(:id=>@user.id,:type=>3),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> + <%= link_to '项目资源' ,user_resource_user_path(:id=>@user.id,:type=>3),:remote=>true,:method => 'get',:class=>'homepagePostTypeQuiz postTypeGrey' %> </li> <li> - <%= link_to '附件' ,user_resource_user_path(:id=>@user.id,:type=>4),:remote=>true,:method => 'get',:class=>'resourcesGrey' %> + <%= link_to '附件' ,user_resource_user_path(:id=>@user.id,:type=>4),:remote=>true,:method => 'get',:class=>'resourcesTypeAtt resourcesGrey' %> </li> </ul> </li> @@ -63,14 +63,14 @@ </div> <div class="resourcesSearchBanner"> <div class="resourcesUploadBox"> - <div class="uploadIcon"></div> - <a href="javascript:void(0);" onclick="show_upload();" class="uploadText">上传资源</a></div> + <a href="javascript:void(0);" onclick="show_upload();" class="uploadBoxIcon">上传资源</a></div> <div id="search_div"> <%= render :partial => 'resource_search_form',:locals => {:user=>@user,:type=>@type} %> </div> </div> <div class="resourcesListBanner"> <ul class="resourcesListTab"> + <li class="resourcesListCheckbox fl"> </li> <li class="resourcesListName fl">资源名称</li> <li class="resourcesListSize fl">大小</li> <li class="resourcesListType fl">类别</li> @@ -78,11 +78,21 @@ <li class="resourcesListTime fl">上传时间</li> </ul> </div> - <div> - <ul id="resources_list" class="resourcesList"> - + <div id="resources_list" class="resourcesList"> <%= render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments} %> - </ul> + </div> + <div class="resourcesListOption"> + <div class="resourcesCheckAll"> + <input id="checkboxAll" type="checkbox" value="" class="resourcesCheckbox" /> + </div> + <a href="javascript:void(0);" class="replyGrey mr15">全选</a> + <a href="javascript:void(0);" class="replyGrey">删除</a> + <div class="resourcesSelectSend"> + <div class="fl">选择 <span class="c_red">10</span> 个资源</div> + <div class="resourcesSelectSendButton"> + <a href="javascript:void(0);" class="c_blue db">发送</a> + </div> + </div> </div> </div> <div id="upload_box" style="display: none"> @@ -190,9 +200,9 @@ $(".resourcesList").click(function(e) { document.oncontextmenu = function() {return true;} line.children().css("background-color",'white'); id = line.children().last().html(); - res_name = line.children().first().children().attr('title'); - res_link = line.children().first().html(); - line.children().first().html('<%= form_tag(url_for(:controller => 'users',:action => 'rename_resource',:method => 'post',:remote=>true,:id=>@user.id),:id=>"res_name_form" ) do%>' + + res_name = line.children().eq(1).children().attr('title'); + res_link = line.children().eq(1).html(); + line.children().eq(1).html('<%= form_tag(url_for(:controller => 'users',:action => 'rename_resource',:method => 'post',:remote=>true,:id=>@user.id),:id=>"res_name_form" ) do%>' + '<input name="res_name" id="res_name" ' + 'style="height: 2em;line-height: 2em;overflow: hidden;" onblur="restore();" ' + 'value="'+res_name+ @@ -228,23 +238,23 @@ $(".resourcesList").click(function(e) { $("#res_name_form").serialize(), function (data){ if(data != 'fail'){//修改成功,那么将链接恢复,并且将链接的显示内容改变。链接可以不变 - last_line.children().first().html(res_link); - last_line.children().first().children().attr('title',name); - last_line.children().first().children().attr('href',data); - last_line.children().first().children().html(name.length > 17? name.substring(0,17)+'...' : name); + last_line.children().eq(1).html(res_link); + last_line.children().eq(1).children().attr('title',name); + last_line.children().eq(1).children().attr('href',data); + last_line.children().eq(1).children().html(name.length > 17? name.substring(0,17)+'...' : name); }else{ - last_line.children().first().html(res_link); + last_line.children().eq(1).html(res_link); res_link = null; //如果修改失败,恢复之后将res_link置空 } }, 'text' ); }else{ - last_line.children().first().html(res_link); + last_line.children().eq(1).html(res_link); res_link = null; //如果没有做修改,恢复之后将res_link置空 } }else { - last_line.children().first().html(res_link); + last_line.children().eq(1).html(res_link); res_link = null;//如果没有做修改,恢复之后将res_link置空 } @@ -259,10 +269,10 @@ $(".resourcesList").click(function(e) { } line.children().css("background-color", 'white'); id = line.children().last().html(); - if (confirm('确定要删除资源"' + line.children().first().children().attr('title').trim() + '"么?')){ + if (confirm('确定要删除资源"' + line.children().eq(1).children().attr('title').trim() + '"么?')){ $.ajax({ type: 'post', - url: '<%= user_resource_delete_user_path(@user)%>' + '?resource_id=' + id + url: '<%= user_resource_delete_user_path(@user)%>' + '?resource_id=' + id+'&type='+$('#type').val() }); } } diff --git a/public/stylesheets/images/homepage_icon.png b/public/stylesheets/images/homepage_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bb32783b57537f105cc7a29fa61203a8545bd4ae GIT binary patch literal 6829 zcma)h2UJr_*LJ)p2q>U}bP2slhY(5xr5UA%Pz9s}2oNBIjtF?AML;@;5CIXSD!tnv z6lp@FhH?!^M4Etv3!(hcd%f@bt@Yji|Ia#WX7<c}_TDq|%$#%PB$yf-oMqx+0ssJK zq1ScIY55QUaKhp=J+0)ONe8E8+yQ#l0We>;fM6$o1mLQxuQLJ&MLD@6%n?qmq3Aw@ zCICPugtV{@ur@MOckxBZI{na*4MF+Q&;Wp@R*0XIix(mQ=!|ej`apy>+FlC*k**LS zD-|PoBR?I42l9HDKLQqJY~d2-<)Y>)q;&<T8KO=zfI<W~0YgyUJ{a{7h|o{F>a_BY zYB?d`Pn7^Kh|pg_SsR%Gb$tC1Kowaf85em41t16{tDvj`0x4VuD#|M;%E{Aikc@(| zx(Y~LQ5E?2B}DV)@9L&*uB-pIFPa1q@(2j<Q<swq4i1(LR+9Dgcb8L8Q&an4Ls3zN zrXhm~^$Bnak@3L@|FWQqz_|D${Q{7_KENLqot%9G10X`QNdM{r%I_buKA69Ui8f$z zAx?gB3bOJ)y7WuY$msvBibDOPjR`PE{3qW3)iA~))DIzNj==Z^`n%93&Q17-D?fD| ze}q$jufK(_ulKJ}H1+Te@Wpue`T=!dAfSX5(#O>|7$f;p-^fTE>VpYz@^L{xbs<7D z3$jS0t2$T@q^}Rw2PuOT6%`cpRIaLC)zwi@)=^PWy{ZUSy!H#L>+2GTLihyy!n*zk ztNO3lA5=j3(LC!S{E<NjSABn96!2%4)sg=mi}JtP`y1=}@3E--D^`vcjNFfj{jZ7s zRYhaZkK#YHr3wEKAK^n|yFZQA1=)rd002%wsP0vZkm=QY#vF^WN3p)poB9?a@zU6W z>rc(1JxFr}QRereo_hG5oKjZoYA!H&fMu?J-W6e(NPlwSo_Z~E;kRoQX5wa7pN^i1 zrbn`qB;KNQ4aw9M+*etw-57jqY<3L3LDf9QRIHEteSNj_1hZa+xi&U7b_r126U2T3 zKmq_+ekHVASyOL$^<eGW@<{gY>=)Q)Ie0nhI3}d7Bu#ZB5y|X&c6f6<KQ^Wj9k<*m zd3ds&y55%h*b5T&{j?d+vQp^Q;+vJa`ugvLoQU6En5@;wXTCmngG~SYf_wV~ATAJ# z!*XDUu-WYV3zQnIpj47WS6S*}kL~v~k>Rg9=hkm7dp7Nz#~Y&TN>TPz-aBE;&$29X ziziCEtP3O39G*;*=e!?aQZ8<Y_F4E!C&LeH&>r_9URedCg9QYQba|+N$np>vI>59> z+D&4}OtTcs8+!gmdcz8A>rTcXXsB7eJUC8zNo>!6n<y>2=#u<0-8qu_+fATRv1J9= zapcB`qnTli%HhtVYOr|8OOyG_`QjU9OMhBFFd%>z&+%`c5S{ow;oeGG&3<-#o8ijB zb$C_&MRIr5Q7H*NVV&guJQ=Ci_ZMEzW<Rds52a+k)}p{$3*VIyndf76P8%f>=fm!W znRy#UMwCborCmPkoD(DJw&q3hI=(vZW;_tS!jIiJ9U?nzf7U4Yhl&o(4&;qH-*pY> zIciml*TvU*%+dO7R|p(rCp{a;vDw4YDd5mV@`)8F6+ZJdg5!0zCRKvvhN&@rh6}a7 zqGXS*{1g^Tp0~Q5?P;~cweIjc*`~o8Gt+vGX$3`<FMw>f7TXxtoPycf=4P(I$YtC6 z1B-pp5@K&=tKZsk!m$e2y%7#gHB-WPsKWz4Y}*q_G_L65SGTRjKBVK5^KN&`$uEX= zaBit^aa^^F*3Iy^t{ZeJqi3KxJPSemb;6?A<`n44zM(<xKGtPY2SfSvaOc2)!+G!R z_LG~uOM9%-ZyOJq-YND{vC-IUI?A3dI=x~PQkl4|g3qeed?J-*|Af<vDz7&^;of-H z^7d@Gdw7F=DdizgS##V&IV3}LCczXxyc1UaZrw8&JB5E0!18gw;&3*6M!O6lV)|i6 z?Z(Q+(D%F@<ibg(VW!#A<{9R@*T$YErJHjkKjBa|Y%5*b&rlBjNWL|7BuG5OLa~x} z40qn^3Kk<%259tAB65o(dchy^7!}gQwFy>Z05*mnH~OFCe+aqP_^9Zt!^?s0SY9^q zz}4V+aY+Z$)oZDABoQ)Luf@59e7r=J*ySmhBACAJQF{*`zT9aMc2sEvx>!4C|IULN z1wJv!C&ElBM{H=IkD#e^@CKCH<pP;HOEk|YfOK;E!mt3R_e4%0D8ow*KQG~_orhW` z6;H_+=Uzym_gFXyTjV*g|4ni51{NF<<oHr#tI+$)Y`$R8mNnnwfk2a(vzO+WkfT{5 ziuP?Hp_VV`O1&l;1E()Os<wae2(50?Rpt+`?SMpH!yR2u&r(L3OeAX>nSk7=icSvb zt;x!hTBenf=|cf)I4cc%joo*O#qI4g>k8A_tE$qkz8&nv4?So}_LY&8v>E5hr=t`$ zSzR{B{cgH+J-juD|99m_H@B5!+@y^y4|>N^ye~GvaavyYBNRHGAGRvTf>T1_GHc7z zfoBK}?qY+(kjUK5*V4xD$pKc-)RZ40r;a0gc_#s<b#9C!KAm{dc%r(}yy$i-Wfh9K z->>XtZ~5qtat|@X!TPu`lu7eJcJ@10$9O`(l$c*@5F?Bnur{*pc^%5*r7;cBe|&OK zY@>C$0T~O;5O3&sMheo?3hsS<DnpI52woF8MGL_sSGXbPne|$6%Mc>BPGrz!+Got6 zA8cvlRk%yJkdwO3)zvqW9DSeAa1$57&RFV2?)JDbYVG@(Q2i;g)r)W@_>o&lqa8<R zImwVS6E|Ps)-OqmyBK2MR_xSD`S|j2&p0M1izJ1=t>+8fzF$1mnc2~RNQPI!+CPh| zltxIM6K|?ZW~>D!>8zK0G#6W)PSIQM|02s+V?8<vlf`gAG+%R8#gMf|j+32JD0?EA z>B7c@AhsVKl7D(okUc8=Q-3p`#13^aaU9q_5Z?=LNvyZtY$VN#4#rxTB!i7^P7@lW zZz|Y_drr<CAIbinA$502{kK&GajMO0NQ2WujYB9pmO{OppRSbYL~!S?kn)xjJeu#= z`0{l+)@b6Wvae`|!D~-YG|QhHHEWGqnpU^OHwf6QS6h?zhUup<k)MrohY1iZ(qf6> zL1n=a$y#Ng#7$tKb{{6|W!JVefsMh<%N*K>kq!8I-9uO1mcZgB;S<Vx?-4@bIT)7` zvOZtbnF0*pzm^^Pe;2lX*XOSDqU}!+4O}m{%x!J=Me!`Ic^_XYyfZd$2POm+PDUrD zYZ4|4PJ{CAo&D2IIBD|BHzi19eF&h7F{OJ+u%<BNa%X!XSZ`ARyDJgov98=}QYt$5 z38(eJ!MkA~R{Lu;h=tHdhspyWy}59lq~e-o4r3i2?Y!Ga@B6yE7QPcXW2t=sqGxGJ zq?6YPcxatnp0YUb?1yf~tZsE~Z=d(FCmzLeKc@u}MW-3*w&<He&lK$)Xh8HU0@=3> zzVO)f+!r1k|GqLI=NB<`sAIBy1*i1R?sdp*kN%R}ov}5O{Dn0QKiiO*g<*Pr)yShe zOe(Bh2}9?6xA=sRIgK4G?=Q9g5wek_@VQWxlYXMGVu|HDJ3`nld~Sp_^ZxMhT1AE} zt^p0~NQ4C$QOgS9O8Q?uW4{*VtA<ippL|*y!K6;qCTV4DE+wHdqQgR^OIevwd!r>Y zE4OBmll9+<%TrzRTFah4f5{D8rEfQS=$}Xm9~MyB2Mr6{iHK{~@s8w8Ib0x-NE>Y8 z40y@5PX&^NpLZR3QcDPGO7GIgjc(*Vs-B|eekeDH(_36tTvz>+AdqB`r;e|27bdqh z249|+8fU0qt6D<9A`Y&R?tI9}r%So9<2}t`?^R6GKWZ&j@P6|3$=ux*ewQBo@(@!_ z&_v3hGHQ&7S8!5#F{KNGqigh?2oZM(lPJFHF{<6|>#7F~1F)rLX(58}1@$nEAnOZP zTvkCQ@C?Y|o1n%kcc4?1wbJz8&%g)UCc~+<HaD)cndd-}Pn-2d%v0YJq=+r$w!G6| zHT|7jo1QoaNS$UHiXP7Xm<^Hs@Y1>c6(cJ+XTuyjF0AX59TfA)efU1;Rd5dCaXdIp zLb<J3$Q+?@*A4o-^R_zkd8;vpdM~>g(WK7H2^JOQLFeHOx10}2Z&jwma_wI^%nEL; zH6UPK7lc8C9A&YD<Q49++GQ>cP;KY5+Ea-S#nvs9ni2%hNDn_*&{%d8Kk6dXFA!|k z3a5TfsqitU=RR)-e{kJ-g~;06ui;HPt3r;yM1>=)n3N?qRKBC@(L4_}R2z~mR}s~= zwnfCD%e(~VdEbt?9MiVZ<ii!C_ZD8QrUlSFaOc8!8rnZ;%`S3X(PTGqcry^u)9c^E z(l7a;*h0|wm6NLKQ`Dm#AEaFnS(5I;nkSJ)z5>ho7nZ@r0GP9pjzAnZ3IFQ%BQ~4r zJcY_e{fN%44;tA<l5LxRI5I$8i0zq#;VK($2q;YUde<>6wg3aw^J9)xp67Dyy=R|F zmxsTeRMjMnzrSuWjWIZwx>Ql-Gv<^O{N|g%0ndKk)zoT_aK6%w{)kR@lRw*O4B^*d zHV*5nTmSOSE<ARcVr^1J4>L1!vZvN*9=|e_vL78EZ|cdX=j7ykodj095AlZu4bH)I zDlYL0LNCTfPP7Dz)a7VKa%+iNsQ5+^8!)=nv&rFu8cUx>M&=r89jmR`_T2^(#`1?A zUBuP<h&-H8mWe0ikTegqnGrcM@8zY-iF_1?Kj(r<ec=$8WkUNT@^uwX<arCXZ9T^Q z#jzu{evP5)YTmtbJ$)l^c=baen`h5=#5Uq37djU%IkHcx`5k|7NcFBqq#xh^zNzGO z*C7fV4>Kj{-Va&Lg0yGv-zgth7(4B{>oMKRoA*R+%}q=C`MDAg_u-YjfvcXJG7oTc zXtvTny2{Qyr-;)hXmH$mEOr+{0vf-?!t6w;c;uW_MVtPm{;Bqw{Muo@2255=4`kE3 z$c2po4anu60i4q219YAEm1y%t=@-0>RPUIVzKOc@0j2M16LGDH4bK{%o^u1wvAz>J z*Z5TWH&Zxs?`4XH4{u$ts`wxemcJL=0I#*QO{5$slvBPP2<r8-!#L78I75!UU?0z% zFL<exT)bR@kHdzuui0Bp!JInVE!B|Ka7s&>P~4q@Io8k{xwDW+c`quSWZJh`nu7wJ zo?pOe(d|S}Q-ZO4z2Ga)WZTYQGrJpnS3Ax|);}frV|i&_Z4fbVf=J&R5$eD=$#ktw zOYfD;=g*&CAkmfKR9h&N5f;j>-92ShQ<)qgb&JSwPYtxRgJw5yig)R7=QmGzKsgIE zK11Q1J1S3J%Ph!sTNB__T0KR3sVmL0n+aXIp4PEYT(gUr4O*Yoo-^IxE%5yIA_b`P zeGBT<-<%A19EsM#1Dl9!#D}Dk&Zxw?2F+nFr>9@FN+ir~EoDVo1Yn5KEOd&-QJRqi zQZ~CJkj3=W@39r-C*bm3C;lFJNoxnzko>Rez2~?B_@ff(qQHRozmi}1&zipkwbNSp zJ|a?5Qj`(r8lk&fw;xwko1oE~Za2#I-VjETgp&rZyXzqMGjDV9e%$P5H{MA;*_L@; zbb+0zM>MtjOExLg)+{4bY^bTT)Q+R8Wb1VJQKI+Ctm-mK!%*N=S`mG@C-DXbOMbYB z9N0SGp7I7#-uleiq{UrjJb`vDUaq8lA2NtxPug(Sp?t+hP1t7})*_i-Mr=R7C{q{m ze$bPg*ZGWiP~i!BL1x9mM7#GV&x)lks=?)qau~5@r>wgTq}1Iv?<Bs>r*mDnGSr6+ z-5l-eby*>|95SWCZLT<qW~1)L*Ht*9_^FeWS*H5L3D><l6)oP|I(+G*Kh!BTYXY1e z+*V6}?iD0-g}yI$^6U>V`4IYH7EZuj<5OfIee{oe7dHA{1Ue5!t{!gtP}eNR*u))s z$0PFS8eTq{WbsdOdMr%_=!xSEaPvkT?QG1=MMXtAS#p#^?1Kjre#@Za#Dx~BlBFo` zr{d*>z1b3B$nnwO)^D;4QutjP^@)qYS9%%H8R#&iLLVY8$!CXN&&uw_ngNIB32BXk z6#RpTDh&Z;g{d&h!P>#S^&N_j+J^`oo-Fj-<v;uzS?(pPO^yJJrn(dQuN*>-W67K4 zMIHL*=-?^<kDNq0?e1UH_-keU*9!fIH2>BTrC%cPSezK~HZ92ZRykL}7m}qMY`|=$ zt}u9aSi--Tp%w%zELO9B5XaFbGKolc&R7hMb!O-)%j|Z$#jH00O-UhMq%y4Tq+H7^ zEh-X{o;Szi@q)6mZVvEtE|BE9fb%n`SovCoi$kU+FH`-%3(NM*Pc@(&YSOL7y^-z~ z(-HNgL)82O4y%hEkL1j{L)1DGcZ6l9W`MjMo^(oJH-MgFsfdh3%)t=Y-i4^V+4UkA zg>%MUDO0u-T`6tGjrPtbrZYa4+%GmXyCoY<DU#SyU6_o>^+9*ICxnd^RTh7_;KsXB zs5#!zkQ_CVapSIAo*FmbHlLnAs%vTUE-3PAl|sePSgVd?*#SHG%JA!!M^cR&_UsY& z#YMW`Ds1#fs`s=vvD_m{mT0o~%s%A)yr-(V@{Ym{f3xf7T-V=cJE_~*)Uu1xJicV2 zDegst-YRd=0|~UKb#D9KU(dUpEyp3uyqC(myBHOSAGT_*h_~$Amw1QWWMqkO9O>K+ zpI+Kr)V>?QqN_AaNOMmmYb}PBlY`alHm3Y1N?IPrX?ne^4eg9U=M+67y;V<+zS9p* z@$cq-8Y0>W%PR<pPfR!9W-wn8#6}JMV8YM&kGgfwK?R`r&ruHTQ0G7AI{z-Pi`np| z$iLMD6H`2vK!4$Xod*5H{|`ZXA$~i98PEky<;E7ux|t4qn7rTl$>D6Mw@&<afpb^v z+-&5_mlN3eO|xsln5vW3&$v=!<%L(dG#YF0Eq3VW`+M#IG2swPwD=QIWg%gX2kfwX z?T$1Am-v81@IY^?F|MHx6YThM(GBX4h}b>R>z`Tmv>zy($3BsrnJI%UOPd1O8Dof2 zFg3Y4V;#YU(4w@<{uSZ){tT&jx)`aH>;(CEI#br>6HNcvCTXSrw-Bmr7QrGbCnq;f zx}#^J7u*z<;9Ns`o0gWwgyq^wO=MU}QO@>6KXr~f*><O**>>w7);abbr@_1WkIs!n zPn_$>tf3l?oB71g;dpM@3k?B8dT7BQyDGasFBv3mlu5eIh%U@>ly<27K*jsmt2RAc z3uo3ldrCUFcCgU);5{Pu<w+Y72;RL>f$G<cEY>CN3h{@_<Il$AqV=V1n`4iu3TYPf zYn40Fx8T(=8W#(I_+@gIiP+>T_1m-Q=$_x$^T7EtTao9zS>J1pL=a&!roH)e34a>g z+mV^AJ%!JIxfa6lEM=ZliSF;DYm|Zd4HTk#-i?pyZp2-^^gwA|W|-;A=`V<Leue?_ z*%Irh;u;^S25Foh+PC-wJg(!m9hMwuPZ(isYb%--S{Hg5(cS8Dsie6{>ahY&YsW>x zhrowgfiiwh1y?igpP2BGe2`jd^d`oM_<rWqE<VUn*l4c>r&Z`DaeF(IBKkA}D^WHh z%KLCe^N(^T$2R-MkRxGL7s#cS1evC<>aQ}cDNt=qiXr4(p==MIG)hzM1t1^cc}K6F zCMAU&a%pQIenRs&RkW)w9b{aoEvCyFBjXbOF{?Qcl0x4Le!Dfff$D}ON^a^6tc*Ks zQEhu{;7LOLFf_1A?op!xifg6l*d;}C8f3~$3>JKr6$e*&o~=tczy%sG1aciXDA-cH z3yawp8Z+H<FCKFPhi_AjE{J9jT@MJzUY7D)d(vLMBoWGW<%}XraZc#^M`xkY6f~gs z|A%WoAK#`rwohj=va{nLk!QYij2>vLKq3KHvV^}xS7LgCa`z>imZhThRcxIV<mjSO z?Nuksv7#;(Hk>oZ!|1aBG}{R_@tfS@Qm|SSz?HA|9FPT-R|15#+$vRkg*#uAM7NC2 ze?O^%n-QH||6=lWv+2sS<_qrMJeuLE;Lz&AfGwRo1#TwOXIw_;(#vU#N>DUpYw;@F zNZ`vhu8on$%DxRw6f@1U$t2rWRI7!q9*W#}w&#`y^wH0aP4DSKZy6Tr=7y5B&!~Rw z{7g5f$f)ip*3!tTj6sXF`0Doh8(hT-UB$37AbCXliz9~5<Ql-w^2ift+X*)VIx6vZ zFzqSUCAa_}v4=E9&%}Hx1SkS6><6>?Y3;wh@0lJ&GRgy7oBK`KBcvpM{6K>08S7SG IyM6Ef06h47%K!iX literal 0 HcmV?d00001 diff --git a/public/stylesheets/images/nav_icon.png b/public/stylesheets/images/nav_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2c824efaf9e15fff386cc3d72acacdfbd14491a7 GIT binary patch literal 3204 zcmbVP2~bm67L8>$q9foSEnq}KASyN_gg}r$Kp`wKvTxdm7?J=1vXFcTn>!AmvPD1< z!40HQAk8jov}F-+U<eMfgR*D@p+R;8=7XYk)z~#Pzf$$zfB)Wd?|bLo^M0aitu3Us z?A!u@K%|J41bguA27zpFl#~ER=9{&I;7t)QI|?|kJOLh=LxUWmvOH)oB7^Kjv!{`% z!T$9$LkMIeobGrOIBInSM`1CL<W(DF5Q7bRLm-C6L2NR`mj=K*XkK(C9zI?!gv01m zJlsXsO3R9EO7o^$hHz*OA=ZwR5MPQu6>e+<GYrCk01O&Hh6OSFm|R>C9=?W)1IMe= zC^&4*1n|YfKP7e4$`)qI;?Q8aNQ@>$3yp?hu}HLzE*6W{fN5)?wNYB&537mR!Rcag z+Iq0h7aWYnp?c!%3Fe<;flqk2Hvq74C=`#!L-H_47RL*P*4Nix#n9H)1T8eV!AyW0 zq{-x}t|Jg=TndNI2Iwp%Y!#90!3qHIa4^$POJK0Sz%sd?w+Y-ZR1lesLL;?Sm$YtZ zW%bvl48|90E?`gln(u!F<~jzmX()RdmleRFfW&#Ku7+acOgS_%z~VTvSbpofXzR@a zSX^%w8)oW&h3#{pGpQ^dSAEUi$_hthase`vLL(CJa1a4Wr&Dnl0s*a$*2U^*W6)@{ zneG8CjE;$p83s$x(l*2B6V`nREJ^@_#st=Vsb78dzU#YM3Jf+FnLy*v18G!q4vPU> zTQZLR{akdui}%@=`u$vVzw3(vlR>Q#`wh|SQ(*P14!@Kw`0%ChX-u%%Ibc~sN<FVa zAd+)L!Xd|?&e2p?KRKse5jLd1Z#&1yy6wDyvfoD|njkr`^VA=*MG9I!Oh4K8tAef% z;R&>wkTp@`U4ftT(0R9Ub99u7-S&sIq#x{U(~BYz`|j@e?Vx&L#>fh=>|m`|a7{eg zgdCei7+?40&2(WfUQJDD>LfK;iPsrh#g-O0n3C8QA}%T_T0U7xjZSY$?#XW5>5wA~ z7-?(o9TeZv%j~Wd3UYj}xP}B*PrH!XMpEc)uRN991t0!)Nz$e~8n=?JE}mYHSWeW4 z)6p*wh=LPwg1l`AH_}``_HY)HGc46ndw>*{z^^i2vDv`{!VZZz7f-UGZm)JIp`KyQ z<HyExt<;D0^vnJ4D74p7UlCtZ`f7izn;MS%FmU^Aah~BOgnGlrM~6f07?j{@S;x%1 z|Aggoqz_%x7zzjxZN;_hphCI+a5rUGuRu|*F$y@9ACx&GyNER}gD3h7_;_7l(COEn zvjaO^fNtlG-SI%}DgX58Ke9{gtaDS%`nKMlo_2Ie9|H{D`?!bY9gmk_P^xO)6umby ziX%Km2ObQ&DZ+%o&UIb4nHUN_ZR0Y+9BGrQihGW&G401TM4%Vb6Ob9D>d|v|52E5c zdTPV20Y9H6Jx=jK-Q_cD>dK;r{43Od8h;tFG*G5)GLh$}>h2*2Nmo@8p9Ru4isGeL zd8pJ1XM_ej^PiCy5V3Y5Oo4qqc9VeN-hTSx?0!+J17hA{^3mW><nPJ}6)MU5^lk0i za;CO*>`8v`RED&${Z-ybcjg&NKGoqF<A8X3;E#>Xd^)bmFnw--9}4vBCl**+gh+^! zcGM^17{`)cFRJmxIEMfM5rz*HCpp(2!!02bZ&=TzmW?X%-xEK?r)2=7ltI5#p4XO% zz)o4W`@a}x6Vyqu3rb>jemw4D+MqP?7DnijPnbLx6Z<0IaEc^iNw5A$>gmcP4}%Iz z&XEG!%+$T5b`i}j`0%GBOR)i>HK0?Me=o!%TSTAUxe_NrirZ+>Y2hWRU=9X_g`E@g ze56IMdHoMw^F)45(??T&u(i~%MY>lLs)?L#J;{1Z%p-Ch440psUqr}{^j(K{9QP4D z#csT*-l3X|n72>)@%&sh7H!G2M4u51ZmE~9SF1nWc|wG7xaeXL_TG)(h!D2+C#Dr# z;ZcTy^+T3+)F*aE{sTCO6KxP%ZUQNZi}^~)8b51OU*CUAnbNAu3QN8DX<z73k!OX4 zQU$%j!p3AbY2iJ8_Uipg)nk|5b&~{+d9gdkGe?od&DTm00_b>MnPu}iU~%h#F1P-S z<#4wiyr(<sRw?yk))=Q8fy(+Q+T#%`UCd3DF1dVpMzv11gwY%SXm~NH`hHXH?d1yR zq+bN`cA-z$$(|LNV4udPEr%a#$?ppL<ITUMHFHx9dn*hdb~?uH9yNQ=736kAmlL$P zd4K)oz}xpSn>CiQdcwH<?1qcRsjd{ySg2ulyM;Yc=Y)H?qoS$SOXZ_2Wd=Fy#)dXy z{w$xLbJ#rI=y&C}Bh3{hyOhf;oGi^%PAR<Ue?ob2aIbl?b-SsI@9}u^gtX}2?=6{1 z_fd2#mB-3DZeB46=`qsYw6J{R{1p3n+|7~L!p0igJ<>C~ZK}?vMozJh_rGk`G>F~R z_{c;sDwQI$d%}V-E09;k6M9Z?k}pBGb)?YTRuX4~-7T(a1Mz7~iElm549+Ws=AW1- zh`BKKHmsylLM%RZvhea_VQ2{Egk0%V{qDT1g2tSO#*UZ%UH6+P6FRP<wlSO8wSD17 zmqKar;^ZD8UgUsrp1k4i+Yy@mGP?`9d`Ht*=^YkolMoo{<eL)erGmeniO^eAwJF>x zENS~GKbN8A;HUXkvtH3sxnZf+*J)S(MfVjQC=M5~bhk^IC!@pHpK}j)OgKN~cO&qP zrO^!OE<RnOulVP^sMEY@xmNaa+-bhDR`0bAguCckS^4r6bmsNaM2Z!yMiP^+5ms~0 zq)l<}NLvh)vdr(aaeZmWo8cw^u`WeE@{yGX@-u`M(85vSjBC2~Plk7&m#005TamX) z@g6>+kTO<OOhOXMUY?r8{8IF=q1C^{bn?QWIuRqXVaHR`215pVJjtX%`f#->FTcv1 z-)^q3m;edo%pIOg9qh8ts@ytjAc~3s76&0+5Nw0KO*`w(_Wg5@Fx~s-okSU;+3T`u zE_%=o)miUE*ZZ$~A}Tv&s*6_wq0f@1S`p(uDMw2Dg-(-3XE*a{e5rlSJ;WBHR*%fV zGPw_W#NyiqC5Rr>`x(x1+gYFfO1_{a71SF4P9sWJecih#Zfd&Hzvr*6soz>FebZ`d z2h&$|T<uPo8nBnABplKrgr&~;HY*VdheIw561}>YwRngdSD%s3T#&NvyR3|RDwWYI zL*Y!Sgq2#m#>{;r%E&Ue-7*&I(!)1J2@Zw8C!=00hYbf0EENvj(`oFm4)%nO%eS0* zapKVdlW&Cp?D|jIye`x+pM@eq<5|s;cm|1D%of)uCb?!eIwe$0@9IveTe@NfJk;Th z4IjhJ{wi;Y6V^tGoyD-Z9=mf7uJ}3?E<v2{=vRf{govTnl3x_(le}1f;npMkUsCkf z`}Z00yNg;62_8%9O1PdE_>u5uF8)`n^~3E?N~*GJWwRE<aM4Tq=hO|n)&B)VGiySw I$;tEo0ft7HLjV8( literal 0 HcmV?d00001 diff --git a/public/stylesheets/public_new.css b/public/stylesheets/public_new.css index 684213f20..8d8186204 100644 --- a/public/stylesheets/public_new.css +++ b/public/stylesheets/public_new.css @@ -445,34 +445,52 @@ div.ke-statusbar{height:1px; border-top:none;} /*a.f_grey {color:#666666;}*/ /*a.f_grey:hover {color:#000000;}*/ /*资源库*/ -.resources {width:730px; background-color:#ffffff; padding:10px;float: right} +.resources {width:728px; background-color:#ffffff; padding:10px; border:1px solid #dddddd;float: right} +/*.resources {width:730px; background-color:#ffffff; padding:10px;float: right}*/ .resourcesBanner {width:730px; height:40px; background-color:#eaeaea; margin-bottom:10px;} .bannerName {background:#64bdd9; color:#ffffff; height:40px; line-height:40px; width:90px; text-align:center; font-weight:normal; vertical-align:middle; font-size: 16px; float:left;} -.resourcesSelect {width:40px; height:40px; float:right; position:relative;} -.resourcesSelected {width:25px; height:20px;} -.resourcesIcon {margin-top:15px; display:block; position:relative; background:url(images/resource_icon_list.png) 0px 0px no-repeat; width:25px; height:20px;} -.resourcesIcon:hover { background:url(images/resource_icon_list.png) 0px -25px no-repeat;} -.resourcesType {width:50px; background-color:#ffffff; float:left; list-style:none; position:absolute; border:1px solid #eaeaea; border-radius:5px; top:35px; padding:5px 10px; left:-30px; font-size:12px; color:#888888; display:none;} +.resourcesSelect {width:30px; height:34px; float:right; position:relative; margin-top:-6px;} +.resourcesSelected {width:25px; height:20px; position:relative; background:url(images/resource_icon_list.png) 0px 0px no-repeat;} +.resourcesSelected:hover { background:url(images/resource_icon_list.png) 0px -25px no-repeat;} +.resourcesIcon {margin-top:15px; display:block; width:25px; height:20px;} +/*.resourcesIcon {margin-top:15px; display:block; position:relative; background:url(images/resource_icon_list.png) 0px 0px no-repeat; width:25px; height:20px;}*/ +/*.resourcesIcon:hover { background:url(images/resource_icon_list.png) 0px -25px no-repeat;}*/ +/*.resourcesType {width:50px; background-color:#ffffff; float:left; list-style:none; position:absolute; border:1px solid #eaeaea; border-radius:5px; top:35px; padding:5px 10px; left:-30px; font-size:12px; color:#888888; display:none;}*/ a.resourcesGrey {font-size:12px; color:#888888;} a.resourcesGrey:hover {font-size:12px; color:#15bccf;} .resourcesBanner ul li:hover ul.resourcesType {display:block;} ul li:hover ul {display:block;} .resourcesUploadBox {float:right; width:103px; height:34px; background-color:#64bdd9; line-height:34px; vertical-align:middle; text-align:center; margin-left:12px;} +.resourcesUploadBox:hover {background-color:#0781b4;} .uploadIcon {background:url(images/resource_icon_list.png) -35px 10px no-repeat; float:left; display:block; width:30px; height:30px; margin-left:-3px;} a.uploadText {color:#ffffff; font-size:14px;} -.resourcesSearchloadBox {border:1px solid #e6e6e6; width:225px; float:right; background-color:#ffffff;} +.resourcesSearchloadBox {border:1px solid #e6e6e6; width:225px; float:left; background-color:#ffffff;} .searchResource {border:none; outline:none; background-color:#ffffff; width:184px; height:32px; padding-left:10px; display:block; float:left;} .searchIcon{width:31px; height:32px; background-color:#ffffff; background:url(images/resource_icon_list.png) -40px -15px no-repeat; display:block; float:left;} -.resourcesSearchBanner {height:34px; margin-bottom:10px;} -.resourcesListTab {width:730px; height:40px; background-color:#f6f6f6; border-bottom:1px solid #eaeaea; font-size:14px; color:#7a7a7a;} -.resourcesListName {width:175px; height:40px; line-height:40px; text-align:center;} -.resourcesListSize {width:110px; height:40px; line-height:40px; text-align:center;} +/*.resourcesSearchBanner {height:34px; margin-bottom:10px;}*/ +.resourcesSearchBanner {width:710px; height:34px; margin-bottom:10px; margin-top:15px; margin-left:auto; margin-right:auto;} +/*.resourcesListTab {width:730px; height:40px; background-color:#f6f6f6; border-bottom:1px solid #eaeaea; font-size:14px; color:#7a7a7a;}*/ +.resourcesListTab {width:710px; height:40px; background-color:#f6f6f6; border-bottom:1px solid #eaeaea; font-size:14px; color:#7a7a7a; margin-left:auto; margin-right:auto;} +/*.resourcesListName {width:175px; height:40px; line-height:40px; text-align:center;}*/ +/*.resourcesListSize {width:110px; height:40px; line-height:40px; text-align:center;}*/ +/*.resourcesListType {width:150px; height:40px; line-height:40px; text-align:center;}*/ +/*.resourcesListUploader {width:130px; height:40px; line-height:40px; text-align:center;}*/ +/*.resourcesListTime {width:165px; height:40px; line-height:40px; text-align:center;}*/ +.resourcesListName {width:160px; height:40px; line-height:40px; text-align:left;} +.resourcesListSize {width:105px; height:40px; line-height:40px; text-align:center;} .resourcesListType {width:150px; height:40px; line-height:40px; text-align:center;} -.resourcesListUploader {width:130px; height:40px; line-height:40px; text-align:center;} -.resourcesListTime {width:165px; height:40px; line-height:40px; text-align:center;} -.resourcesList {width:730px; height:39px; background-color:#ffffff; border-bottom:1px dashed #eaeaea; color:#9a9a9a; font-size:12px;} +.resourcesListUploader {width:180px; height:40px; line-height:40px; text-align:center;} +.resourcesListTime {width:95px; height:40px; line-height:40px; text-align:center;} +/*.resourcesList {width:730px; height:39px; background-color:#ffffff; border-bottom:1px dashed #eaeaea; color:#9a9a9a; font-size:12px;}*/ a.resourcesBlack {font-size:12px; color:#4c4c4c;white-space: nowrap;text-align: left} a.resourcesBlack:hover {font-size:12px; color:#000000;} +.resourcesListCheckbox {width:20px; height:40px; line-height:40px; text-align:center; vertical-align:middle;} +.resourcesCheckbox {padding:0px; margin:0px; margin-top:14px; width:12px; height:12px;} +.resourcesList {width:710px; height:39px; background-color:#ffffff; border-bottom:1px dashed #eaeaea; color:#9a9a9a; font-size:12px; margin-left:auto; margin-right:auto;} +.resourcesListOption {width:710px; height:40px; line-height:40px; vertical-align:middle; margin-left:auto; margin-right:auto; background-color:#f6f6f6;} +.resourcesCheckAll {width:20px; height:40px; line-height:40px; text-align:center; vertical-align:middle; float:left;} +.resourcesSelectSend {float:right;} +.resourcesSelectSendButton {width:75px; height:28px; background-color:#ffffff; line-height:28px; vertical-align:middle; margin-top:5px; margin-right:10px; margin-left:15px; text-align:center; border:1px solid #15bccf; border-radius:5px; float:right;} .dropdown-menu { position: absolute; top: 100%; @@ -508,12 +526,26 @@ a.resourcesBlack:hover {font-size:12px; color:#000000;} background-color: #64bdd9; outline:none; } +.homepageRightBanner {width:720px; height:34px; margin:0px auto; border-bottom:1px solid #e9e9e9;} +.NewsBannerName {font-size:16px; color:#4b4b4b; display:block; background:url(images/homepage_icon.png) -18px -230px no-repeat; width:150px; float:left; padding-left:15px; margin-top:4px;} +a.resourcesTypeAll {background:url(images/homepage_icon.png) -180px -89px no-repeat; padding-left:23px;} +a.resourcesTypeAtt {background:url(images/homepage_icon.png) -180px -49px no-repeat; padding-left:23px;} +.resourcesType {width:75px; background-color:#ffffff; float:left; list-style:none; position:absolute; border:1px solid #eaeaea; border-radius:5px; top:15px; padding:10px 20px; left:-90px; font-size:12px; color:#888888; display:none; line-height:2;} +.resourcesUploadBox {float:right; width:103px; height:34px; background-color:#64bdd9; line-height:34px; vertical-align:middle; text-align:center; margin-left:12px;} +.resourcesUploadBox:hover {background-color:#0781b4;} +/* 个人主页右边部分*/ +.homepageSearchIcon {width:30px; height:32px; background:url(images/nav_icon.png) -8px 3px no-repeat; float:left;} +a.homepagePostTypeQuiz {background:url(images/homepage_icon.png) -90px -124px no-repeat; padding-left:23px;} +a.homepagePostTypeAssignment {background:url(images/homepage_icon.png) -93px -318px no-repeat; padding-left:23px;} +a.replyGrey {color:#888888; display:inline-block;} +a.replyGrey:hover {color:#4b4b4b;} /*上传资源弹窗*/ .resourceUploadPopup {width:400px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-200px; z-index:1000;} .uploadDialogText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:140px; display:inline-block;} .uploadBoxContainer {height:33px; line-height:33px; margin-top:10px; position:relative} .uploadBox {width:100px; height:33px; line-height:33px; text-align:center; vertical-align:middle; background-color:#64bdd9; border-radius:3px; float:left; margin-right:12px;} +a.uploadBoxIcon {background:url(images/resource_icon_list.png) -35px 10px no-repeat; float:left; display:block; width:81px; height:30px; padding-left:22px; font-size:14px; color:#ffffff;} a.uploadIcon {background:url(images/resource_icon_list.png) 8px -60px no-repeat; width:100px; height:33px;} .chooseFile {color:#ffffff; display:block; margin-left:32px;} .uploadResourceIntr {width:250px; height:33px; float:left; line-height:33px; font-size:12px;} @@ -524,8 +556,9 @@ a.uploadIcon {background:url(images/resource_icon_list.png) 8px -60px no-repeat; /*发送资源弹窗*/ /*.resourceShareContainer {width:100%; height:100%; background:#666; filter:alpha(opacity=50); opacity:0.5; -moz-opacity:0.5; position:absolute; left:0; top:0; z-index:-999;}*/ +/*.resourceSharePopup {width:300px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-150px; z-index:1000;}*/ .resourceSharePopup {width:300px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-150px; z-index:1000;} -.sendText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:140px; display:inline-block;} +.sendText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:100px; display:inline-block;} .resourcePopupClose {width:20px; height:20px; display:inline-block; float:right;} .resourceClose {background:url(images/resource_icon_list.png) 0px -40px no-repeat; width:20px; height:20px; display:inline-block;} .resourcesSearchBox {border:1px solid #e6e6e6; width:225px; height:25px; background-color:#ffffff; margin-top:12px; margin-bottom:15px;} @@ -538,5 +571,7 @@ a.uploadIcon {background:url(images/resource_icon_list.png) 8px -60px no-repeat; .courseSendCancel {width:50px; height:25px; line-height:25px; text-align:center; vertical-align:middle; background-color:#c1c1c1; float:left} a.sendSourceText {font-size:14px; color:#ffffff;} input.sendSourceText {font-size:14px;color:#ffffff;background-color:#64bdd9;} +.resourcesSendTo {float:left; height:20px; margin-top:15px;} +.resourcesSendType {border:1px solid #e6e6e6; width:60px; height:24px; outline:none; font-size:14px; color:#888888;} From 76c2c47adf5107dc067f3fa14aebb17dbdacd96f Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Thu, 20 Aug 2015 10:14:26 +0800 Subject: [PATCH 14/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 42 +++++++++++++++- ..._resource_share_for_project_popup.html.erb | 48 +++++++++++++++++++ .../users/_resource_share_popup.html.erb | 8 ++-- .../users/add_exist_file_to_course.js.erb | 1 + .../users/add_exist_file_to_project.js.erb | 2 + app/views/users/search_user_project.js.erb | 11 +++++ app/views/users/user_resource.html.erb | 43 +++++++++++++++-- config/routes.rb | 2 + 8 files changed, 147 insertions(+), 10 deletions(-) create mode 100644 app/views/users/_resource_share_for_project_popup.html.erb create mode 100644 app/views/users/add_exist_file_to_project.js.erb create mode 100644 app/views/users/search_user_project.js.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index e4109e5bb..76ce9efaf 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -43,7 +43,8 @@ class UsersController < ApplicationController :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, :activity_new_score_index, :influence_new_score_index, :score_new_index,:update_score,:user_activities,:user_projects_index, :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist, - :user_resource,:user_resource_create,:user_resource_delete,:rename_resource,:search_user_course,:add_exist_file_to_course,:resource_preview,:resource_search] + :user_resource,:user_resource_create,:user_resource_delete,:rename_resource,:search_user_course,:add_exist_file_to_course, + :search_user_project,:resource_preview,:resource_search,:add_exist_file_to_project] #edit has been deleted by huang, 2013-9-23 before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses, :user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, @@ -878,6 +879,20 @@ class UsersController < ApplicationController end end + # 根据id或者名称搜索当前用户所在的项目 + def search_user_project + @user = User.current + if !params[:search].nil? + @projects = @user.projects.where(" #{Project.table_name}.id = #{params[:search].to_i } or #{Project.table_name}.name like '%#{params[:search.to_s]}%'") + else + @projects = @user.projects + end + @send_id = params[:send_id] + respond_to do |format| + format.js + end + end + # 将资源发送到对应的课程 def add_exist_file_to_course send_id = params[:send_id] @@ -903,6 +918,31 @@ class UsersController < ApplicationController end end + # 添加资源到对应的项目 + def add_exist_file_to_project + send_id = params[:send_id] + project_ids = params[:projects_ids] + ori = Attachment.find_by_id(send_id) + unless project_ids.nil? + project_ids.each do |project_id| + next if ori.blank? + attach_copied_obj = ori.copy + attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 + attach_copied_obj.container = Project.find(project_id) + attach_copied_obj.created_on = Time.now + attach_copied_obj.author_id = User.current.id + if attach_copied_obj.attachtype == nil + attach_copied_obj.attachtype = 1 + end + attach_copied_obj.save + end + end + + respond_to do |format| + format.js + end + end + # 资源预览 def resource_preview preview_id = params[:resource_id] diff --git a/app/views/users/_resource_share_for_project_popup.html.erb b/app/views/users/_resource_share_for_project_popup.html.erb new file mode 100644 index 000000000..70191e5f3 --- /dev/null +++ b/app/views/users/_resource_share_for_project_popup.html.erb @@ -0,0 +1,48 @@ + + +<div class="resourceSharePopup"> + <div> + <div class="sendText fl">将资源发送至</div> + <div class="resourcesSendTo"> + <select class="resourcesSendType" onclick="chooseSendType();"> + <option value="1">课程</option> + <option value="2" selected>项目</option> + </select> + </div> + </div> + <div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div> + <div class="fl"> + <%= form_tag search_user_project_user_path(user),:method => 'get', + :remote=>true,:id=>'search_user_project_form',:class=>'resourcesSearchBox' do %> + <%= hidden_field_tag(:send_id, @send_id) %> + <input type="text" name="search" placeholder="输入项目ID或者名称搜索" class="searchResourcePopup" /> + <!--<a href="javascript:void(0);" class="searchIconPopup"></a>--> + <%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %> + <% end %> + </div> + <%= form_tag add_exist_file_to_project_user_path(user),:remote=>true,:id=>'projects_list_form' %> + <div> + + <%= hidden_field_tag(:send_id, @send_id) %> + <% if !projects.empty? %> + <% projects.each do |project| %> + <ul class="courseSend fl"> + <li class="fl"> + <input name="projects_ids[]" type="checkbox" value="<%= project.id %>" class="courseSendCheckbox"/> + </li> + <li class="sendCourseName fl"><%= truncate( project.name,:length=>18)%></li> + </ul> + <% end %> + + </div> + <div> + <div class="courseSendSubmit"> + <!--<a href="javascript:void(0);" class="sendSourceText">确定</a>--> + <%= submit_tag '确定',:class=>'sendSourceText',:onfocus=>'this.blur();' %> + </div> + <div class="courseSendCancel"><a href="javascript:void(0);" class="sendSourceText" onclick="closeModal();">取消</a></div> + </div> + <div class="cl"></div> + <% end %> +</div> + diff --git a/app/views/users/_resource_share_popup.html.erb b/app/views/users/_resource_share_popup.html.erb index cad94056c..ca85cf262 100644 --- a/app/views/users/_resource_share_popup.html.erb +++ b/app/views/users/_resource_share_popup.html.erb @@ -4,9 +4,9 @@ <div> <div class="sendText fl">将资源发送至</div> <div class="resourcesSendTo"> - <select class="resourcesSendType"> - <option value="课程">课程</option> - <option value="项目">项目</option> + <select class="resourcesSendType" onclick="chooseSendType();"> + <option value="1">课程</option> + <option value="2">项目</option> </select> </div> </div> @@ -30,7 +30,7 @@ <li class="fl"> <input name="course_ids[]" type="checkbox" value="<%= course.id %>" class="courseSendCheckbox"/> </li> - <li class="sendCourseName fl"><%= course.name%></li> + <li class="sendCourseName fl"><%= truncate(course.name,:length=>18)%></li> </ul> <% end %> diff --git a/app/views/users/add_exist_file_to_course.js.erb b/app/views/users/add_exist_file_to_course.js.erb index 903212798..c5b9f8fbe 100644 --- a/app/views/users/add_exist_file_to_course.js.erb +++ b/app/views/users/add_exist_file_to_course.js.erb @@ -1 +1,2 @@ +alert('发送成功') closeModal(); \ No newline at end of file diff --git a/app/views/users/add_exist_file_to_project.js.erb b/app/views/users/add_exist_file_to_project.js.erb new file mode 100644 index 000000000..6ed846821 --- /dev/null +++ b/app/views/users/add_exist_file_to_project.js.erb @@ -0,0 +1,2 @@ +alert('发送成功'); +closeModal(); \ No newline at end of file diff --git a/app/views/users/search_user_project.js.erb b/app/views/users/search_user_project.js.erb new file mode 100644 index 000000000..c22e4ad6d --- /dev/null +++ b/app/views/users/search_user_project.js.erb @@ -0,0 +1,11 @@ +var screenWidth = $(window).width(); +var screenHeight = $(window).height(); //当前浏览器窗口的 宽高 +var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度 +var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改 +var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改 +var popupHeight = $(".resourceSharePopup").outerHeight(true); +$(".resourceSharePopup").css("marginTop",-popupHeight/2); + +$("#upload_box").css('left',objLeft).css('top',objTop); +$("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_for_project_popup" ,:locals => {:projects=>@projects,:user=>@user})%>'); +$("#upload_box").css('display','block'); \ No newline at end of file diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 5867c463f..6938e389e 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -3,7 +3,11 @@ <%= stylesheet_link_tag 'project' %> <%= stylesheet_link_tag 'leftside' %> <%= javascript_include_tag 'attachments'%> - +<!--<script type="text/css">--> + <!--html,body{ overflow-y:scroll;}--> + <!--html,body{ overflow:scroll; min-height:101%;}--> + <!--html{ overflow:-moz-scrollbars-vertical;}--> +<!--</script>--> <script> function remote_get_resources(user_id,type){ @@ -117,6 +121,8 @@ //资源名称的链接 var res_link; var id; //资源id + var sendType; //发送到课程 1 发送到项目 2 + var lastSendType; //保存上次发送的发送类型 $(".resourcesList").mousedown(function(e) { //如果是右键的话 if (3 == e.which) { @@ -178,10 +184,17 @@ $(".resourcesList").click(function(e) { document.oncontextmenu = function() {return true;} line.children().css("background-color",'white'); id = line.children().last().html(); - $.ajax({ - type:'get', - url:'<%= search_user_course_user_path(@user)%>'+'?send_id='+id - }); + if (lastSendType === '1'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。 + $.ajax({ + type: 'get', + url: '<%= search_user_course_user_path(@user)%>' + '?send_id=' + id + }); + }else{ + $.ajax({ + type: 'get', + url: '<%= search_user_project_user_path(@user)%>' + '?send_id=' + id + }); + } } function preview(){ @@ -277,5 +290,25 @@ $(".resourcesList").click(function(e) { } } + function chooseSendType(){ + sendType = $(".resourcesSendType").val(); + if(sendType === lastSendType){ + return; + }else if(lastSendType != null){ //不是第一次点击的时候 + if(sendType === '1'){ + $.ajax({ + type:'get', + url:'<%= search_user_course_user_path(@user)%>'+'?send_id='+id + }); + }else{ + $.ajax({ + type:'get', + url:'<%= search_user_project_user_path(@user)%>'+'?send_id='+id + }); + } + } + lastSendType = sendType; + } + </script> diff --git a/config/routes.rb b/config/routes.rb index c77a1e892..1318a495e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -350,8 +350,10 @@ RedmineApp::Application.routes.draw do post "user_resource_delete" get "search_user_course" post "add_exist_file_to_course" + post "add_exist_file_to_project" get 'resource_preview' post 'rename_resource' + get 'search_user_project' # end end end From 107a5686d1cb522ea149f1ca4df8d4f6af4f400c Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Thu, 20 Aug 2015 11:37:32 +0800 Subject: [PATCH 15/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=85=A8?= =?UTF-8?q?=E9=80=89=E5=8F=8D=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_resources_list.html.erb | 2 +- app/views/users/user_resource.html.erb | 70 +++++++++++++++++++++++- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index b344c737d..7a18a037b 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -3,7 +3,7 @@ <% attachments.each do |attach| %> <ul class="resourcesList"> <li class="resourcesListCheckbox fl"> - <input name="checkbox1" type="checkbox" class="resourcesCheckbox" /> + <input name="checkbox1" type="checkbox" onclick="checkAllBox($(this));" class="resourcesCheckbox" /> </li> <li class="resourcesListName fl"> <!--<a href="javascript:void(0);" class="resourcesBlack"><%#=truncate(attach.filename,:length=>18)%></a>--> diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 6938e389e..1ead2447c 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -87,12 +87,12 @@ </div> <div class="resourcesListOption"> <div class="resourcesCheckAll"> - <input id="checkboxAll" type="checkbox" value="" class="resourcesCheckbox" /> + <input id="checkboxAll" type="checkbox" value="" class="resourcesCheckbox" /> </div> <a href="javascript:void(0);" class="replyGrey mr15">全选</a> <a href="javascript:void(0);" class="replyGrey">删除</a> <div class="resourcesSelectSend"> - <div class="fl">选择 <span class="c_red">10</span> 个资源</div> + <div class="fl">选择 <span class="c_red" id="res_count">0</span> 个资源</div> <div class="resourcesSelectSendButton"> <a href="javascript:void(0);" class="c_blue db">发送</a> </div> @@ -179,6 +179,72 @@ $(".resourcesList").click(function(e) { } line = null; }); + //只要有一个选中了就是true + function checkboxSelected(){ + selected = false; + $("#resources_list").find("input[name='checkbox1']").each(function(){ + if($(this).attr('checked') == true){ + selected = true; + } + }); + return selected; + } + //只有全选才是true + function checkboxAllSelected(){ + allSelected = true; + $("#resources_list").find("input[name='checkbox1']").each(function(){ + if($(this).attr('checked') == undefined){ + allSelected = false; + } + }); + return allSelected; + } + //只有全部不选才是true + function checkboxAllDeselected(){ + allDeselected = true; + $("#resources_list").find("input[name='checkbox1']").each(function(){ + if($(this).attr('checked') == 'checked'){ + allDeselected = false; + } + }); + return allDeselected; + } + //查看所有的checkbox状态,并且按情况更改$("#checkboxAll")的状态 + function checkAllBox(checkbox){ + //只有选中当前checkbox且这个时候所有的checkbox都被选中了,$("#checkboxAll")才是被选中状态,其余都是非选中状态 + if(checkbox.attr('checked') == 'checked' && checkboxAllSelected()){ + $("#checkboxAll").attr('checked',true); + }else{ + $("#checkboxAll").attr('checked',false); + } + $("#res_count").html(getCheckBoxSeletedCount()); + + } + //获取当前checkbox选中的数目 + function getCheckBoxSeletedCount(){ + var i = 0; + $("#resources_list").find("input[name='checkbox1']").each(function(){ + if($(this).attr('checked') == 'checked'){ + i ++; + } + }); + return i; + } + $("#checkboxAll").click(function(e){ + + if($(this).attr('checked')){ + $("#resources_list").find("input[name='checkbox1']").each(function(){ + $(this).attr('checked',true); + }); + $("#res_count").html('<%= @attachments.size%>'); + }else{ + $("#resources_list").find("input[name='checkbox1']").each(function(){ + $(this).attr('checked',false); + }); + $("#res_count").html(0); + } + }); + function show_send(){ $("#contextMenu").hide(); document.oncontextmenu = function() {return true;} From f97a55e16438e0408b2b5939fcc03b7bb42e97d2 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Thu, 20 Aug 2015 14:01:33 +0800 Subject: [PATCH 16/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 9 ++++- app/views/users/_resources_list.html.erb | 2 +- app/views/users/user_resource.html.erb | 47 +++++++++++++++++------- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 76ce9efaf..f62286973 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -823,9 +823,16 @@ class UsersController < ApplicationController end end - # 删除用户资源 + # 删除用户资源,分为批量删除 和 单个删除 def user_resource_delete + if params[:resource_id].present? Attachment.delete(params[:resource_id]) + elsif params[:checkbox1].present? + params[:checkbox1].each do |id| + Attachment.delete(id) + end + end + #@attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") if(params[:type].nil? || params[:type] == "1") #全部 if User.current.id.to_i == params[:id].to_i diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index 7a18a037b..62e819b43 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -3,7 +3,7 @@ <% attachments.each do |attach| %> <ul class="resourcesList"> <li class="resourcesListCheckbox fl"> - <input name="checkbox1" type="checkbox" onclick="checkAllBox($(this));" class="resourcesCheckbox" /> + <input name="checkbox1[]" type="checkbox" onclick="checkAllBox($(this));" value="<%= attach.id%>" class="resourcesCheckbox" /> </li> <li class="resourcesListName fl"> <!--<a href="javascript:void(0);" class="resourcesBlack"><%#=truncate(attach.filename,:length=>18)%></a>--> diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 1ead2447c..7b173409a 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -82,22 +82,26 @@ <li class="resourcesListTime fl">上传时间</li> </ul> </div> + <form id="resources_list_form"> <div id="resources_list" class="resourcesList"> + <%= render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments} %> + </div> <div class="resourcesListOption"> <div class="resourcesCheckAll"> - <input id="checkboxAll" type="checkbox" value="" class="resourcesCheckbox" /> + <input id="checkboxAll" type="checkbox" value="" onclick="all_select();" class="resourcesCheckbox" /> </div> - <a href="javascript:void(0);" class="replyGrey mr15">全选</a> - <a href="javascript:void(0);" class="replyGrey">删除</a> + <a href="javascript:void(0);" class="replyGrey mr15" onclick="all_select();">全选</a> + <a href="javascript:void(0);" class="replyGrey" onclick="batch_delete();">删除</a> <div class="resourcesSelectSend"> <div class="fl">选择 <span class="c_red" id="res_count">0</span> 个资源</div> <div class="resourcesSelectSendButton"> - <a href="javascript:void(0);" class="c_blue db">发送</a> + <a href="javascript:void(0);" class="c_blue db" onclick="batch_send();">发送</a> </div> </div> </div> + </form> </div> <div id="upload_box" style="display: none"> <%= render :partial => 'upload_resource' ,:locals => {:user=>@user}%> @@ -182,7 +186,7 @@ $(".resourcesList").click(function(e) { //只要有一个选中了就是true function checkboxSelected(){ selected = false; - $("#resources_list").find("input[name='checkbox1']").each(function(){ + $("#resources_list").find("input[name='checkbox1[]']").each(function(){ if($(this).attr('checked') == true){ selected = true; } @@ -192,7 +196,7 @@ $(".resourcesList").click(function(e) { //只有全选才是true function checkboxAllSelected(){ allSelected = true; - $("#resources_list").find("input[name='checkbox1']").each(function(){ + $("#resources_list").find("input[name='checkbox1[]']").each(function(){ if($(this).attr('checked') == undefined){ allSelected = false; } @@ -202,7 +206,7 @@ $(".resourcesList").click(function(e) { //只有全部不选才是true function checkboxAllDeselected(){ allDeselected = true; - $("#resources_list").find("input[name='checkbox1']").each(function(){ + $("#resources_list").find("input[name='checkbox1[]']").each(function(){ if($(this).attr('checked') == 'checked'){ allDeselected = false; } @@ -223,27 +227,42 @@ $(".resourcesList").click(function(e) { //获取当前checkbox选中的数目 function getCheckBoxSeletedCount(){ var i = 0; - $("#resources_list").find("input[name='checkbox1']").each(function(){ + $("#resources_list").find("input[name='checkbox1[]']").each(function(){ if($(this).attr('checked') == 'checked'){ i ++; } }); return i; } - $("#checkboxAll").click(function(e){ + //全选反选 + function all_select(){ - if($(this).attr('checked')){ - $("#resources_list").find("input[name='checkbox1']").each(function(){ + if($("#checkboxAll").attr('checked')){ + $("#resources_list").find("input[name='checkbox1[]']").each(function(){ $(this).attr('checked',true); }); - $("#res_count").html('<%= @attachments.size%>'); + $("#res_count").html(getCheckBoxSeletedCount()); }else{ - $("#resources_list").find("input[name='checkbox1']").each(function(){ + $("#resources_list").find("input[name='checkbox1[]']").each(function(){ $(this).attr('checked',false); }); $("#res_count").html(0); } - }); + } + //批量删除 + function batch_delete(){ + var data = $("#resources_list_form").serialize(); + if(data != "" && confirm('确认要删除这些资源吗?')) { + $.post( + '<%= user_resource_delete_user_path(@user)%>', + $("#resources_list_form").serialize(),//只会对选中的控件进行序列化提交 + function (data) { + + } + ); + } + + } function show_send(){ $("#contextMenu").hide(); From 7ddf6d1e7da973824c304a41ba3048a7aeb41a87 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Thu, 20 Aug 2015 16:05:58 +0800 Subject: [PATCH 17/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=A4=9A?= =?UTF-8?q?=E9=80=89=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 112 +++++++++++++----- ..._resource_share_for_project_popup.html.erb | 8 +- .../users/_resource_share_popup.html.erb | 8 +- app/views/users/search_user_course.js.erb | 2 +- app/views/users/search_user_project.js.erb | 2 +- app/views/users/user_resource.html.erb | 71 ++++++++--- public/stylesheets/public_new.css | 6 + 7 files changed, 151 insertions(+), 58 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index f62286973..3149b0fb4 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -880,7 +880,9 @@ class UsersController < ApplicationController @course = @user.courses .select { |course| @user.allowed_to?(:as_teacher,course)} end + #这里仅仅是传递需要发送的资源id @send_id = params[:send_id] + @send_ids = params[:checkbox1] || params[:send_ids] respond_to do |format| format.js end @@ -894,32 +896,57 @@ class UsersController < ApplicationController else @projects = @user.projects end + #这里仅仅是传递需要发送的资源id @send_id = params[:send_id] + @send_ids = params[:checkbox1] || params[:send_ids] #搜索的时候 和 直接 用表格提交的时候的send_ids respond_to do |format| format.js end end - # 将资源发送到对应的课程 + # 将资源发送到对应的课程,分为发送单个,或者批量发送 def add_exist_file_to_course - send_id = params[:send_id] - course_ids = params[:course_ids] - unless course_ids.nil? - course_ids.each do |id| - ori = Attachment.find_by_id(send_id) - next if ori.blank? - attach_copied_obj = ori.copy - attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 - attach_copied_obj.container = Course.find(id) - attach_copied_obj.created_on = Time.now - attach_copied_obj.author_id = User.current.id - if attach_copied_obj.attachtype == nil - attach_copied_obj.attachtype = 4 + if params[:send_id].present? + send_id = params[:send_id] + ori = Attachment.find_by_id(send_id) + course_ids = params[:course_ids] + unless course_ids.nil? + course_ids.each do |id| + next if ori.blank? + attach_copied_obj = ori.copy + attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 + attach_copied_obj.container = Course.find(id) + attach_copied_obj.created_on = Time.now + attach_copied_obj.author_id = User.current.id + if attach_copied_obj.attachtype == nil + attach_copied_obj.attachtype = 4 + end + attach_copied_obj.save + @save_message = attach_copied_obj.errors.full_messages end - attach_copied_obj.save - @save_message = attach_copied_obj.errors.full_messages + end + elsif params[:send_ids].present? + send_ids = params[:send_ids].split(" ") + send_ids.each do |send_id| + ori = Attachment.find_by_id(send_id) + course_ids = params[:course_ids] + unless course_ids.nil? + course_ids.each do |id| + next if ori.blank? + attach_copied_obj = ori.copy + attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 + attach_copied_obj.container = Course.find(id) + attach_copied_obj.created_on = Time.now + attach_copied_obj.author_id = User.current.id + if attach_copied_obj.attachtype == nil + attach_copied_obj.attachtype = 4 + end + attach_copied_obj.save + @save_message = attach_copied_obj.errors.full_messages + end + end + end end - end respond_to do |format| format.js end @@ -927,22 +954,45 @@ class UsersController < ApplicationController # 添加资源到对应的项目 def add_exist_file_to_project - send_id = params[:send_id] - project_ids = params[:projects_ids] - ori = Attachment.find_by_id(send_id) - unless project_ids.nil? - project_ids.each do |project_id| - next if ori.blank? - attach_copied_obj = ori.copy - attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 - attach_copied_obj.container = Project.find(project_id) - attach_copied_obj.created_on = Time.now - attach_copied_obj.author_id = User.current.id - if attach_copied_obj.attachtype == nil - attach_copied_obj.attachtype = 1 + if params[:send_id].present? + send_id = params[:send_id] + project_ids = params[:projects_ids] + ori = Attachment.find_by_id(send_id) + unless project_ids.nil? + project_ids.each do |project_id| + next if ori.blank? + attach_copied_obj = ori.copy + attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 + attach_copied_obj.container = Project.find(project_id) + attach_copied_obj.created_on = Time.now + attach_copied_obj.author_id = User.current.id + if attach_copied_obj.attachtype == nil + attach_copied_obj.attachtype = 1 + end + attach_copied_obj.save end - attach_copied_obj.save end + elsif params[:send_ids].present? + send_ids = params[:send_ids].split(" ") + send_ids.each do |send_id| + project_ids = params[:projects_ids] + ori = Attachment.find_by_id(send_id) + unless project_ids.nil? + project_ids.each do |project_id| + next if ori.blank? + attach_copied_obj = ori.copy + attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 + attach_copied_obj.container = Project.find(project_id) + attach_copied_obj.created_on = Time.now + attach_copied_obj.author_id = User.current.id + if attach_copied_obj.attachtype == nil + attach_copied_obj.attachtype = 1 + end + attach_copied_obj.save + end + end + end + else end respond_to do |format| diff --git a/app/views/users/_resource_share_for_project_popup.html.erb b/app/views/users/_resource_share_for_project_popup.html.erb index 70191e5f3..9cd744c9a 100644 --- a/app/views/users/_resource_share_for_project_popup.html.erb +++ b/app/views/users/_resource_share_for_project_popup.html.erb @@ -4,7 +4,7 @@ <div> <div class="sendText fl">将资源发送至</div> <div class="resourcesSendTo"> - <select class="resourcesSendType" onclick="chooseSendType();"> + <select class="resourcesSendType" onclick="chooseSendType('<%= send_id%>','<%= send_ids%>');"> <option value="1">课程</option> <option value="2" selected>项目</option> </select> @@ -14,7 +14,8 @@ <div class="fl"> <%= form_tag search_user_project_user_path(user),:method => 'get', :remote=>true,:id=>'search_user_project_form',:class=>'resourcesSearchBox' do %> - <%= hidden_field_tag(:send_id, @send_id) %> + <%= hidden_field_tag(:send_id, send_id) %> + <%= hidden_field_tag(:send_ids, send_ids) %> <input type="text" name="search" placeholder="输入项目ID或者名称搜索" class="searchResourcePopup" /> <!--<a href="javascript:void(0);" class="searchIconPopup"></a>--> <%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %> @@ -23,7 +24,8 @@ <%= form_tag add_exist_file_to_project_user_path(user),:remote=>true,:id=>'projects_list_form' %> <div> - <%= hidden_field_tag(:send_id, @send_id) %> + <%= hidden_field_tag(:send_id, send_id) %> + <%= hidden_field_tag(:send_ids, send_ids) %> <% if !projects.empty? %> <% projects.each do |project| %> <ul class="courseSend fl"> diff --git a/app/views/users/_resource_share_popup.html.erb b/app/views/users/_resource_share_popup.html.erb index ca85cf262..ea1ada447 100644 --- a/app/views/users/_resource_share_popup.html.erb +++ b/app/views/users/_resource_share_popup.html.erb @@ -4,7 +4,7 @@ <div> <div class="sendText fl">将资源发送至</div> <div class="resourcesSendTo"> - <select class="resourcesSendType" onclick="chooseSendType();"> + <select class="resourcesSendType" onclick="chooseSendType('<%= send_id%>','<%= send_ids%>');"> <option value="1">课程</option> <option value="2">项目</option> </select> @@ -14,7 +14,8 @@ <div class="fl"> <%= form_tag search_user_course_user_path(user),:method => 'get', :remote=>true,:id=>'search_user_course_form',:class=>'resourcesSearchBox' do %> - <%= hidden_field_tag(:send_id, @send_id) %> + <%= hidden_field_tag(:send_id, send_id) %> + <%= hidden_field_tag(:send_ids, send_ids) %> <input type="text" name="search" placeholder="输入课程ID或者名称搜索" class="searchResourcePopup" /> <!--<a href="javascript:void(0);" class="searchIconPopup"></a>--> <%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %> @@ -23,7 +24,8 @@ <%= form_tag add_exist_file_to_course_user_path(user),:remote=>true,:id=>'course_list_form' %> <div> - <%= hidden_field_tag(:send_id, @send_id) %> + <%= hidden_field_tag(:send_id, send_id) %> + <%= hidden_field_tag(:send_ids, send_ids) %> <% if !courses.empty? %> <% courses.each do |course| %> <ul class="courseSend fl"> diff --git a/app/views/users/search_user_course.js.erb b/app/views/users/search_user_course.js.erb index e3d4bb2d4..7d880da69 100644 --- a/app/views/users/search_user_course.js.erb +++ b/app/views/users/search_user_course.js.erb @@ -7,5 +7,5 @@ var popupHeight = $(".resourceSharePopup").outerHeight(true); $(".resourceSharePopup").css("marginTop",-popupHeight/2); $("#upload_box").css('left',objLeft).css('top',objTop); -$("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_popup" ,:locals => {:courses=>@course,:user=>@user})%>'); +$("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_popup" ,:locals => {:courses=>@course,:user=>@user,:send_id=>@send_id,:send_ids=>@send_ids})%>'); $("#upload_box").css('display','block'); \ No newline at end of file diff --git a/app/views/users/search_user_project.js.erb b/app/views/users/search_user_project.js.erb index c22e4ad6d..556534560 100644 --- a/app/views/users/search_user_project.js.erb +++ b/app/views/users/search_user_project.js.erb @@ -7,5 +7,5 @@ var popupHeight = $(".resourceSharePopup").outerHeight(true); $(".resourceSharePopup").css("marginTop",-popupHeight/2); $("#upload_box").css('left',objLeft).css('top',objTop); -$("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_for_project_popup" ,:locals => {:projects=>@projects,:user=>@user})%>'); +$("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_for_project_popup" ,:locals => {:projects=>@projects,:user=>@user,:send_id=>@send_id,:send_ids=>@send_ids})%>'); $("#upload_box").css('display','block'); \ No newline at end of file diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 7b173409a..9565f7e38 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -96,8 +96,8 @@ <a href="javascript:void(0);" class="replyGrey" onclick="batch_delete();">删除</a> <div class="resourcesSelectSend"> <div class="fl">选择 <span class="c_red" id="res_count">0</span> 个资源</div> - <div class="resourcesSelectSendButton"> - <a href="javascript:void(0);" class="c_blue db" onclick="batch_send();">发送</a> + <div class="resourcesSelectSendButton" onclick="batch_send();"> + <a href="javascript:void(0);" class="sendButtonBlue db" >发送</a> </div> </div> </div> @@ -261,9 +261,10 @@ $(".resourcesList").click(function(e) { } ); } - } + + function show_send(){ $("#contextMenu").hide(); document.oncontextmenu = function() {return true;} @@ -282,6 +283,20 @@ $(".resourcesList").click(function(e) { } } + function batch_send(){ + if (lastSendType === '1'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。 + $.ajax({ + type: 'get', + url: '<%= search_user_course_user_path(@user)%>' + '?'+ $("#resources_list_form").serialize() + }); + }else{ + $.ajax({ + type: 'get', + url: '<%= search_user_project_user_path(@user)%>' + '?' + $("#resources_list_form").serialize() + }); + } + } + function preview(){ $("#contextMenu").hide(); document.oncontextmenu = function() {return true;} @@ -375,23 +390,41 @@ $(".resourcesList").click(function(e) { } } - function chooseSendType(){ - sendType = $(".resourcesSendType").val(); - if(sendType === lastSendType){ - return; - }else if(lastSendType != null){ //不是第一次点击的时候 - if(sendType === '1'){ - $.ajax({ - type:'get', - url:'<%= search_user_course_user_path(@user)%>'+'?send_id='+id - }); - }else{ - $.ajax({ - type:'get', - url:'<%= search_user_project_user_path(@user)%>'+'?send_id='+id - }); + //id 发送的id + //发送的id数组 + function chooseSendType(res_id,res_ids){ + + sendType = $(".resourcesSendType").val(); + if (sendType === lastSendType) { + return; + } else if (lastSendType != null) { //不是第一次点击的时候 + if(res_ids == "") {//如果是单个发送 + if (sendType === '1') { + $.ajax({ + type: 'get', + url: '<%= search_user_course_user_path(@user)%>' + '?send_id=' + id + }); + } else { + $.ajax({ + type: 'get', + url: '<%= search_user_project_user_path(@user)%>' + '?send_id=' + id + }); + } + }else{//如果是多个发送 + if (sendType === '1'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。 + $.ajax({ + type: 'get', + url: '<%= search_user_course_user_path(@user)%>' + '?'+ $("#resources_list_form").serialize() + }); + }else{ + $.ajax({ + type: 'get', + url: '<%= search_user_project_user_path(@user)%>' + '?' + $("#resources_list_form").serialize() + }); + } + } } - } + lastSendType = sendType; } diff --git a/public/stylesheets/public_new.css b/public/stylesheets/public_new.css index 8d8186204..235526766 100644 --- a/public/stylesheets/public_new.css +++ b/public/stylesheets/public_new.css @@ -490,7 +490,13 @@ a.resourcesBlack:hover {font-size:12px; color:#000000;} .resourcesListOption {width:710px; height:40px; line-height:40px; vertical-align:middle; margin-left:auto; margin-right:auto; background-color:#f6f6f6;} .resourcesCheckAll {width:20px; height:40px; line-height:40px; text-align:center; vertical-align:middle; float:left;} .resourcesSelectSend {float:right;} +/*.resourcesSelectSendButton {width:75px; height:28px; background-color:#ffffff; line-height:28px; vertical-align:middle; margin-top:5px; margin-right:10px; margin-left:15px; text-align:center; border:1px solid #15bccf; border-radius:5px; float:right;}*/ .resourcesSelectSendButton {width:75px; height:28px; background-color:#ffffff; line-height:28px; vertical-align:middle; margin-top:5px; margin-right:10px; margin-left:15px; text-align:center; border:1px solid #15bccf; border-radius:5px; float:right;} +a.sendButtonBlue {color:#15bccf;} +a.sendButtonBlue:hover {color:#ffffff;} +.resourcesSelectSendButton:hover {background-color:#15bccf;} +.db {display:block;} + .dropdown-menu { position: absolute; top: 100%; From 0e8c1d1b66db1bedd930f40f5a5520c0db7a38d9 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Thu, 20 Aug 2015 17:00:54 +0800 Subject: [PATCH 18/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=88=86?= =?UTF-8?q?=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 12 ++++++++++++ app/views/users/search_user_course.js.erb | 12 ++++++------ app/views/users/search_user_project.js.erb | 12 ++++++------ app/views/users/user_resource.html.erb | 9 ++++++++- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 3149b0fb4..ddc7ec38d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1266,6 +1266,12 @@ class UsersController < ApplicationController end end @type = params[:type] + @limit = 10 + @obj_count = @attachments.count + @obj_pages = Paginator.new @obj_count, @limit, params['page'] || 1 + @offset ||= @obj_pages.offset + #@curse_attachments_all = @all_attachments[@offset, @limit] + @attachments = paginateHelper @attachments,10 respond_to do |format| format.js format.html {render :layout => 'base_users_new'} @@ -1308,6 +1314,12 @@ class UsersController < ApplicationController end end @type = params[:type] + @limit = 10 + @obj_count = @attachments.count + @obj_pages = Paginator.new @obj_count, @limit, params['page'] || 1 + @offset ||= @obj_pages.offset + #@curse_attachments_all = @all_attachments[@offset, @limit] + @attachments = paginateHelper @attachments,10 respond_to do |format| format.js end diff --git a/app/views/users/search_user_course.js.erb b/app/views/users/search_user_course.js.erb index 7d880da69..91002244a 100644 --- a/app/views/users/search_user_course.js.erb +++ b/app/views/users/search_user_course.js.erb @@ -1,11 +1,11 @@ -var screenWidth = $(window).width(); -var screenHeight = $(window).height(); //当前浏览器窗口的 宽高 -var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度 -var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改 -var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改 +//var screenWidth = $(window).width(); +//var screenHeight = $(window).height(); //当前浏览器窗口的 宽高 +//var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度 +//var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改 +//var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改 var popupHeight = $(".resourceSharePopup").outerHeight(true); $(".resourceSharePopup").css("marginTop",-popupHeight/2); -$("#upload_box").css('left',objLeft).css('top',objTop); +$("#upload_box").css('left','').css('top',''); $("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_popup" ,:locals => {:courses=>@course,:user=>@user,:send_id=>@send_id,:send_ids=>@send_ids})%>'); $("#upload_box").css('display','block'); \ No newline at end of file diff --git a/app/views/users/search_user_project.js.erb b/app/views/users/search_user_project.js.erb index 556534560..ee224970f 100644 --- a/app/views/users/search_user_project.js.erb +++ b/app/views/users/search_user_project.js.erb @@ -1,11 +1,11 @@ -var screenWidth = $(window).width(); -var screenHeight = $(window).height(); //当前浏览器窗口的 宽高 -var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度 -var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改 -var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改 +//var screenWidth = $(window).width(); +//var screenHeight = $(window).height(); //当前浏览器窗口的 宽高 +//var scrolltop = $(document).scrollTop();//获取当前窗口距离页面顶部高度 +//var objLeft = (screenWidth - 2)/2.5 ; //2 可以根据需要修改 +//var objTop = (screenHeight - 100)/2 + scrolltop; //100可以根据需要修改 var popupHeight = $(".resourceSharePopup").outerHeight(true); $(".resourceSharePopup").css("marginTop",-popupHeight/2); -$("#upload_box").css('left',objLeft).css('top',objTop); +$("#upload_box").css('left','').css('top',''); $("#upload_box").html('<%= escape_javascript( render :partial => "resource_share_for_project_popup" ,:locals => {:projects=>@projects,:user=>@user,:send_id=>@send_id,:send_ids=>@send_ids})%>'); $("#upload_box").css('display','block'); \ No newline at end of file diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 9565f7e38..20951471a 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -103,6 +103,10 @@ </div> </form> </div> +<ul class="wlist"> + <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => @is_remote, :flag => true%> +</ul> +<div class="cl"></div> <div id="upload_box" style="display: none"> <%= render :partial => 'upload_resource' ,:locals => {:user=>@user}%> </div> @@ -284,6 +288,9 @@ $(".resourcesList").click(function(e) { } function batch_send(){ + if($("#resources_list_form").serialize() == ""){ + return ; + } if (lastSendType === '1'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。 $.ajax({ type: 'get', @@ -411,7 +418,7 @@ $(".resourcesList").click(function(e) { }); } }else{//如果是多个发送 - if (sendType === '1'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。 + if (sendType === '1'){ $.ajax({ type: 'get', url: '<%= search_user_course_user_path(@user)%>' + '?'+ $("#resources_list_form").serialize() From 705d31b1d0cd8165137d2aeb2617e0f680c18576 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Thu, 20 Aug 2015 17:38:30 +0800 Subject: [PATCH 19/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 6 ++++-- app/views/users/_resource_search_form.html.erb | 2 +- app/views/users/_resources_list.html.erb | 3 ++- app/views/users/resource_search.js.erb | 3 ++- app/views/users/user_resource.html.erb | 8 +++++--- app/views/users/user_resource.js.erb | 3 ++- config/routes.rb | 2 +- 7 files changed, 17 insertions(+), 10 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index ddc7ec38d..b4cb04019 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1015,7 +1015,7 @@ class UsersController < ApplicationController # 重命名资源 def rename_resource - @attachment = Attachment.find(params[:res_id]) + @attachment = Attachment.find(params[:res_id]) if params[:res_id].present? if @attachment != nil @attachment.filename = params[:res_name] @flag = @attachment.save @@ -1260,13 +1260,14 @@ class UsersController < ApplicationController end elsif params[:type] == "4" #附件 if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") else @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") end end @type = params[:type] @limit = 10 + @is_remote = true @obj_count = @attachments.count @obj_pages = Paginator.new @obj_count, @limit, params['page'] || 1 @offset ||= @obj_pages.offset @@ -1315,6 +1316,7 @@ class UsersController < ApplicationController end @type = params[:type] @limit = 10 + @is_remote = true @obj_count = @attachments.count @obj_pages = Paginator.new @obj_count, @limit, params['page'] || 1 @offset ||= @obj_pages.offset diff --git a/app/views/users/_resource_search_form.html.erb b/app/views/users/_resource_search_form.html.erb index 5f854cba0..376007fec 100644 --- a/app/views/users/_resource_search_form.html.erb +++ b/app/views/users/_resource_search_form.html.erb @@ -1,5 +1,5 @@ <%= form_tag( url_for(:controller => 'users',:action => 'resource_search',:id=>user.id), - :remote=>true ,:method => 'post',:class=>'resourcesSearchloadBox',:id=>'resource_search_form') do %> + :remote=>true ,:method => 'get',:class=>'resourcesSearchloadBox',:id=>'resource_search_form') do %> <input type="text" name="search" placeholder="输入资源关键词进行搜索" class="searchResource" /> <%= hidden_field_tag(:type,type) %> <%= submit_tag '',:class=>'homepageSearchIcon',:onfocus=>'this.blur();',:style=>'border-style:none' %> diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index 62e819b43..0099ba40b 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -1,3 +1,4 @@ + <% if attachments.nil? || attachments.empty? %> <% else %> <% attachments.each do |attach| %> @@ -17,4 +18,4 @@ <li style="display: none"><%= attach.id %></li> </ul> <% end %> -<% end %> \ No newline at end of file +<% end %> diff --git a/app/views/users/resource_search.js.erb b/app/views/users/resource_search.js.erb index 69fc3dd43..1a7469f25 100644 --- a/app/views/users/resource_search.js.erb +++ b/app/views/users/resource_search.js.erb @@ -1 +1,2 @@ -$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); \ No newline at end of file +$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); +$("#pages").html('<%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => @is_remote, :flag => true %>'); \ No newline at end of file diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 20951471a..fad50d683 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -103,9 +103,11 @@ </div> </form> </div> -<ul class="wlist"> +<div> +<ul class="wlist" id="pages"> <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => @is_remote, :flag => true%> </ul> +</div> <div class="cl"></div> <div id="upload_box" style="display: none"> <%= render :partial => 'upload_resource' ,:locals => {:user=>@user}%> @@ -326,7 +328,7 @@ $(".resourcesList").click(function(e) { '<input name="res_name" id="res_name" ' + 'style="height: 2em;line-height: 2em;overflow: hidden;" onblur="restore();" ' + 'value="'+res_name+ - '"/> <input type="hidden" name="res_id" value="'+id+'"/>'+ + '"/> <input type="hidden" id ="res_id" name="res_id" value="'+id+'"/>'+ '<% end %>'); $("#res_name").focus(); $("html,body").animate({scrollTop:$("#res_name").offset().top},1000) @@ -355,7 +357,7 @@ $(".resourcesList").click(function(e) { if(confirm('确定修改为 '+name)){ $.post( '<%=rename_resource_user_path(@user) %>', - $("#res_name_form").serialize(), + "res_name="+$('#res_name').val()+"&res_id="+$("#res_id").val(), function (data){ if(data != 'fail'){//修改成功,那么将链接恢复,并且将链接的显示内容改变。链接可以不变 last_line.children().eq(1).html(res_link); diff --git a/app/views/users/user_resource.js.erb b/app/views/users/user_resource.js.erb index d69a769af..6eedb9cb6 100644 --- a/app/views/users/user_resource.js.erb +++ b/app/views/users/user_resource.js.erb @@ -1,2 +1,3 @@ $("#search_div").html('<%= escape_javascript( render :partial => 'resource_search_form',:locals => {:user=>@user,:type=>@type} ) %>'); -$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); \ No newline at end of file +$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); +$("#pages").html('<%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => @is_remote, :flag => true %>'); \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 1318a495e..0eeca43d9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -345,7 +345,7 @@ RedmineApp::Application.routes.draw do match 'code_submit_score_index', :to => 'projects#code_submit_score_index', :via => [:get, :post] match 'projects_topic_score_index', :to => 'projects#projects_topic_score_index', :via => [:get, :post] get "user_resource" - post "resource_search" + get "resource_search" post "user_resource_create" post "user_resource_delete" get "search_user_course" From 7deafac2802284ae99078d41d5e200f39d6d36ad Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 10:02:26 +0800 Subject: [PATCH 20/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 22 +++++++++++++--------- app/views/layouts/base_users_new.html.erb | 4 ++-- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index b4cb04019..76e287a43 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -838,7 +838,7 @@ class UsersController < ApplicationController if User.current.id.to_i == params[:id].to_i @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") else - user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个公开资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") @@ -1237,20 +1237,22 @@ class UsersController < ApplicationController # @user = User.find(params[:id]) if(params[:type].nil? || params[:type] == "1") #全部 if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+ + "or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") else - user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + - "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course'").order("created_on desc") + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ - "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "3" #项目资源 if User.current.id.to_i == params[:id].to_i @@ -1284,12 +1286,14 @@ class UsersController < ApplicationController search = params[:search].to_s.strip.downcase if(params[:type].nil? || params[:type] == "1") #全部 if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%') ").order("created_on desc") + user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 取交集并查询 + @attachments = Attachment.where("((author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+ + " or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')}))) and (filename like '%#{search}%') ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type in" + " ('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon'))"+ - " or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')})) )" + + " or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')})) )" + " and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "2" #课程资源 @@ -1298,7 +1302,7 @@ class UsersController < ApplicationController else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type = 'Course') "+ - "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')})) )"+ + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')})) )"+ " and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "3" #项目资源 diff --git a/app/views/layouts/base_users_new.html.erb b/app/views/layouts/base_users_new.html.erb index f9f065e2a..be75f53f1 100644 --- a/app/views/layouts/base_users_new.html.erb +++ b/app/views/layouts/base_users_new.html.erb @@ -149,7 +149,7 @@ <div class="subNav"> <a href="<%=url_for(:controller => 'users', :action => 'user_resource',:id=>@user.id,:type=>1)%>" class=" f14 c_blue02"> 我的资源库 - <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("author_id = #{@user.id} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").count%>)</span> + <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("(author_id = #{@user.id} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) or (container_type = 'Course' and container_id in (#{@user.courses.map{|c| c.id}.join(',')}))").count%>)</span> </a> </div> @@ -169,7 +169,7 @@ <div class="subNav"> <a href="<%=url_for(:controller => 'users', :action => 'user_resource',:id=>@user.id,:type=>1)%>" class=" f14 c_blue02"> TA的资源库 - <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("author_id = #{@user.id} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").count%>)</span> + <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("(author_id = #{@user.id} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) or (container_type = 'Course' and is_public = 1 and container_id in (#{@user.courses.visible.map{|c| c.id}.join(',')}))").count%>)</span> </a> </div> <% end %> From 3c6484269d999110a30df3d7ad7349ba26a465bc Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 10:14:04 +0800 Subject: [PATCH 21/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E5=88=A0=E9=99=A4=E4=B8=8A=E4=BC=A0=E8=80=85=E4=B8=BA?= =?UTF-8?q?=E8=87=AA=E5=B7=B1=E7=9A=84=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 78 ++++++++++++--------- app/views/users/user_resource_delete.js.erb | 3 +- 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 76e287a43..5d569e247 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -823,48 +823,56 @@ class UsersController < ApplicationController end end - # 删除用户资源,分为批量删除 和 单个删除 + # 删除用户资源,分为批量删除 和 单个删除,只能删除自己上传的资源 def user_resource_delete if params[:resource_id].present? - Attachment.delete(params[:resource_id]) + Attachment.where("author_id = #{User.current.id}").delete(params[:resource_id]) elsif params[:checkbox1].present? params[:checkbox1].each do |id| - Attachment.delete(id) + Attachment.where("author_id = #{User.current.id}").delete(id) end end - #@attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") - if(params[:type].nil? || params[:type] == "1") #全部 - if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") - else - user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个公开资源的课程是不是在 这个user的所有我可见的课程中 - @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + - "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + - "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") - end - elsif params[:type] == "2" #课程资源 - if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course'").order("created_on desc") - else - user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 - @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ - "or (container_type = 'Course' and is_public <> -1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") - end - elsif params[:type] == "3" #项目资源 - if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc") - else - @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc") - end - elsif params[:type] == "4" #附件 - if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") - else - @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") - end - end - @type = params[:type] + if(params[:type].nil? || params[:type] == "1") #全部 + if User.current.id.to_i == params[:id].to_i + user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+ + "or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + else + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源 + @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + end + elsif params[:type] == "2" #课程资源 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') ").order("created_on desc") + else + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + end + elsif params[:type] == "3" #项目资源 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc") + end + elsif params[:type] == "4" #附件 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + end + end + @type = params[:type] + @limit = 10 + @is_remote = true + @obj_count = @attachments.count + @obj_pages = Paginator.new @obj_count, @limit, params['page'] || 1 + @offset ||= @obj_pages.offset + #@curse_attachments_all = @all_attachments[@offset, @limit] + @attachments = paginateHelper @attachments,10 respond_to do |format| format.js end diff --git a/app/views/users/user_resource_delete.js.erb b/app/views/users/user_resource_delete.js.erb index 69fc3dd43..1a7469f25 100644 --- a/app/views/users/user_resource_delete.js.erb +++ b/app/views/users/user_resource_delete.js.erb @@ -1 +1,2 @@ -$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); \ No newline at end of file +$("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); +$("#pages").html('<%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => @is_remote, :flag => true %>'); \ No newline at end of file From cf243d47e5ba5d2581ec718913462bab234e47a4 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 10:28:29 +0800 Subject: [PATCH 22/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E5=88=A0=E9=99=A4=E4=B8=8A=E4=BC=A0=E8=80=85=E4=B8=BA?= =?UTF-8?q?=E8=87=AA=E5=B7=B1=E7=9A=84=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_resources_list.html.erb | 1 + app/views/users/user_resource.html.erb | 48 ++++++++++++++---------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index 0099ba40b..fd72c99e4 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -14,6 +14,7 @@ <li class="resourcesListSize fl"><%= number_to_human_size(attach.filesize) %></li> <li class="resourcesListType fl"><%= get_resource_type(attach.container_type)%></li> <li class="resourcesListUploader fl"><%=User.find(attach.author_id).realname %></li> + <li style="display: none"><%= attach.author_id %></li> <li class="resourcesListTime fl"><%= format_date(attach.created_on) %></li> <li style="display: none"><%= attach.id %></li> </ul> diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index fad50d683..19cfe2407 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -113,10 +113,10 @@ <%= render :partial => 'upload_resource' ,:locals => {:user=>@user}%> </div> <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu" id="contextMenu"> - <li><a tabindex="-1" href="#" onclick="preview();" onfocus="this.blur()">预览</a></li> - <li><a tabindex="-1" href="#" onclick="rename();" onfocus="this.blur()">重命名</a></li> - <li><a tabindex="-1" href="#" onclick="show_send();" onfocus="this.blur()" >发送</a></li> - <li><a tabindex="-1" href="#" onclick="delete_file();" onfocus="this.blur()">删除</a></li> + <li><a tabindex="-1" href="#" onclick="if(<%= User.current.logged?%>)preview();" onfocus="this.blur()">预览</a></li> + <li><a tabindex="-1" href="#" onclick="if(<%= User.current.logged?%>)rename();" onfocus="this.blur()">重命名</a></li> + <li><a tabindex="-1" href="#" onclick="if(<%= User.current.logged?%>)show_send();" onfocus="this.blur()" >发送</a></li> + <li><a tabindex="-1" href="#" onclick="if(<%= User.current.logged?%>)delete_file();" onfocus="this.blur()">删除</a></li> </ul> <script> @@ -322,16 +322,21 @@ $(".resourcesList").click(function(e) { document.oncontextmenu = function() {return true;} line.children().css("background-color",'white'); id = line.children().last().html(); - res_name = line.children().eq(1).children().attr('title'); - res_link = line.children().eq(1).html(); - line.children().eq(1).html('<%= form_tag(url_for(:controller => 'users',:action => 'rename_resource',:method => 'post',:remote=>true,:id=>@user.id),:id=>"res_name_form" ) do%>' + - '<input name="res_name" id="res_name" ' + - 'style="height: 2em;line-height: 2em;overflow: hidden;" onblur="restore();" ' + - 'value="'+res_name+ - '"/> <input type="hidden" id ="res_id" name="res_id" value="'+id+'"/>'+ - '<% end %>'); - $("#res_name").focus(); - $("html,body").animate({scrollTop:$("#res_name").offset().top},1000) + user_id = line.children().eq(5).html(); + if(user_id === '<%= User.current.id%>') { + res_name = line.children().eq(1).children().attr('title'); + res_link = line.children().eq(1).html(); + line.children().eq(1).html('<%= form_tag(url_for(:controller => 'users',:action => 'rename_resource',:method => 'post',:remote=>true,:id=>@user.id),:id=>"res_name_form" ) do%>' + + '<input name="res_name" id="res_name" ' + + 'style="height: 2em;line-height: 2em;overflow: hidden;" onblur="restore();" ' + + 'value="'+res_name+ + '"/> <input type="hidden" id ="res_id" name="res_id" value="'+id+'"/>'+ + '<% end %>'); + $("#res_name").focus(); + $("html,body").animate({scrollTop:$("#res_name").offset().top},1000) + }else{ + alert('您无法修改此资源!') + } } String.prototype.trim = function() { var str = this, @@ -391,11 +396,16 @@ $(".resourcesList").click(function(e) { } line.children().css("background-color", 'white'); id = line.children().last().html(); - if (confirm('确定要删除资源"' + line.children().eq(1).children().attr('title').trim() + '"么?')){ - $.ajax({ - type: 'post', - url: '<%= user_resource_delete_user_path(@user)%>' + '?resource_id=' + id+'&type='+$('#type').val() - }); + user_id = line.children().eq(5).html(); + if(user_id === '<%= User.current.id%>') { + if (confirm('确定要删除资源"' + line.children().eq(1).children().attr('title').trim() + '"么?')) { + $.ajax({ + type: 'post', + url: '<%= user_resource_delete_user_path(@user)%>' + '?resource_id=' + id + '&type=' + $('#type').val() + }); + } + }else{ + alert('您无法删除此资源!') } } From 3feff49ca3ba86a7b84cb4b7502867d5fc79603f Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 10:32:13 +0800 Subject: [PATCH 23/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E5=88=A0=E9=99=A4=E4=B8=8A=E4=BC=A0=E8=80=85=E4=B8=BA?= =?UTF-8?q?=E8=87=AA=E5=B7=B1=E7=9A=84=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/user_resource.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 19cfe2407..06e4ff283 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -258,7 +258,7 @@ $(".resourcesList").click(function(e) { //批量删除 function batch_delete(){ var data = $("#resources_list_form").serialize(); - if(data != "" && confirm('确认要删除这些资源吗?')) { + if(data != "" && confirm('您可能会删不掉这其中上传者不是您的资源,确认要删除这些资源吗?')) { $.post( '<%= user_resource_delete_user_path(@user)%>', $("#resources_list_form").serialize(),//只会对选中的控件进行序列化提交 From 8a88935b7c646031c8ac34dc28596c54419a8917 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 10:44:09 +0800 Subject: [PATCH 24/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E7=9C=8B=E5=88=B0=E8=87=AA=E5=B7=B1=E7=9A=84=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 5d569e247..562804abe 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1243,6 +1243,11 @@ class UsersController < ApplicationController def user_resource #确定container_type # @user = User.find(params[:id]) + # 别人的资源库是没有权限去看的 + if User.current.id.to_i != params[:id].to_i + render_403 + return + end if(params[:type].nil? || params[:type] == "1") #全部 if User.current.id.to_i == params[:id].to_i user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 From 4928d5976e568fb04012348b125a31e69e727822 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 14:00:24 +0800 Subject: [PATCH 25/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E4=BB=A5=E5=90=8E=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 41 ++++++++++++++++++++- app/views/users/user_resource_create.js.erb | 1 + 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 562804abe..368ed3c4a 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -817,7 +817,46 @@ class UsersController < ApplicationController #@user.save_attachments(params[:attachments],User.current) # Container_type为Principal Attachment.attach_filesex(@user, params[:attachments], params[:attachment_type]) - @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon') ").order("created_on desc") + if(params[:type].nil? || params[:type] == "1") #全部 + if User.current.id.to_i == params[:id].to_i + user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+ + "or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + else + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源 + @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + end + elsif params[:type] == "2" #课程资源 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') ").order("created_on desc") + else + user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 + @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + end + elsif params[:type] == "3" #项目资源 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc") + end + elsif params[:type] == "4" #附件 + if User.current.id.to_i == params[:id].to_i + @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + else + @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc") + end + end + @type = params[:type] || 1 + @limit = 10 + @is_remote = true + @obj_count = @attachments.count + @obj_pages = Paginator.new @obj_count, @limit, params['page'] || 1 + @offset ||= @obj_pages.offset + #@curse_attachments_all = @all_attachments[@offset, @limit] + @attachments = paginateHelper @attachments,10 respond_to do |format| format.js end diff --git a/app/views/users/user_resource_create.js.erb b/app/views/users/user_resource_create.js.erb index 7e7cd2919..a5de94552 100644 --- a/app/views/users/user_resource_create.js.erb +++ b/app/views/users/user_resource_create.js.erb @@ -1,3 +1,4 @@ closeModal(); $("#resources_list").html('<%= escape_javascript( render :partial => 'resources_list' ,:locals=>{ :attachments => @attachments})%>'); + From 11d6298efa7253be8934131a41485ecc4e88222d Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 14:37:19 +0800 Subject: [PATCH 26/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=90=8Ecss=E6=A0=B7=E5=BC=8F=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/schema.rb | 8 +- public/stylesheets/public_new.css | 178 +++++++++++++++--------------- 2 files changed, 96 insertions(+), 90 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 5fcdda1c5..d5ef9f1c5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -474,6 +474,13 @@ ActiveRecord::Schema.define(:version => 20150815030833) do add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" + create_table "discuss_demos", :force => true do |t| + t.string "title" + t.text "body" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "documents", :force => true do |t| t.integer "project_id", :default => 0, :null => false t.integer "category_id", :default => 0, :null => false @@ -896,7 +903,6 @@ ActiveRecord::Schema.define(:version => 20150815030833) do t.datetime "created_on" t.integer "comments_count", :default => 0, :null => false t.integer "course_id" - t.datetime "updated_on" end add_index "news", ["author_id"], :name => "index_news_on_author_id" diff --git a/public/stylesheets/public_new.css b/public/stylesheets/public_new.css index 43f6288c5..b1426f9bc 100644 --- a/public/stylesheets/public_new.css +++ b/public/stylesheets/public_new.css @@ -588,100 +588,100 @@ input.sendSourceText {font-size:14px;color:#ffffff;background-color:#64bdd9;} /*资源库*/ -.resources {width:730px; background-color:#ffffff;} -.resourcesBanner {width:730px; height:40px; background-color:#eaeaea; margin-bottom:10px;} -.bannerName {background:#64bdd9; color:#ffffff; height:40px; line-height:40px; width:90px; text-align:center; font-weight:normal; vertical-align:middle; font-size: 16px; float:left;} -.resourcesSelect {width:40px; height:40px; float:right; position:relative;} -.resourcesSelected {width:25px; height:20px;} -.resourcesIcon {margin-top:15px; display:block; position:relative; background:url(images/resource_icon_list.png) 0px 0px no-repeat; width:25px; height:20px;} -.resourcesIcon:hover { background:url(images/resource_icon_list.png) 0px -25px no-repeat;} -.resourcesType {width:50px; background-color:#ffffff; float:left; list-style:none; position:absolute; border:1px solid #eaeaea; border-radius:5px; top:35px; padding:5px 10px; left:-30px; font-size:12px; color:#888888; display:none;} -a.resourcesGrey {font-size:12px; color:#888888;} -a.resourcesGrey:hover {font-size:12px; color:#15bccf;} -.resourcesBanner ul li:hover ul.resourcesType {display:block;} -ul li:hover ul {display:block;} -.resourcesUploadBox {float:right; width:103px; height:34px; background-color:#64bdd9; line-height:34px; vertical-align:middle; text-align:center; margin-left:12px;} -.uploadIcon {background:url(images/resource_icon_list.png) -35px 10px no-repeat; float:left; display:block; width:30px; height:30px; margin-left:-3px;} -a.uploadText {color:#ffffff; font-size:14px;} -.resourcesSearchloadBox {border:1px solid #e6e6e6; width:225px; float:right; background-color:#ffffff;} -.searchResource {border:none; outline:none; background-color:#ffffff; width:184px; height:32px; padding-left:10px; display:block; float:left;} -.searchIcon{width:31px; height:32px; background-color:#ffffff; background:url(images/resource_icon_list.png) -40px -15px no-repeat; display:block; float:left;} -.resourcesSearchBanner {height:34px; margin-bottom:10px;} -.resourcesListTab {width:730px; height:40px; background-color:#f6f6f6; border-bottom:1px solid #eaeaea; font-size:14px; color:#7a7a7a;} -.resourcesListCheckbox {width:40px; height:40px; line-height:40px; text-align:center; vertical-align:middle;} -.resourcesCheckbox {padding:0px; margin:0px; margin-top:14px; width:12px; height:12px;} -.resourcesListName {width:135px; height:40px; line-height:40px; text-align:left;} -.resourcesListSize {width:110px; height:40px; line-height:40px; text-align:center;} -.resourcesListType {width:150px; height:40px; line-height:40px; text-align:center;} -.resourcesListUploader {width:130px; height:40px; line-height:40px; text-align:center;} -.resourcesListTime {width:165px; height:40px; line-height:40px; text-align:center;} -.resourcesList {width:730px; height:39px; background-color:#ffffff; border-bottom:1px dashed #eaeaea; color:#9a9a9a; font-size:12px;} -a.resourcesBlack {font-size:12px; color:#4c4c4c;} -a.resourcesBlack:hover {font-size:12px; color:#000000;} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 80px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 12px; - text-align: left; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.5; - color:#616060; - white-space: nowrap; -} -.dropdown-menu > li > a:hover{ - color: #ffffff; - text-decoration: none; - background-color: #64bdd9; - outline:none; -} +/*.resources {width:730px; background-color:#ffffff;}*/ +/*.resourcesBanner {width:730px; height:40px; background-color:#eaeaea; margin-bottom:10px;}*/ +/*.bannerName {background:#64bdd9; color:#ffffff; height:40px; line-height:40px; width:90px; text-align:center; font-weight:normal; vertical-align:middle; font-size: 16px; float:left;}*/ +/*.resourcesSelect {width:40px; height:40px; float:right; position:relative;}*/ +/*.resourcesSelected {width:25px; height:20px;}*/ +/*.resourcesIcon {margin-top:15px; display:block; position:relative; background:url(images/resource_icon_list.png) 0px 0px no-repeat; width:25px; height:20px;}*/ +/*.resourcesIcon:hover { background:url(images/resource_icon_list.png) 0px -25px no-repeat;}*/ +/*.resourcesType {width:50px; background-color:#ffffff; float:left; list-style:none; position:absolute; border:1px solid #eaeaea; border-radius:5px; top:35px; padding:5px 10px; left:-30px; font-size:12px; color:#888888; display:none;}*/ +/*a.resourcesGrey {font-size:12px; color:#888888;}*/ +/*a.resourcesGrey:hover {font-size:12px; color:#15bccf;}*/ +/*.resourcesBanner ul li:hover ul.resourcesType {display:block;}*/ +/*ul li:hover ul {display:block;}*/ +/*.resourcesUploadBox {float:right; width:103px; height:34px; background-color:#64bdd9; line-height:34px; vertical-align:middle; text-align:center; margin-left:12px;}*/ +/*.uploadIcon {background:url(images/resource_icon_list.png) -35px 10px no-repeat; float:left; display:block; width:30px; height:30px; margin-left:-3px;}*/ +/*a.uploadText {color:#ffffff; font-size:14px;}*/ +/*.resourcesSearchloadBox {border:1px solid #e6e6e6; width:225px; float:right; background-color:#ffffff;}*/ +/*.searchResource {border:none; outline:none; background-color:#ffffff; width:184px; height:32px; padding-left:10px; display:block; float:left;}*/ +/*.searchIcon{width:31px; height:32px; background-color:#ffffff; background:url(images/resource_icon_list.png) -40px -15px no-repeat; display:block; float:left;}*/ +/*.resourcesSearchBanner {height:34px; margin-bottom:10px;}*/ +/*.resourcesListTab {width:730px; height:40px; background-color:#f6f6f6; border-bottom:1px solid #eaeaea; font-size:14px; color:#7a7a7a;}*/ +/*.resourcesListCheckbox {width:40px; height:40px; line-height:40px; text-align:center; vertical-align:middle;}*/ +/*.resourcesCheckbox {padding:0px; margin:0px; margin-top:14px; width:12px; height:12px;}*/ +/*.resourcesListName {width:135px; height:40px; line-height:40px; text-align:left;}*/ +/*.resourcesListSize {width:110px; height:40px; line-height:40px; text-align:center;}*/ +/*.resourcesListType {width:150px; height:40px; line-height:40px; text-align:center;}*/ +/*.resourcesListUploader {width:130px; height:40px; line-height:40px; text-align:center;}*/ +/*.resourcesListTime {width:165px; height:40px; line-height:40px; text-align:center;}*/ +/*.resourcesList {width:730px; height:39px; background-color:#ffffff; border-bottom:1px dashed #eaeaea; color:#9a9a9a; font-size:12px;}*/ +/*a.resourcesBlack {font-size:12px; color:#4c4c4c;}*/ +/*a.resourcesBlack:hover {font-size:12px; color:#000000;}*/ +/*.dropdown-menu {*/ + /*position: absolute;*/ + /*top: 100%;*/ + /*left: 0;*/ + /*z-index: 1000;*/ + /*display: none;*/ + /*float: left;*/ + /*min-width: 80px;*/ + /*padding: 5px 0;*/ + /*margin: 2px 0 0;*/ + /*font-size: 12px;*/ + /*text-align: left;*/ + /*background-color: #fff;*/ + /*-webkit-background-clip: padding-box;*/ + /*background-clip: padding-box;*/ + /*border: 1px solid #ccc;*/ + /*border-radius: 4px;*/ + /*-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);*/ + /*box-shadow: 0 6px 12px rgba(0, 0, 0, .175);*/ +/*}*/ +/*.dropdown-menu > li > a {*/ + /*display: block;*/ + /*padding: 3px 20px;*/ + /*clear: both;*/ + /*font-weight: normal;*/ + /*line-height: 1.5;*/ + /*color:#616060;*/ + /*white-space: nowrap;*/ +/*}*/ +/*.dropdown-menu > li > a:hover{*/ + /*color: #ffffff;*/ + /*text-decoration: none;*/ + /*background-color: #64bdd9;*/ + /*outline:none;*/ +/*}*/ /*发送资源弹窗*/ /*.resourceShareContainer {width:100%; height:100%; background:#666; filter:alpha(opacity=50); opacity:0.5; -moz-opacity:0.5; position:absolute; left:0; top:0; z-index:-999;}*/ -.resourceSharePopup {width:300px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-150px; z-index:1000;} -.sendText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:140px; display:inline-block;} -.resourcePopupClose {width:20px; height:20px; display:inline-block; float:right;} -.resourceClose {background:url(images/resource_icon_list.png) 0px -40px no-repeat; width:20px; height:20px; display:inline-block;} -.resourcesSearchBox {border:1px solid #e6e6e6; width:225px; height:25px; background-color:#ffffff; margin-top:12px; margin-bottom:15px;} -.searchResourcePopup {border:none; outline:none; background-color:#ffffff; width:184px; height:25px; padding-left:10px; display:inline-block; float:left;} -.searchIconPopup{width:31px; height:25px; background-color:#ffffff; background:url(images/resource_icon_list.png) -40px -18px no-repeat; display:inline-block; float:left;} -.courseSend {width:260px; height:15px; line-height:15px; margin-bottom:10px;} -.courseSendCheckbox {padding:0px; margin:0px; width:12px; height:12px; margin-right:10px; display:inline-block; margin-top:2px;} -.sendCourseName {font-size:12px; color:#5f6060;} -.courseSendSubmit {width:50px; height:25px; line-height:25px; text-align:center; vertical-align:middle; background-color:#64bdd9; margin-right:25px; float:left;} -.courseSendCancel {width:50px; height:25px; line-height:25px; text-align:center; vertical-align:middle; background-color:#c1c1c1; float:left} -a.sendSourceText {font-size:14px; color:#ffffff;} +/*.resourceSharePopup {width:300px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-150px; z-index:1000;}*/ +/*.sendText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:140px; display:inline-block;}*/ +/*.resourcePopupClose {width:20px; height:20px; display:inline-block; float:right;}*/ +/*.resourceClose {background:url(images/resource_icon_list.png) 0px -40px no-repeat; width:20px; height:20px; display:inline-block;}*/ +/*.resourcesSearchBox {border:1px solid #e6e6e6; width:225px; height:25px; background-color:#ffffff; margin-top:12px; margin-bottom:15px;}*/ +/*.searchResourcePopup {border:none; outline:none; background-color:#ffffff; width:184px; height:25px; padding-left:10px; display:inline-block; float:left;}*/ +/*.searchIconPopup{width:31px; height:25px; background-color:#ffffff; background:url(images/resource_icon_list.png) -40px -18px no-repeat; display:inline-block; float:left;}*/ +/*.courseSend {width:260px; height:15px; line-height:15px; margin-bottom:10px;}*/ +/*.courseSendCheckbox {padding:0px; margin:0px; width:12px; height:12px; margin-right:10px; display:inline-block; margin-top:2px;}*/ +/*.sendCourseName {font-size:12px; color:#5f6060;}*/ +/*.courseSendSubmit {width:50px; height:25px; line-height:25px; text-align:center; vertical-align:middle; background-color:#64bdd9; margin-right:25px; float:left;}*/ +/*.courseSendCancel {width:50px; height:25px; line-height:25px; text-align:center; vertical-align:middle; background-color:#c1c1c1; float:left}*/ +/*a.sendSourceText {font-size:14px; color:#ffffff;}*/ /*上传资源弹窗*/ -.resourceUploadPopup {width:400px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-200px; z-index:1000;} -.uploadText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:140px; display:inline-block;} -.uploadBoxContainer {height:33px; line-height:33px; margin-top:10px; position:relative;} -.uploadBox {width:100px; height:33px; line-height:33px; text-align:center; vertical-align:middle; background-color:#64bdd9; border-radius:3px; float:left; margin-right:12px;} -a.uploadIcon {background:url(images/resource_icon_list.png) 8px -60px no-repeat; width:100px; height:33px;} -.chooseFile {color:#ffffff; display:block; margin-left:32px;} -.uploadResourceIntr {width:250px; height:33px; float:left; line-height:33px; font-size:12px;} -.uploadResourceName {width:250px; display:inline-block; line-height:15px; font-size:12px; color:#444444; margin-bottom:2px;} -.uploadResourceIntr2 {width:250px; display:inline-block; line-height:15px; font-size:12px; color:#444444;} -.uploadType {margin:10px 0; border:1px solid #e6e6e6; width:100px; height:30px; outline:none; font-size:12px; color:#888888;} -.uploadKeyword {margin-bottom:10px; outline:none; border:1px solid #e6e6e6; height:30px; width:280px;} +/*.resourceUploadPopup {width:400px; height:auto; border:3px solid #15bccf; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-200px; z-index:1000;}*/ +/*.uploadText {font-size:16px; color:#15bccf; line-height:16px; padding-top:20px; width:140px; display:inline-block;}*/ +/*.uploadBoxContainer {height:33px; line-height:33px; margin-top:10px; position:relative;}*/ +/*.uploadBox {width:100px; height:33px; line-height:33px; text-align:center; vertical-align:middle; background-color:#64bdd9; border-radius:3px; float:left; margin-right:12px;}*/ +/*a.uploadIcon {background:url(images/resource_icon_list.png) 8px -60px no-repeat; width:100px; height:33px;}*/ +/*.chooseFile {color:#ffffff; display:block; margin-left:32px;}*/ +/*.uploadResourceIntr {width:250px; height:33px; float:left; line-height:33px; font-size:12px;}*/ +/*.uploadResourceName {width:250px; display:inline-block; line-height:15px; font-size:12px; color:#444444; margin-bottom:2px;}*/ +/*.uploadResourceIntr2 {width:250px; display:inline-block; line-height:15px; font-size:12px; color:#444444;}*/ +/*.uploadType {margin:10px 0; border:1px solid #e6e6e6; width:100px; height:30px; outline:none; font-size:12px; color:#888888;}*/ +/*.uploadKeyword {margin-bottom:10px; outline:none; border:1px solid #e6e6e6; height:30px; width:280px;}*/ /*新个人主页框架css*/ From 051c92110863c3e034a767a15f2fcb1130a67450 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 15:58:32 +0800 Subject: [PATCH 27/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=A4=9A?= =?UTF-8?q?=E9=80=89=E5=8F=91=E9=80=81=E7=BB=99=E5=87=BA=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/user_resource.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/users/user_resource.html.erb b/app/views/users/user_resource.html.erb index 06e4ff283..f0be12e3d 100644 --- a/app/views/users/user_resource.html.erb +++ b/app/views/users/user_resource.html.erb @@ -291,6 +291,7 @@ $(".resourcesList").click(function(e) { function batch_send(){ if($("#resources_list_form").serialize() == ""){ + alert('暂时不支持多页选择,您当前页没有选择任何资源'); return ; } if (lastSendType === '1'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。 From 4e4df99bb1a26b0b47820a4434ec4ecadf88a021 Mon Sep 17 00:00:00 2001 From: huang <huang.jingquan@163.com> Date: Fri, 21 Aug 2015 16:34:57 +0800 Subject: [PATCH 28/36] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=86=B2=E7=AA=81?= 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 8f69642f7..3b1d39411 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -45,7 +45,7 @@ class UsersController < ApplicationController :activity_new_score_index, :influence_new_score_index, :score_new_index,:update_score,:user_activities,:user_projects_index, :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist, :user_resource,:user_resource_create,:user_resource_delete,:rename_resource,:search_user_course,:add_exist_file_to_course, - :search_user_project,:resource_preview,:resource_search,:add_exist_file_to_project] + :search_user_project,:resource_preview,:resource_search,:add_exist_file_to_project,:user_messages] #edit has been deleted by huang, 2013-9-23 before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses, :user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, From 535145f8f2df191778805a3d410708a8b0815cf7 Mon Sep 17 00:00:00 2001 From: sw <939547590@qq.com> Date: Fri, 21 Aug 2015 16:35:52 +0800 Subject: [PATCH 29/36] 11 --- db/schema.rb | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 88e0cdd94..1c77ff04b 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 => 20150820004659) do +ActiveRecord::Schema.define(:version => 20150820025358) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -776,16 +776,6 @@ ActiveRecord::Schema.define(:version => 20150820004659) do add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" - create_table "journal_details_copy", :force => true do |t| - t.integer "journal_id", :default => 0, :null => false - t.string "property", :limit => 30, :default => "", :null => false - t.string "prop_key", :limit => 30, :default => "", :null => false - t.text "old_value" - t.text "value" - end - - add_index "journal_details_copy", ["journal_id"], :name => "journal_details_journal_id" - create_table "journal_replies", :id => false, :force => true do |t| t.integer "journal_id" t.integer "user_id" @@ -1414,6 +1404,15 @@ ActiveRecord::Schema.define(:version => 20150820004659) do t.integer "fields_bits", :default => 0 end + create_table "user_activities", :force => true do |t| + t.string "act_type" + t.integer "act_id" + t.string "container_type" + t.integer "container_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "user_extensions", :force => true do |t| t.integer "user_id", :null => false t.date "birthday" @@ -1509,15 +1508,6 @@ ActiveRecord::Schema.define(:version => 20150820004659) do add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" - create_table "userfeedback_messages", :force => true do |t| - t.integer "user_id" - t.integer "user_message_id" - t.string "user_message_type" - t.integer "viewed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - create_table "users", :force => true do |t| t.string "login", :default => "", :null => false t.string "hashed_password", :limit => 40, :default => "", :null => false @@ -1535,7 +1525,6 @@ ActiveRecord::Schema.define(:version => 20150820004659) do t.string "identity_url" t.string "mail_notification", :default => "", :null => false t.string "salt", :limit => 64 - t.integer "gid" end add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" From f6b01b300d0b9398f55c32e7bf6a547fcf27bb8f Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 16:36:42 +0800 Subject: [PATCH 30/36] =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BA=93=20=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E9=87=8C=E8=83=BD=E7=9C=8B=E5=88=B0=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E8=B5=84=E6=BA=90=EF=BC=8C=E4=BD=86=E6=98=AF=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E9=87=8C=E8=BE=B9=E5=8D=B4=E6=B2=A1=E6=9C=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 9 ++++++--- app/views/layouts/base_users_new.html.erb | 12 ++++++------ db/schema.rb | 10 ---------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8f69642f7..3c163fada 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -967,7 +967,8 @@ class UsersController < ApplicationController end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') ").order("created_on desc") + user_course_ids = User.current.courses.map { |c| c.id} + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')})) ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ @@ -1382,7 +1383,8 @@ class UsersController < ApplicationController end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') ").order("created_on desc") + user_course_ids = User.current.courses.map { |c| c.id} + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')})) ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ @@ -1432,7 +1434,8 @@ class UsersController < ApplicationController end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Course' and (filename like '%#{search}%')").order("created_on desc") + user_course_ids = User.current.courses.map { |c| c.id} + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')})) ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type = 'Course') "+ diff --git a/app/views/layouts/base_users_new.html.erb b/app/views/layouts/base_users_new.html.erb index be75f53f1..e9b7ddb12 100644 --- a/app/views/layouts/base_users_new.html.erb +++ b/app/views/layouts/base_users_new.html.erb @@ -166,12 +166,12 @@ <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=@user.projects.visible.count%>)</span> </a> </div> - <div class="subNav"> - <a href="<%=url_for(:controller => 'users', :action => 'user_resource',:id=>@user.id,:type=>1)%>" class=" f14 c_blue02"> - TA的资源库 - <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("(author_id = #{@user.id} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) or (container_type = 'Course' and is_public = 1 and container_id in (#{@user.courses.visible.map{|c| c.id}.join(',')}))").count%>)</span> - </a> - </div> + <!--<div class="subNav">--> + <!--<a href="<%#=url_for(:controller => 'users', :action => 'user_resource',:id=>@user.id,:type=>1)%>" class=" f14 c_blue02">--> + <!--TA的资源库--> + <!--<span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%#=Attachment.where("(author_id = #{@user.id} and is_public = 1 and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) or (container_type = 'Course' and is_public = 1 and container_id in (#{@user.courses.visible.map{|c| c.id}.join(',')}))").count%>)</span>--> + <!--</a>--> + <!--</div>--> <% end %> <div class="subNav "> <%= link_to "留言",feedback_path(@user),:class => "f14 c_blue02"%> diff --git a/db/schema.rb b/db/schema.rb index 88e0cdd94..3ca31a7d2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1509,15 +1509,6 @@ ActiveRecord::Schema.define(:version => 20150820004659) do add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" - create_table "userfeedback_messages", :force => true do |t| - t.integer "user_id" - t.integer "user_message_id" - t.string "user_message_type" - t.integer "viewed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - create_table "users", :force => true do |t| t.string "login", :default => "", :null => false t.string "hashed_password", :limit => 40, :default => "", :null => false @@ -1535,7 +1526,6 @@ ActiveRecord::Schema.define(:version => 20150820004659) do t.string "identity_url" t.string "mail_notification", :default => "", :null => false t.string "salt", :limit => 64 - t.integer "gid" end add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" From 2589179fcac39875f9a7085586359a362f2cb469 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 16:57:44 +0800 Subject: [PATCH 31/36] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E7=99=BB?= =?UTF-8?q?=E9=99=86=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/base_users_new.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/base_users_new.html.erb b/app/views/layouts/base_users_new.html.erb index e9b7ddb12..e4fe188d2 100644 --- a/app/views/layouts/base_users_new.html.erb +++ b/app/views/layouts/base_users_new.html.erb @@ -149,7 +149,7 @@ <div class="subNav"> <a href="<%=url_for(:controller => 'users', :action => 'user_resource',:id=>@user.id,:type=>1)%>" class=" f14 c_blue02"> 我的资源库 - <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("(author_id = #{@user.id} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) or (container_type = 'Course' and container_id in (#{@user.courses.map{|c| c.id}.join(',')}))").count%>)</span> + <span style="font-weight:normal;font-size:12px;color:#FF5722;">(<%=Attachment.where("(author_id = #{@user.id} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) or (container_type = 'Course' and container_id in (#{@user.courses.map{|c| c.id}.empty? ? '0' : @user.courses.map{|c| c.id}.join(',')}))").count%>)</span> </a> </div> From 0489b02e54e53175bdedf4f849c47497e41651cf Mon Sep 17 00:00:00 2001 From: sw <939547590@qq.com> Date: Fri, 21 Aug 2015 17:00:17 +0800 Subject: [PATCH 32/36] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E7=95=99=E8=A8=80?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/words_controller.rb | 30 +++++++++++++++-------------- app/models/journals_for_message.rb | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb index fc723d5d5..5158a99c4 100644 --- a/app/controllers/words_controller.rb +++ b/app/controllers/words_controller.rb @@ -70,20 +70,22 @@ class WordsController < ApplicationController end def destroy - @journal_destroyed = JournalsForMessage.delete_message(params[:object_id]) - if @journal_destroyed.jour_type == "Bid" - @bid = Bid.find(@journal_destroyed.jour_id) - @jours_count = @bid.journals_for_messages.where('m_parent_id IS NULL').count - elsif @journal_destroyed.jour_type == "Course" - @course = Course.find @journal_destroyed.jour_id - @jours_count = @course.journals_for_messages.where('m_parent_id IS NULL').count - elsif @journal_destroyed.jour_type == "Principal" - @user = User.find(@journal_destroyed.jour_id) - @jours_count = @user.journals_for_messages.where('m_parent_id IS NULL').count - @is_user = true - end - respond_to do |format| - format.js + @journal_destroyed = JournalsForMessage.find params[:object_id] + if @journal_destroyed.destroy + if @journal_destroyed.jour_type == "Bid" + @bid = Bid.find(@journal_destroyed.jour_id) + @jours_count = @bid.journals_for_messages.where('m_parent_id IS NULL').count + elsif @journal_destroyed.jour_type == "Course" + @course = Course.find @journal_destroyed.jour_id + @jours_count = @course.journals_for_messages.where('m_parent_id IS NULL').count + elsif @journal_destroyed.jour_type == "Principal" + @user = User.find(@journal_destroyed.jour_id) + @jours_count = @user.journals_for_messages.where('m_parent_id IS NULL').count + @is_user = true + end + respond_to do |format| + format.js + end end end diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb index 853376f6a..2c56dc035 100644 --- a/app/models/journals_for_message.rb +++ b/app/models/journals_for_message.rb @@ -60,7 +60,7 @@ class JournalsForMessage < ActiveRecord::Base has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy # 消息关联 has_many :course_messages, :class_name => 'CourseMessage',:as =>:course_message ,:dependent => :destroy - has_many :user_feedback_messages, :class_name => 'UserFeedbackMessage', :as =>:user_feeback_message, :dependent => :destroy + has_many :user_feedback_messages, :class_name => 'UserFeedbackMessage', :as =>:journals_for_message, :dependent => :destroy validates :notes, presence: true, if: :is_homework_jour? after_create :act_as_activity, :act_as_course_activity, :act_as_course_message, :act_as_user_feedback_message From 033aea28c57b71037d91ca1bf27abc7abdf0bc16 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 17:05:54 +0800 Subject: [PATCH 33/36] =?UTF-8?q?=E6=96=B0=E6=88=90=E5=91=98=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E7=9A=84=E6=97=B6=E5=80=99=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 3c163fada..9e5886f3d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1374,21 +1374,21 @@ class UsersController < ApplicationController if User.current.id.to_i == params[:id].to_i user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+ - "or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + - "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i user_course_ids = User.current.courses.map { |c| c.id} - @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')})) ").order("created_on desc") + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ - "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "3" #项目资源 if User.current.id.to_i == params[:id].to_i @@ -1424,22 +1424,22 @@ class UsersController < ApplicationController if User.current.id.to_i == params[:id].to_i user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 取交集并查询 @attachments = Attachment.where("((author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+ - " or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')}))) and (filename like '%#{search}%') ").order("created_on desc") + " or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))) and (filename like '%#{search}%') ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type in" + " ('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon'))"+ - " or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')})) )" + + " or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) )" + " and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i user_course_ids = User.current.courses.map { |c| c.id} - @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')})) ").order("created_on desc") + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type = 'Course') "+ - "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')})) )"+ + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) )"+ " and (filename like '%#{search}%') ").order("created_on desc") end elsif params[:type] == "3" #项目资源 From 53c28a9b3929a3a174c2f4d85800d90a22efcbd0 Mon Sep 17 00:00:00 2001 From: lizanle <491823689@qq.com> Date: Fri, 21 Aug 2015 17:13:42 +0800 Subject: [PATCH 34/36] =?UTF-8?q?=E6=96=B0=E6=88=90=E5=91=98=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E7=9A=84=E6=97=B6=E5=80=99=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 17 +++++++++-------- app/views/users/_resources_list.html.erb | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9e5886f3d..ddd167272 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -903,20 +903,21 @@ class UsersController < ApplicationController if User.current.id.to_i == params[:id].to_i user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+ - "or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + - "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i - @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') ").order("created_on desc") + user_course_ids = User.current.courses.map { |c| c.id} + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ - "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "3" #项目资源 if User.current.id.to_i == params[:id].to_i @@ -958,21 +959,21 @@ class UsersController < ApplicationController if User.current.id.to_i == params[:id].to_i user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+ - "or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " + "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " + - "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "2" #课程资源 if User.current.id.to_i == params[:id].to_i user_course_ids = User.current.courses.map { |c| c.id} - @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.join(',')})) ").order("created_on desc") + @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) ").order("created_on desc") else user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中 @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+ - "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.join(',')}))").order("created_on desc") + "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc") end elsif params[:type] == "3" #项目资源 if User.current.id.to_i == params[:id].to_i diff --git a/app/views/users/_resources_list.html.erb b/app/views/users/_resources_list.html.erb index fd72c99e4..b41b9f28f 100644 --- a/app/views/users/_resources_list.html.erb +++ b/app/views/users/_resources_list.html.erb @@ -13,7 +13,7 @@ </li> <li class="resourcesListSize fl"><%= number_to_human_size(attach.filesize) %></li> <li class="resourcesListType fl"><%= get_resource_type(attach.container_type)%></li> - <li class="resourcesListUploader fl"><%=User.find(attach.author_id).realname %></li> + <li class="resourcesListUploader fl"><%=User.find(attach.author_id).realname.blank? ? User.find(attach.author_id).nickname : User.find(attach.author_id).realname %></li> <li style="display: none"><%= attach.author_id %></li> <li class="resourcesListTime fl"><%= format_date(attach.created_on) %></li> <li style="display: none"><%= attach.id %></li> From 17aae7c79db22f4455b14bc0c668326e3c7ee0d8 Mon Sep 17 00:00:00 2001 From: huang <huang.jingquan@163.com> Date: Fri, 21 Aug 2015 17:40:28 +0800 Subject: [PATCH 35/36] =?UTF-8?q?=E8=A7=A3=E5=86=B3CSS=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/user_messages.html.erb | 6 +++--- public/stylesheets/public_new.css | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/users/user_messages.html.erb b/app/views/users/user_messages.html.erb index c1b57aabb..a74e1800f 100644 --- a/app/views/users/user_messages.html.erb +++ b/app/views/users/user_messages.html.erb @@ -1,10 +1,10 @@ <div id="RSide" class="fl"> <div class="homepageRight"> -<div class="resources"> + <div class="resourcesBanner"> <div class="bannerName">消息</div> <ul class="resourcesSelect"> - <li class="resourcesSelected"><a href="javascript:void(0);" class="resourcesIcon"></a> + <li class="resourcesSelected2"><a href="javascript:void(0);" class="resourcesIcon2"></a> <ul class="newsType"> <li><a href="javascript:void(0);" class="resourcesGrey"><%= link_to "全部",{:controller=> 'users', :action => 'user_messages', id: User.current.id, host: Setting.host_user} %></a></li> <%# 课程相关消息 %> @@ -250,5 +250,5 @@ <% end %> </div> </div> -</div> + </div> diff --git a/public/stylesheets/public_new.css b/public/stylesheets/public_new.css index bccac7da0..ec7ec26a1 100644 --- a/public/stylesheets/public_new.css +++ b/public/stylesheets/public_new.css @@ -592,9 +592,9 @@ input.sendSourceText {font-size:14px;color:#ffffff;background-color:#64bdd9;} /*.resourcesBanner {width:730px; height:40px; background-color:#eaeaea; margin-bottom:10px;}*/ /*.bannerName {background:#64bdd9; color:#ffffff; height:40px; line-height:40px; width:90px; text-align:center; font-weight:normal; vertical-align:middle; font-size: 16px; float:left;}*/ /*.resourcesSelect {width:40px; height:40px; float:right; position:relative;}*/ -/*.resourcesSelected {width:25px; height:20px;}*/ -/*.resourcesIcon {margin-top:15px; display:block; position:relative; background:url(images/resource_icon_list.png) 0px 0px no-repeat; width:25px; height:20px;}*/ -/*.resourcesIcon:hover { background:url(images/resource_icon_list.png) 0px -25px no-repeat;}*/ +.resourcesSelected2 {width:25px; height:20px;} +.resourcesIcon2 {margin-top:20px; display:block; position:relative; background:url(images/resource_icon_list.png) 0px 0px no-repeat; width:25px; height:20px;} +.resourcesIcon2:hover { background:url(images/resource_icon_list.png) 0px -25px no-repeat;} /*.resourcesType {width:50px; background-color:#ffffff; float:left; list-style:none; position:absolute; border:1px solid #eaeaea; border-radius:5px; top:35px; padding:5px 10px; left:-30px; font-size:12px; color:#888888; display:none;}*/ /*a.resourcesGrey {font-size:12px; color:#888888;}*/ /*a.resourcesGrey:hover {font-size:12px; color:#15bccf;}*/ From b9980d4ab1d40e11883eb5ddf249d239355ed83a Mon Sep 17 00:00:00 2001 From: huang <huang.jingquan@163.com> Date: Mon, 24 Aug 2015 10:30:27 +0800 Subject: [PATCH 36/36] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=B2=A1=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=97=AE=E9=A2=98=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/user_messages.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/users/user_messages.html.erb b/app/views/users/user_messages.html.erb index a74e1800f..52cb8e0d8 100644 --- a/app/views/users/user_messages.html.erb +++ b/app/views/users/user_messages.html.erb @@ -228,7 +228,7 @@ <%# 用户留言消息 %> <% unless @user_feedback_messages.nil? %> <% @user_feedback_messages.each do |ufm| %> - <% if ufm.journals_for_message_type == "Principal" %> + <% if ufm.journals_for_message_type == "JournalsForMessage" %> <ul class="homepageNewsList fl"> <li class="homepageNewsPortrait fl"> <a href="javascript:void(0);"><%= image_tag(url_to_avatar(ufm.journals_for_message.user), :width => "30", :height => "30") %></a>