# HG changeset patch # User Nattee Niparnan # Date 2016-06-29 06:27:57 # Node ID ede66b5a6449ba61d75675b67b04dea9762a1049 # Parent 7995fc49e1d7508f84278f3fed9d415f80b29143 * DRY the toggle button via application_helper.rb#toggle_button and _toggle_button.js.haml * bootrapize the user_admin * now considering user.enabled * tidy up route diff --git a/app/assets/javascripts/announcements.js.coffee b/app/assets/javascripts/announcements.js.coffee --- a/app/assets/javascripts/announcements.js.coffee +++ b/app/assets/javascripts/announcements.js.coffee @@ -1,13 +1,5 @@ #js for announcement $ -> - $('.ajax-toggle').on 'click', (event) -> - target = $(event.target) - target.removeClass 'btn-default' - target.removeClass 'btn-success' - target.addClass 'btn-warning' - target.text '...' - return - $(document).ajaxError (event, jqxhr, settings, exception) -> if jqxhr.status alert 'We\'re sorry, but something went wrong (' + jqxhr.status + ')' diff --git a/app/assets/javascripts/custom.js.coffee b/app/assets/javascripts/custom.js.coffee --- a/app/assets/javascripts/custom.js.coffee +++ b/app/assets/javascripts/custom.js.coffee @@ -30,6 +30,12 @@ if url window.location.href = url return - return + $('.ajax-toggle').on 'click', (event) -> + target = $(event.target) + target.removeClass 'btn-default' + target.removeClass 'btn-success' + target.addClass 'btn-warning' + target.text '...' + return - + return diff --git a/app/controllers/announcements_controller.rb b/app/controllers/announcements_controller.rb --- a/app/controllers/announcements_controller.rb +++ b/app/controllers/announcements_controller.rb @@ -83,7 +83,8 @@ @announcement = Announcement.find(params[:id]) @announcement.update_attributes( published: !@announcement.published? ) respond_to do |format| - format.js {} + format.js { render partial: 'toggle_button', + locals: {button_id: "#announcement_toggle_#{@announcement.id}",button_on: @announcement.published? } } end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -47,12 +47,17 @@ # check if run in single user mode if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY] - user = User.find(session[:user_id]) + user = User.find_by_id(session[:user_id]) if user==nil or (not user.admin?) flash[:notice] = 'You cannot log in at this time' redirect_to :controller => 'main', :action => 'login' return false end + unless user.enabled? + flash[:notice] = 'Your account is disabled' + redirect_to :controller => 'main', :action => 'login' + return false + end return true end diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb --- a/app/controllers/problems_controller.rb +++ b/app/controllers/problems_controller.rb @@ -123,7 +123,7 @@ @problem = Problem.find(params[:id]) @problem.update_attributes(available: !(@problem.available) ) respond_to do |format| - format.js {} + format.js { } end end diff --git a/app/controllers/user_admin_controller.rb b/app/controllers/user_admin_controller.rb --- a/app/controllers/user_admin_controller.rb +++ b/app/controllers/user_admin_controller.rb @@ -17,7 +17,6 @@ def index list - render :action => 'list' end def list diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -133,6 +133,24 @@ problem.each_value { |v| @summary[:solve] += 1 if v == 1 } end + def toggle_activate + @user = User.find(params[:id]) + @user.update_attributes( activated: !@user.activated? ) + respond_to do |format| + format.js { render partial: 'toggle_button', + locals: {button_id: "#toggle_activate_user_#{@user.id}",button_on: @user.activated? } } + end + end + + def toggle_enable + @user = User.find(params[:id]) + @user.update_attributes( enabled: !@user.enabled? ) + respond_to do |format| + format.js { render partial: 'toggle_button', + locals: {button_id: "#toggle_enable_user_#{@user.id}",button_on: @user.enabled? } } + end + end + protected def verify_online_registration @@ -192,4 +210,5 @@ admin_authorization end + end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -107,16 +107,11 @@ end end - def problem_select(problems, options = {}) - prefix = options[:with_specific_in_header] ? [[(t 'main.specified_in_header'),'-1']] : [] - selected = options[:selected] || (options[:with_specific_in_header] ? -1 : nil) - puts "selected = #{selected} hehe" - html_options = {class: 'select2 form-control'} - html_options[:id] = options[:id]if options[:id] - select 'submission', - 'problem_id', prefix + problems.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]}, - (selected ? { selected: "#{selected}"} : {} ), - html_options + def toggle_button(on,toggle_url,id) + link_to (on ? "Yes" : "No"), toggle_url, + {class: "btn btn-block btn-xs btn-#{on ? 'success' : 'default'} ajax-toggle", + id: id, + data: {remote: true, method: 'get'}} end def user_title_bar(user) diff --git a/app/views/announcements/index.html.haml b/app/views/announcements/index.html.haml --- a/app/views/announcements/index.html.haml +++ b/app/views/announcements/index.html.haml @@ -27,9 +27,8 @@ %br/ = h announcement.body %td= h announcement.author - // %td= check_box_tag :published, 1, announcement.published, { class: 'bootstrap-toggle', id: "published-#{announcement.id}", data: {remote: true, method: 'PUT', url: url_for(controller: :announcements, action: :toggle, id: announcement), size: 'small', toggle: 'toggle' } } - // in_place_editor_field :announcement, :published, {}, :rows => 1 - %td= link_to (announcement.published? ? "Yes" : "No"), url_for(controller: :announcements, action: :toggle, id: announcement), { class: "btn btn-block btn-sm btn-#{(announcement.published? ? 'success' : 'default')} ajax-toggle", id: "published-#{announcement.id}", data: {remote: true, method: 'post' } } + %td= toggle_button(announcement.published?, toggle_announcement_url(@announcement), "announcement_toggle_#{@announcement.id}") + //%td= link_to (announcement.published? ? "Yes" : "No"), url_for(controller: :announcements, action: :toggle, id: announcement), { class: "btn btn-block btn-sm btn-#{(announcement.published? ? 'success' : 'default')} ajax-toggle", id: "published-#{announcement.id}", data: {remote: true, method: 'post' } } %td= link_to 'Edit', edit_announcement_path(announcement), class: 'btn btn-block btn-sm btn-info' %td= link_to 'Destroy', announcement, :confirm => 'Are you sure?', :method => :delete, class: "btn btn-block btn-sm btn-danger" %br diff --git a/app/views/announcements/toggle.js.haml b/app/views/announcements/toggle.js.haml deleted file mode 100644 --- a/app/views/announcements/toggle.js.haml +++ /dev/null @@ -1,8 +0,0 @@ -:plain - var t = $("#published-#{@announcement.id}"); - t.removeClass('btn-default'); - t.removeClass('btn-success'); - t.removeClass('btn-warning'); - t.addClass("btn-#{@announcement.published? ? 'success' : 'default'}"); - t.attr("data-params","published=#{!@announcement.published?}"); - t.text("#{@announcement.published? ? "Yes" : "No"}"); diff --git a/app/views/application/_toggle_button.js.haml b/app/views/application/_toggle_button.js.haml new file mode 100644 --- /dev/null +++ b/app/views/application/_toggle_button.js.haml @@ -0,0 +1,7 @@ +:plain + var t = $("#{button_id}"); + t.removeClass('btn-default'); + t.removeClass('btn-success'); + t.removeClass('btn-warning'); + t.addClass("btn-#{button_on ? 'success' : 'default'}"); + t.text("#{button_on ? 'Yes' : 'No'}"); diff --git a/app/views/problems/index.html.haml b/app/views/problems/index.html.haml --- a/app/views/problems/index.html.haml +++ b/app/views/problems/index.html.haml @@ -16,7 +16,7 @@ %label{:for => "problem_full_name"} Full name = text_field 'problem', 'full_name' = submit_tag "Create" -%table.table.table-condensed.table-hover +%table.table.table-condense.table-hover %thead %th Name %th Full name @@ -33,14 +33,15 @@ %td= in_place_editor_field :problem, :full_name, {}, :rows=>1 %td= in_place_editor_field :problem, :full_score, {}, :rows=>1 %td= problem.date_added - %td{}= link_to (@problem.available? ? "Yes" : "No"), url_for(controller: :problems, action: :toggle, id: @problem), { class: "btn btn-block btn-sm btn-#{(@problem.available? ? 'success' : 'default')} ajax-toggle", id: "prob-#{@problem.id}-avail", data: {remote: true, method: 'post' } } + %td= toggle_button(@problem.available?, url_for(controller: :problems, action: :toggle, id: @problem), "problem-avail-#{@problem.id}") + //%td{}= link_to (@problem.available? ? "Yes" : "No"), url_for(controller: :problems, action: :toggle, id: @problem), { class: "btn btn-block btn-sm btn-#{(@problem.available? ? 'success' : 'default')} ajax-toggle", id: "problem-avail-#{@problem.id}", data: {remote: true, method: 'post' } } %td= problem.test_allowed - if GraderConfiguration.multicontests? %td = problem.contests.collect { |c| c.name }.join(', ') - %td= link_to 'Stat', {:action => 'stat', :id => problem.id}, class: 'btn btn-primary btn-sm' - %td= link_to 'Show', {:action => 'show', :id => problem}, class: 'btn btn-primary btn-sm' - %td= link_to 'Edit', {:action => 'edit', :id => problem}, class: 'btn btn-primary btn-sm' - %td= link_to 'Destroy', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :post, class: 'btn btn-danger btn-sm' + %td= link_to 'Stat', {:action => 'stat', :id => problem.id}, class: 'btn btn-info btn-xs btn-block' + %td= link_to 'Show', {:action => 'show', :id => problem}, class: 'btn btn-info btn-xs btn-block' + %td= link_to 'Edit', {:action => 'edit', :id => problem}, class: 'btn btn-info btn-xs btn-block' + %td= link_to 'Destroy', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :post, class: 'btn btn-danger btn-xs btn-block' %br/ = link_to '[New problem]', :action => 'new' diff --git a/app/views/problems/toggle.js.haml b/app/views/problems/toggle.js.haml --- a/app/views/problems/toggle.js.haml +++ b/app/views/problems/toggle.js.haml @@ -1,10 +1,6 @@ += render partial: 'toggle_button', + locals: {button_id: "#problem-avail-#{@problem.id}",button_on: @problem.available } :plain - b = $("#prob-#{@problem.id}-avail"); - b.removeClass('btn-default'); - b.removeClass('btn-success'); - b.removeClass('btn-warning'); - b.addClass("btn-#{@problem.available? ? 'success' : 'default'}"); - b.text("#{@problem.available? ? 'Yes' : 'No'}"); r = $("#prob-#{@problem.id}"); r.removeClass('success'); r.removeClass('danger'); diff --git a/app/views/user_admin/index.html.haml b/app/views/user_admin/index.html.haml new file mode 100644 --- /dev/null +++ b/app/views/user_admin/index.html.haml @@ -0,0 +1,86 @@ +%h1 Listing users +.submitbox + %b Quick add + = form_tag :action => 'create' do + %table{:border => "0"} + %tr + %td + %label{:for => "user_login"} Login + %td + %label{:for => "user_full_name"} Full name + %td + %label{:for => "user_password"} Password + %td + %label{:for => "user_password_confirmation"} Confirm + %td + %label{:for => "user_email"} Email + %tr + %td= text_field 'user', 'login', :size => 10 + %td= text_field 'user', 'full_name', :size => 30 + %td= password_field 'user', 'password', :size => 10 + %td= password_field 'user', 'password_confirmation', :size => 10 + %td= email_field 'user', 'email', :size => 15 + %td= submit_tag "Create" + %br/ + %b Import from site management + = form_tag({:action => 'import'}, :multipart => true) do + File: #{file_field_tag 'file'} #{submit_tag 'Import'} + %br/ + %b What else: + = link_to 'New user', {:action => 'new'}, { class: 'btn btn-default btn-sm'} + = link_to 'New list of users',{ :action => 'new_list'}, { class: 'btn btn-default btn-sm'} + = link_to 'View administrators',{ :action => 'admin'}, { class: 'btn btn-default btn-sm'} + = link_to 'Random passwords',{ :action => 'random_all_passwords'}, { class: 'btn btn-default btn-sm'} + = link_to 'View active users',{ :action => 'active'}, { class: 'btn btn-default btn-sm'} + = link_to 'Mass mailing',{ :action => 'mass_mailing'}, { class: 'btn btn-default btn-sm'} + - if GraderConfiguration.multicontests? + %br/ + %b Multi-contest: + = link_to '[Manage bulk users in contests]', :action => 'contest_management' + View users in: + - @contests.each do |contest| + = link_to "[#{contest.name}]", :action => 'contests', :id => contest.id + = link_to "[no contest]", :action => 'contests', :id => 'none' +Total #{@user_count} users | +- if !@paginated + Display all users. + \#{link_to '[show in pages]', :action => 'index', :page => '1'} +- else + Display in pages. + \#{link_to '[display all]', :action => 'index', :page => 'all'} | + \#{will_paginate @users, :container => false} + + +%table.table.table-hover.table-condense + %thead + %th Login + %th Full name + %th email + %th Remark + %th + Activated + %sup{class: 'text-primary',data: {toggle: 'tooltip', placement: 'top'}, title: 'User has already confirmed the email?' } [?] + %th + Enabled + %sup{class: 'text-primary',data: {toggle: 'tooltip', placement: 'top'}, title: 'Allow the user to login?' } [?] + %th Last IP + %th + %th + %th + %th + - for user in @users + %tr + %td= link_to user.login, controller: :users, :action => 'profile', :id => user + %td= user.full_name + %td= user.email + %td= user.remark + %td= toggle_button(user.activated?, toggle_activate_user_url(user),"toggle_activate_user_#{user.id}") + %td= toggle_button(user.enabled?, toggle_enable_user_url(user),"toggle_enable_user_#{user.id}") + %td= user.last_ip + %td= link_to 'Clear IP', {:action => 'clear_last_ip', :id => user, :page=>params[:page]}, :confirm => 'This will reset last logging in ip of the user, are you sure?', class: 'btn btn-default btn-xs btn-block' + %td= link_to 'Show', {:action => 'show', :id => user}, class: 'btn btn-default btn-xs btn-block' + %td= link_to 'Edit', {:action => 'edit', :id => user}, class: 'btn btn-default btn-xs btn-block' + %td= link_to 'Destroy', { :action => 'destroy', :id => user }, :confirm => 'Are you sure?', :method => :post, class: 'btn btn-danger btn-xs btn-block' +%br/ += link_to '[New user]', :action => 'new' += link_to '[New list of users]', :action => 'new_list' diff --git a/config/routes.rb b/config/routes.rb --- a/config/routes.rb +++ b/config/routes.rb @@ -1,19 +1,39 @@ CafeGrader::Application.routes.draw do root :to => 'main#login' - get "report/login" resources :contests - resources :announcements - match 'announcements/toggle/:id' => 'announcements#toggle' - resources :sites - resources :problem + resources :announcements do + member do + get 'toggle' + end + end + + + resources :problems do + member do + get 'toggle' + end + collection do + get 'turn_all_off' + get 'turn_all_on' + get 'import' + get 'manage' + end + end resources :grader_configuration, controller: 'configurations' + resources :users do + member do + get 'toggle_activate', 'toggle_enable' + end + end + + match 'tasks/view/:file.:ext' => 'tasks#view' match 'tasks/download/:id/:file.:ext' => 'tasks#download' match 'heartbeat/:id/edit' => 'heartbeat#edit' @@ -24,6 +44,7 @@ #report get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof' + get "report/login" # See how all your routes lay out with "rake routes"