diff --git a/Gemfile b/Gemfile --- a/Gemfile +++ b/Gemfile @@ -59,15 +59,16 @@ #syntax highlighter gem 'rouge' -#add bootstrap +#bootstrap add-ons gem 'bootstrap-sass', '~> 3.2.0' gem 'bootstrap-switch-rails' gem 'bootstrap-toggle-rails' gem 'autoprefixer-rails' - -#bootstrap sortable gem 'momentjs-rails' gem 'rails_bootstrap_sortable' +gem 'bootstrap-datepicker-rails' +gem 'bootstrap3-datetimepicker-rails' +gem 'jquery-datatables-rails' #----------- user interface ----------------- #select 2 diff --git a/Gemfile.lock b/Gemfile.lock --- a/Gemfile.lock +++ b/Gemfile.lock @@ -61,10 +61,14 @@ best_in_place (3.0.3) actionpack (>= 3.2) railties (>= 3.2) + bootstrap-datepicker-rails (1.7.1.1) + railties (>= 3.0) bootstrap-sass (3.2.0.2) sass (~> 3.2) bootstrap-switch-rails (3.3.3) bootstrap-toggle-rails (2.2.1.0) + bootstrap3-datetimepicker-rails (4.17.47) + momentjs-rails (>= 2.8.1) builder (3.2.2) coffee-rails (4.2.1) coffee-script (>= 2.2.0) @@ -97,6 +101,11 @@ i18n (0.7.0) in_place_editing (1.2.0) jquery-countdown-rails (2.0.2) + jquery-datatables-rails (3.4.0) + actionpack (>= 3.1) + jquery-rails + railties (>= 3.1) + sass-rails jquery-rails (4.2.1) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) @@ -201,9 +210,11 @@ activerecord-session_store autoprefixer-rails best_in_place (~> 3.0.1) + bootstrap-datepicker-rails bootstrap-sass (~> 3.2.0) bootstrap-switch-rails bootstrap-toggle-rails + bootstrap3-datetimepicker-rails coffee-rails dynamic_form fuzzy-string-match @@ -211,6 +222,7 @@ haml-rails in_place_editing jquery-countdown-rails + jquery-datatables-rails jquery-rails jquery-tablesorter jquery-timepicker-addon-rails @@ -232,4 +244,4 @@ yaml_db BUNDLED WITH - 1.13.6 + 1.15.4 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -12,10 +12,14 @@ // //= require jquery //= require jquery_ujs +//= require dataTables/jquery.dataTables +//= require dataTables/bootstrap/3/jquery.dataTables.bootstrap //= require jquery-ui //= require bootstrap-sprockets //= require moment +//= require moment/th //= require bootstrap-sortable +//= require bootstrap-datetimepicker //= require select2 //= require ace-rails-ap //= require ace/mode-c_cpp @@ -32,6 +36,8 @@ //= require best_in_place //= require best_in_place.jquery-ui //= require brython +//= require bootstrap-datepicker +//= require bootstrap-datetimepicker // since this is after blank line, it is not downloaded //x= require prototype diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss --- a/app/assets/stylesheets/application.css.scss +++ b/app/assets/stylesheets/application.css.scss @@ -33,6 +33,9 @@ //@import bootstrap3-switch @import "bootstrap-toggle"; @import "bootstrap-sortable"; +@import "bootstrap-datepicker3"; +@import "bootstrap-datetimepicker"; +@import "dataTables/bootstrap/3/jquery.dataTables.bootstrap"; //bootstrap navbar color (from) $bgDefault: #19197b; diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb --- a/app/controllers/login_controller.rb +++ b/app/controllers/login_controller.rb @@ -7,32 +7,38 @@ end def login - if (!GraderConfiguration['right.bypass_agreement']) and (!params[:accept_agree]) + user = User.authenticate(params[:login], params[:password]) + unless user + flash[:notice] = 'Wrong password' + redirect_to :controller => 'main', :action => 'login' + return + end + + if (!GraderConfiguration['right.bypass_agreement']) and (!params[:accept_agree]) and !user.admin? flash[:notice] = 'You must accept the agreement before logging in' redirect_to :controller => 'main', :action => 'login' - elsif user = User.authenticate(params[:login], params[:password]) - session[:user_id] = user.id - session[:admin] = user.admin? + return + end + + #process logging in + session[:user_id] = user.id + session[:admin] = user.admin? - # clear forced logout flag for multicontests contest change - if GraderConfiguration.multicontests? - contest_stat = user.contest_stat - if contest_stat.respond_to? :forced_logout - if contest_stat.forced_logout - contest_stat.forced_logout = false - contest_stat.save - end + # clear forced logout flag for multicontests contest change + if GraderConfiguration.multicontests? + contest_stat = user.contest_stat + if contest_stat.respond_to? :forced_logout + if contest_stat.forced_logout + contest_stat.forced_logout = false + contest_stat.save end end - - #save login information - Login.create(user_id: user.id, ip_address: request.remote_ip) + end - redirect_to :controller => 'main', :action => 'list' - else - flash[:notice] = 'Wrong password' - redirect_to :controller => 'main', :action => 'login' - end + #save login information + Login.create(user_id: user.id, ip_address: request.remote_ip) + + redirect_to :controller => 'main', :action => 'list' end def site_login 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 @@ -258,10 +258,7 @@ def change_date_added problems = get_problems_from_params - year = params[:date_added][:year].to_i - month = params[:date_added][:month].to_i - day = params[:date_added][:day].to_i - date = Date.new(year,month,day) + date = Date.parse(params[:date_added]) problems.each do |p| p.date_added = date p.save 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 @@ -24,6 +24,7 @@ @users = User.paginate :page => params[:page] @paginated = true end + @users = User.all @hidden_columns = ['hashed_password', 'salt', 'created_at', 'updated_at'] @contests = Contest.enabled end diff --git a/app/views/problems/manage.html.haml b/app/views/problems/manage.html.haml --- a/app/views/problems/manage.html.haml +++ b/app/views/problems/manage.html.haml @@ -47,22 +47,26 @@ What do you want to do to the selected problem? %br/ (You can shift-click to select a range of problems) - %ul + %ul.form-inline %li Change date added to - = select_date Date.current, :prefix => 'date_added' + .input-group.date + = text_field_tag :date_added, class: 'form-control' + %span.input-group-addon + %span.glyphicon.glyphicon-calendar + -# = select_date Date.current, :prefix => 'date_added'     - = submit_tag 'Change', :name => 'change_date_added', class: 'btn btn-default' + = submit_tag 'Change', :name => 'change_date_added', class: 'btn btn-primary btn-sm' %li Set available to - = submit_tag 'True', :name => 'enable_problem', class: 'btn btn-default' - = submit_tag 'False', :name => 'disable_problem', class: 'btn btn-default' + = submit_tag 'True', :name => 'enable_problem', class: 'btn btn-primary btn-sm' + = submit_tag 'False', :name => 'disable_problem', class: 'btn btn-primary btn-sm' - if GraderConfiguration.multicontests? %li Add to = select("contest","id",Contest.all.collect {|c| [c.title, c.id]}) - = submit_tag 'Add', :name => 'add_to_contest', class: 'btn btn-default' + = submit_tag 'Add', :name => 'add_to_contest', class: 'btn btn-primary btn-sm' %li Add problems to group = select_tag "group_id", options_from_collection_for_select( Group.all, 'id','name',params[:group_name]), id: 'group_name',class: 'select2' @@ -92,3 +96,12 @@ %td - problem.contests.each do |contest| = "(#{contest.name} [#{link_to 'x', :action => 'remove_contest', :id => problem.id, :contest_id => contest.id }])" + +:javascript + $('.input-group.date').datetimepicker({ + format: 'DD/MMM/YYYY', + showTodayButton: true, + widgetPositioning: {horizontal: 'auto', vertical: 'bottom'}, + + }); + diff --git a/app/views/problems/stat.html.haml b/app/views/problems/stat.html.haml --- a/app/views/problems/stat.html.haml +++ b/app/views/problems/stat.html.haml @@ -25,9 +25,9 @@ %h2 Submissions - if @submissions and @submissions.count > 0 - %table.info#main_table + %table#main_table.table.table-condensed.table-striped %thead - %tr.info-head + %tr %th ID %th Login %th Name @@ -40,14 +40,18 @@ - @submissions.each do |sub| - next unless sub.user - row_odd,curr = !row_odd, sub.user if curr != sub.user - %tr{class: row_odd ? "info-odd" : "info-even"} + %tr %td= link_to sub.id, submission_path(sub) %td= link_to sub.user.login, stat_user_path(sub.user) %td= sub.user.full_name - %td= time_ago_in_words(sub.submitted_at) + " ago" + %td{data: {order: sub.submitted_at}}= time_ago_in_words(sub.submitted_at) + " ago" %td= sub.points %td.fix-width= sub.grader_comment %td= sub.ip_address - else No submission +:javascript + $("#main_table").DataTable({ + paging: false + }); diff --git a/app/views/sites/edit.html.haml b/app/views/sites/edit.html.haml --- a/app/views/sites/edit.html.haml +++ b/app/views/sites/edit.html.haml @@ -1,24 +1,35 @@ %h1 Editing site = error_messages_for :site = form_for(@site) do |f| - %p - %b Name - %br/ - = f.text_field :name - %p - %b Password - %br/ - = f.text_field :password - %p - %b Started - %br/ - = f.check_box :started - %p - %b Start time - %br/ - = f.datetime_select :start_time, :include_blank => true - %p - = f.submit "Update" + .row + .col-md-4 + .form-group.field + = f.label :name, "Name" + = f.text_field :name, class: 'form-control' + .form-group.field + = f.label :password, "Password" + = f.text_field :password, class: 'form-control' + .form-group.field + = f.label :started, "Started" + = f.check_box :started, class: 'form-control' + .form-group.field + = f.label :start_time, "Start time" + -# = f.datetime_select :start_time, :include_blank => true + .input-group.date + = f.text_field :start_time, class:'form-control' , value: (@site.start_time ? @site.start_time.strftime('%d/%b/%Y %H:%M') : '') + %span.input-group-addon + %span.glyphicon.glyphicon-calendar + .actions + = f.submit "Update", class: 'btn btn-primary' + .col-md-8 + = link_to 'Show', @site | = link_to 'Back', sites_path + + +:javascript + $('.input-group.date').datetimepicker({ + format: 'DD/MMM/YYYY HH:mm', + }); + diff --git a/app/views/user_admin/index.html.haml b/app/views/user_admin/index.html.haml --- a/app/views/user_admin/index.html.haml +++ b/app/views/user_admin/index.html.haml @@ -1,4 +1,4 @@ -%h1 Listing users +%h1 Users .panel.panel-primary .panel-title.panel-heading @@ -41,8 +41,8 @@ %p = link_to '+ New user', { :action => 'new' }, { class: 'btn btn-success '} = link_to '+ New list of users', { :action => 'new_list' }, { class: 'btn btn-success '} + = link_to 'Bulk Manage', bulk_manage_user_admin_path , { class: 'btn btn-default btn-info'} = link_to 'View administrators',{ :action => 'admin'}, { class: 'btn btn-default '} - = link_to 'Bulk Manage', bulk_manage_user_admin_path , { class: 'btn btn-default '} = link_to 'Random passwords',{ :action => 'random_all_passwords'}, { class: 'btn btn-default '} = link_to 'View active users',{ :action => 'active'}, { class: 'btn btn-default '} = link_to 'Mass mailing',{ :action => 'mass_mailing'}, { class: 'btn btn-default '} @@ -56,17 +56,17 @@ = 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} +-# 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 +%table.table.table-hover.table-condense.datatable %thead %th Login %th Full name @@ -99,3 +99,8 @@ %br/ = link_to '+ New user', { :action => 'new' }, { class: 'btn btn-success '} = link_to '+ New list of users', { :action => 'new_list' }, { class: 'btn btn-success '} + +:javascript + $('.datatable').DataTable({ + 'pageLength': 50 + }); diff --git a/app/views/users/stat.html.haml b/app/views/users/stat.html.haml --- a/app/views/users/stat.html.haml +++ b/app/views/users/stat.html.haml @@ -36,7 +36,7 @@ =render partial: 'application/bar_graph', locals: {histogram: @histogram, param: {bar_width: 7}} -%table.tablesorter-cafe#submission_table +%table#submission_table.table.table-striped %thead %tr %th ID @@ -64,3 +64,7 @@ +:javascript + $("#submission_table").DataTable({ + paging: false + });