Description:
remove unnecessary gems
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r872:17032a7943cf - - 13 files changed: 33 inserted, 75 deleted

@@ -1,127 +1,124
1 source 'https://rubygems.org'
1 source 'https://rubygems.org'
2 git_source(:github) { |repo| "https://github.com/#{repo}.git" }
2 git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
3
4 ruby '3.1.2'
4 ruby '3.1.2'
5
5
6 #rails
6 #rails
7 gem 'rails', '~>7.0'
7 gem 'rails', '~>7.0'
8
8
9 # The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]
9 # The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]
10 gem "sprockets-rails"
10 gem "sprockets-rails"
11
11
12 gem 'activerecord-session_store'
12 gem 'activerecord-session_store'
13 gem 'puma'
13 gem 'puma'
14
14
15 # Reduces boot times through caching; required in config/boot.rb
15 # Reduces boot times through caching; required in config/boot.rb
16 gem 'bootsnap', require: false
16 gem 'bootsnap', require: false
17
17
18 # Bundle edge Rails instead:
18 # Bundle edge Rails instead:
19 # gem 'rails', :git => 'git://github.com/rails/rails.git'
19 # gem 'rails', :git => 'git://github.com/rails/rails.git'
20
20
21 #---------------- database ---------------------
21 #---------------- database ---------------------
22 #the database
22 #the database
23 gem 'mysql2'
23 gem 'mysql2'
24 #for testing
24 #for testing
25 gem 'sqlite3'
25 gem 'sqlite3'
26 #gem 'rails-controller-testing'
26 #gem 'rails-controller-testing'
27 #for dumping database into yaml
27 #for dumping database into yaml
28 #gem 'yaml_db'
28 #gem 'yaml_db'
29
29
30
30
31 #------------- assset pipeline -----------------
31 #------------- assset pipeline -----------------
32 # Gems used only for assets and not required
32 # Gems used only for assets and not required
33 # in production environments by default.
33 # in production environments by default.
34 #sass-rails is depricated
34 #sass-rails is depricated
35 #gem 'sass-rails'
35 #gem 'sass-rails'
36 gem 'sassc-rails'
36 gem 'sassc-rails'
37 gem 'coffee-rails'
37 gem 'coffee-rails'
38 gem 'material_icons'
38 gem 'material_icons'
39
39
40 # See https://github.com/sstephenson/execjs#readme for more supported runtimes
40 # See https://github.com/sstephenson/execjs#readme for more supported runtimes
41 # gem 'therubyracer', :platforms => :ruby
41 # gem 'therubyracer', :platforms => :ruby
42
42
43 gem "importmap-rails", "~> 1.1"
43 gem "importmap-rails", "~> 1.1"
44 # gem 'uglifier'
44 # gem 'uglifier'
45
45
46 gem 'haml'
46 gem 'haml'
47 gem 'haml-rails'
47 gem 'haml-rails'
48
48
49 # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
49 # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
50 #gem 'turbolinks', '~> 5'
50 #gem 'turbolinks', '~> 5'
51 # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
51 # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
52 gem 'jbuilder'
52 gem 'jbuilder'
53
53
54
54
55 #in-place editor
55 #in-place editor
56 gem 'best_in_place', git: "https://github.com/mmotherwell/best_in_place"
56 gem 'best_in_place', git: "https://github.com/mmotherwell/best_in_place"
57
57
58 # jquery addition
58 # jquery addition
59 gem 'jquery-rails'
59 gem 'jquery-rails'
60 #gem 'jquery-ui-rails'
60 #gem 'jquery-ui-rails'
61 #gem 'jquery-timepicker-addon-rails'
61 #gem 'jquery-timepicker-addon-rails'
62 #gem 'jquery-tablesorter'
62 #gem 'jquery-tablesorter'
63 #gem 'jquery-countdown-rails'
63 #gem 'jquery-countdown-rails'
64
64
65 #syntax highlighter
65 #syntax highlighter
66 gem 'rouge'
66 gem 'rouge'
67
67
68 #bootstrap add-ons
68 #bootstrap add-ons
69 #gem 'bootstrap-sass', '~> 3.4.1'
69 #gem 'bootstrap-sass', '~> 3.4.1'
70 gem 'bootstrap', '~> 5.2'
70 gem 'bootstrap', '~> 5.2'
71 #gem 'bootstrap-switch-rails'
71 #gem 'bootstrap-switch-rails'
72 #gem 'bootstrap-toggle-rails'
72 #gem 'bootstrap-toggle-rails'
73 #gem 'autoprefixer-rails'
73 #gem 'autoprefixer-rails'
74 gem 'momentjs-rails'
74 gem 'momentjs-rails'
75 #gem 'rails_bootstrap_sortable'
75 #gem 'rails_bootstrap_sortable'
76 #gem 'bootstrap-datepicker-rails'
76 #gem 'bootstrap-datepicker-rails'
77 #gem 'bootstrap3-datetimepicker-rails', '~> 4.17.47'
77 #gem 'bootstrap3-datetimepicker-rails', '~> 4.17.47'
78 #gem 'jquery-datatables-rails'
78 #gem 'jquery-datatables-rails'
79
79
80 #----------- user interface -----------------
80 #----------- user interface -----------------
81 gem 'simple_form'
81 gem 'simple_form'
82 #select 2
82 #select 2
83 #gem 'select2-rails'
83 #gem 'select2-rails'
84 #ace editor
84 #ace editor
85 gem 'ace-rails-ap'
85 gem 'ace-rails-ap'
86 #paginator
86 #paginator
87 #gem 'will_paginate', '~> 3.0.7'
87 #gem 'will_paginate', '~> 3.0.7'
88
88
89 gem 'mail'
89 gem 'mail'
90 - gem 'rdiscount'
90 + gem 'rdiscount' #markdown
91 - gem 'dynamic_form'
92 - gem 'in_place_editing'
93 - #gem 'verification', :git => 'https://github.com/sikachu/verification.git'
94
91
95
92
96 #---------------- testiing -----------------------
93 #---------------- testiing -----------------------
97 gem 'minitest-reporters'
94 gem 'minitest-reporters'
98
95
99 #---------------- for console --------------------
96 #---------------- for console --------------------
100 gem 'fuzzy-string-match'
97 gem 'fuzzy-string-match'
101
98
102
99
103 group :development, :test do
100 group :development, :test do
104 # Call 'byebug' anywhere in the code to stop execution and get a debugger console
101 # Call 'byebug' anywhere in the code to stop execution and get a debugger console
105 gem 'byebug'
102 gem 'byebug'
106 end
103 end
107
104
108 group :development do
105 group :development do
109 # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
106 # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
110 gem 'web-console', '>= 3.3.0'
107 gem 'web-console', '>= 3.3.0'
111 gem 'listen', '>= 3.0.5', '< 3.2'
108 gem 'listen', '>= 3.0.5', '< 3.2'
112 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
109 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
113 gem 'spring'
110 gem 'spring'
114 gem 'spring-watcher-listen', '~> 2.0.0'
111 gem 'spring-watcher-listen', '~> 2.0.0'
115
112
116 # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler]
113 # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler]
117 # gem "rack-mini-profiler"
114 # gem "rack-mini-profiler"
118 end
115 end
119
116
120 group :test do
117 group :test do
121 # Adds support for Capybara system testing and selenium driver
118 # Adds support for Capybara system testing and selenium driver
122 gem 'capybara'
119 gem 'capybara'
123 gem 'selenium-webdriver'
120 gem 'selenium-webdriver'
124 gem 'webdrivers'
121 gem 'webdrivers'
125 end
122 end
126
123
127
124
@@ -1,342 +1,340
1 GIT
1 GIT
2 remote: https://github.com/mmotherwell/best_in_place
2 remote: https://github.com/mmotherwell/best_in_place
3 revision: 88eb3052623a9a6cd346864d2aca05021c2f80d0
3 revision: 88eb3052623a9a6cd346864d2aca05021c2f80d0
4 specs:
4 specs:
5 best_in_place (3.1.1)
5 best_in_place (3.1.1)
6 actionpack (>= 3.2)
6 actionpack (>= 3.2)
7 railties (>= 3.2)
7 railties (>= 3.2)
8
8
9 GEM
9 GEM
10 remote: https://rubygems.org/
10 remote: https://rubygems.org/
11 specs:
11 specs:
12 RubyInline (3.12.6)
12 RubyInline (3.12.6)
13 ZenTest (~> 4.3)
13 ZenTest (~> 4.3)
14 ZenTest (4.12.1)
14 ZenTest (4.12.1)
15 ace-rails-ap (4.4)
15 ace-rails-ap (4.4)
16 actioncable (7.0.4)
16 actioncable (7.0.4)
17 actionpack (= 7.0.4)
17 actionpack (= 7.0.4)
18 activesupport (= 7.0.4)
18 activesupport (= 7.0.4)
19 nio4r (~> 2.0)
19 nio4r (~> 2.0)
20 websocket-driver (>= 0.6.1)
20 websocket-driver (>= 0.6.1)
21 actionmailbox (7.0.4)
21 actionmailbox (7.0.4)
22 actionpack (= 7.0.4)
22 actionpack (= 7.0.4)
23 activejob (= 7.0.4)
23 activejob (= 7.0.4)
24 activerecord (= 7.0.4)
24 activerecord (= 7.0.4)
25 activestorage (= 7.0.4)
25 activestorage (= 7.0.4)
26 activesupport (= 7.0.4)
26 activesupport (= 7.0.4)
27 mail (>= 2.7.1)
27 mail (>= 2.7.1)
28 net-imap
28 net-imap
29 net-pop
29 net-pop
30 net-smtp
30 net-smtp
31 actionmailer (7.0.4)
31 actionmailer (7.0.4)
32 actionpack (= 7.0.4)
32 actionpack (= 7.0.4)
33 actionview (= 7.0.4)
33 actionview (= 7.0.4)
34 activejob (= 7.0.4)
34 activejob (= 7.0.4)
35 activesupport (= 7.0.4)
35 activesupport (= 7.0.4)
36 mail (~> 2.5, >= 2.5.4)
36 mail (~> 2.5, >= 2.5.4)
37 net-imap
37 net-imap
38 net-pop
38 net-pop
39 net-smtp
39 net-smtp
40 rails-dom-testing (~> 2.0)
40 rails-dom-testing (~> 2.0)
41 actionpack (7.0.4)
41 actionpack (7.0.4)
42 actionview (= 7.0.4)
42 actionview (= 7.0.4)
43 activesupport (= 7.0.4)
43 activesupport (= 7.0.4)
44 rack (~> 2.0, >= 2.2.0)
44 rack (~> 2.0, >= 2.2.0)
45 rack-test (>= 0.6.3)
45 rack-test (>= 0.6.3)
46 rails-dom-testing (~> 2.0)
46 rails-dom-testing (~> 2.0)
47 rails-html-sanitizer (~> 1.0, >= 1.2.0)
47 rails-html-sanitizer (~> 1.0, >= 1.2.0)
48 actiontext (7.0.4)
48 actiontext (7.0.4)
49 actionpack (= 7.0.4)
49 actionpack (= 7.0.4)
50 activerecord (= 7.0.4)
50 activerecord (= 7.0.4)
51 activestorage (= 7.0.4)
51 activestorage (= 7.0.4)
52 activesupport (= 7.0.4)
52 activesupport (= 7.0.4)
53 globalid (>= 0.6.0)
53 globalid (>= 0.6.0)
54 nokogiri (>= 1.8.5)
54 nokogiri (>= 1.8.5)
55 actionview (7.0.4)
55 actionview (7.0.4)
56 activesupport (= 7.0.4)
56 activesupport (= 7.0.4)
57 builder (~> 3.1)
57 builder (~> 3.1)
58 erubi (~> 1.4)
58 erubi (~> 1.4)
59 rails-dom-testing (~> 2.0)
59 rails-dom-testing (~> 2.0)
60 rails-html-sanitizer (~> 1.1, >= 1.2.0)
60 rails-html-sanitizer (~> 1.1, >= 1.2.0)
61 activejob (7.0.4)
61 activejob (7.0.4)
62 activesupport (= 7.0.4)
62 activesupport (= 7.0.4)
63 globalid (>= 0.3.6)
63 globalid (>= 0.3.6)
64 activemodel (7.0.4)
64 activemodel (7.0.4)
65 activesupport (= 7.0.4)
65 activesupport (= 7.0.4)
66 activerecord (7.0.4)
66 activerecord (7.0.4)
67 activemodel (= 7.0.4)
67 activemodel (= 7.0.4)
68 activesupport (= 7.0.4)
68 activesupport (= 7.0.4)
69 activerecord-session_store (2.0.0)
69 activerecord-session_store (2.0.0)
70 actionpack (>= 5.2.4.1)
70 actionpack (>= 5.2.4.1)
71 activerecord (>= 5.2.4.1)
71 activerecord (>= 5.2.4.1)
72 multi_json (~> 1.11, >= 1.11.2)
72 multi_json (~> 1.11, >= 1.11.2)
73 rack (>= 2.0.8, < 3)
73 rack (>= 2.0.8, < 3)
74 railties (>= 5.2.4.1)
74 railties (>= 5.2.4.1)
75 activestorage (7.0.4)
75 activestorage (7.0.4)
76 actionpack (= 7.0.4)
76 actionpack (= 7.0.4)
77 activejob (= 7.0.4)
77 activejob (= 7.0.4)
78 activerecord (= 7.0.4)
78 activerecord (= 7.0.4)
79 activesupport (= 7.0.4)
79 activesupport (= 7.0.4)
80 marcel (~> 1.0)
80 marcel (~> 1.0)
81 mini_mime (>= 1.1.0)
81 mini_mime (>= 1.1.0)
82 activesupport (7.0.4)
82 activesupport (7.0.4)
83 concurrent-ruby (~> 1.0, >= 1.0.2)
83 concurrent-ruby (~> 1.0, >= 1.0.2)
84 i18n (>= 1.6, < 2)
84 i18n (>= 1.6, < 2)
85 minitest (>= 5.1)
85 minitest (>= 5.1)
86 tzinfo (~> 2.0)
86 tzinfo (~> 2.0)
87 addressable (2.8.1)
87 addressable (2.8.1)
88 public_suffix (>= 2.0.2, < 6.0)
88 public_suffix (>= 2.0.2, < 6.0)
89 ansi (1.5.0)
89 ansi (1.5.0)
90 autoprefixer-rails (10.4.7.0)
90 autoprefixer-rails (10.4.7.0)
91 execjs (~> 2)
91 execjs (~> 2)
92 bindex (0.8.1)
92 bindex (0.8.1)
93 bootsnap (1.13.0)
93 bootsnap (1.13.0)
94 msgpack (~> 1.2)
94 msgpack (~> 1.2)
95 bootstrap (5.2.1)
95 bootstrap (5.2.1)
96 autoprefixer-rails (>= 9.1.0)
96 autoprefixer-rails (>= 9.1.0)
97 popper_js (>= 2.11.6, < 3)
97 popper_js (>= 2.11.6, < 3)
98 sassc-rails (>= 2.0.0)
98 sassc-rails (>= 2.0.0)
99 builder (3.2.4)
99 builder (3.2.4)
100 byebug (11.1.3)
100 byebug (11.1.3)
101 capybara (3.37.1)
101 capybara (3.37.1)
102 addressable
102 addressable
103 matrix
103 matrix
104 mini_mime (>= 0.1.3)
104 mini_mime (>= 0.1.3)
105 nokogiri (~> 1.8)
105 nokogiri (~> 1.8)
106 rack (>= 1.6.0)
106 rack (>= 1.6.0)
107 rack-test (>= 0.6.3)
107 rack-test (>= 0.6.3)
108 regexp_parser (>= 1.5, < 3.0)
108 regexp_parser (>= 1.5, < 3.0)
109 xpath (~> 3.2)
109 xpath (~> 3.2)
110 childprocess (4.1.0)
110 childprocess (4.1.0)
111 coffee-rails (5.0.0)
111 coffee-rails (5.0.0)
112 coffee-script (>= 2.2.0)
112 coffee-script (>= 2.2.0)
113 railties (>= 5.2.0)
113 railties (>= 5.2.0)
114 coffee-script (2.4.1)
114 coffee-script (2.4.1)
115 coffee-script-source
115 coffee-script-source
116 execjs
116 execjs
117 coffee-script-source (1.12.2)
117 coffee-script-source (1.12.2)
118 concurrent-ruby (1.1.10)
118 concurrent-ruby (1.1.10)
119 crass (1.0.6)
119 crass (1.0.6)
120 digest (3.1.0)
120 digest (3.1.0)
121 - dynamic_form (1.1.4)
122 erubi (1.11.0)
121 erubi (1.11.0)
123 erubis (2.7.0)
122 erubis (2.7.0)
124 execjs (2.8.1)
123 execjs (2.8.1)
125 ffi (1.15.5)
124 ffi (1.15.5)
126 fuzzy-string-match (1.0.1)
125 fuzzy-string-match (1.0.1)
127 RubyInline (>= 3.8.6)
126 RubyInline (>= 3.8.6)
128 globalid (1.0.0)
127 globalid (1.0.0)
129 activesupport (>= 5.0)
128 activesupport (>= 5.0)
130 haml (5.2.2)
129 haml (5.2.2)
131 temple (>= 0.8.0)
130 temple (>= 0.8.0)
132 tilt
131 tilt
133 haml-rails (2.0.1)
132 haml-rails (2.0.1)
134 actionpack (>= 5.1)
133 actionpack (>= 5.1)
135 activesupport (>= 5.1)
134 activesupport (>= 5.1)
136 haml (>= 4.0.6, < 6.0)
135 haml (>= 4.0.6, < 6.0)
137 html2haml (>= 1.0.1)
136 html2haml (>= 1.0.1)
138 railties (>= 5.1)
137 railties (>= 5.1)
139 html2haml (2.2.0)
138 html2haml (2.2.0)
140 erubis (~> 2.7.0)
139 erubis (~> 2.7.0)
141 haml (>= 4.0, < 6)
140 haml (>= 4.0, < 6)
142 nokogiri (>= 1.6.0)
141 nokogiri (>= 1.6.0)
143 ruby_parser (~> 3.5)
142 ruby_parser (~> 3.5)
144 i18n (1.12.0)
143 i18n (1.12.0)
145 concurrent-ruby (~> 1.0)
144 concurrent-ruby (~> 1.0)
146 importmap-rails (1.1.5)
145 importmap-rails (1.1.5)
147 actionpack (>= 6.0.0)
146 actionpack (>= 6.0.0)
148 railties (>= 6.0.0)
147 railties (>= 6.0.0)
149 in_place_editing (1.2.0)
148 in_place_editing (1.2.0)
150 jbuilder (2.11.5)
149 jbuilder (2.11.5)
151 actionview (>= 5.0.0)
150 actionview (>= 5.0.0)
152 activesupport (>= 5.0.0)
151 activesupport (>= 5.0.0)
153 jquery-rails (4.5.0)
152 jquery-rails (4.5.0)
154 rails-dom-testing (>= 1, < 3)
153 rails-dom-testing (>= 1, < 3)
155 railties (>= 4.2.0)
154 railties (>= 4.2.0)
156 thor (>= 0.14, < 2.0)
155 thor (>= 0.14, < 2.0)
157 listen (3.0.8)
156 listen (3.0.8)
158 rb-fsevent (~> 0.9, >= 0.9.4)
157 rb-fsevent (~> 0.9, >= 0.9.4)
159 rb-inotify (~> 0.9, >= 0.9.7)
158 rb-inotify (~> 0.9, >= 0.9.7)
160 loofah (2.19.0)
159 loofah (2.19.0)
161 crass (~> 1.0.2)
160 crass (~> 1.0.2)
162 nokogiri (>= 1.5.9)
161 nokogiri (>= 1.5.9)
163 mail (2.7.1)
162 mail (2.7.1)
164 mini_mime (>= 0.1.1)
163 mini_mime (>= 0.1.1)
165 marcel (1.0.2)
164 marcel (1.0.2)
166 material_icons (2.2.1)
165 material_icons (2.2.1)
167 railties (>= 3.2)
166 railties (>= 3.2)
168 matrix (0.4.2)
167 matrix (0.4.2)
169 method_source (1.0.0)
168 method_source (1.0.0)
170 mini_mime (1.1.2)
169 mini_mime (1.1.2)
171 minitest (5.16.3)
170 minitest (5.16.3)
172 minitest-reporters (1.5.0)
171 minitest-reporters (1.5.0)
173 ansi
172 ansi
174 builder
173 builder
175 minitest (>= 5.0)
174 minitest (>= 5.0)
176 ruby-progressbar
175 ruby-progressbar
177 momentjs-rails (2.29.4.1)
176 momentjs-rails (2.29.4.1)
178 railties (>= 3.1)
177 railties (>= 3.1)
179 msgpack (1.5.6)
178 msgpack (1.5.6)
180 multi_json (1.15.0)
179 multi_json (1.15.0)
181 mysql2 (0.5.4)
180 mysql2 (0.5.4)
182 net-imap (0.2.3)
181 net-imap (0.2.3)
183 digest
182 digest
184 net-protocol
183 net-protocol
185 strscan
184 strscan
186 net-pop (0.1.1)
185 net-pop (0.1.1)
187 digest
186 digest
188 net-protocol
187 net-protocol
189 timeout
188 timeout
190 net-protocol (0.1.3)
189 net-protocol (0.1.3)
191 timeout
190 timeout
192 net-smtp (0.3.1)
191 net-smtp (0.3.1)
193 digest
192 digest
194 net-protocol
193 net-protocol
195 timeout
194 timeout
196 nio4r (2.5.8)
195 nio4r (2.5.8)
197 nokogiri (1.13.8-x86_64-linux)
196 nokogiri (1.13.8-x86_64-linux)
198 racc (~> 1.4)
197 racc (~> 1.4)
199 popper_js (2.11.6)
198 popper_js (2.11.6)
200 public_suffix (5.0.0)
199 public_suffix (5.0.0)
201 puma (5.6.5)
200 puma (5.6.5)
202 nio4r (~> 2.0)
201 nio4r (~> 2.0)
203 racc (1.6.0)
202 racc (1.6.0)
204 rack (2.2.4)
203 rack (2.2.4)
205 rack-test (2.0.2)
204 rack-test (2.0.2)
206 rack (>= 1.3)
205 rack (>= 1.3)
207 rails (7.0.4)
206 rails (7.0.4)
208 actioncable (= 7.0.4)
207 actioncable (= 7.0.4)
209 actionmailbox (= 7.0.4)
208 actionmailbox (= 7.0.4)
210 actionmailer (= 7.0.4)
209 actionmailer (= 7.0.4)
211 actionpack (= 7.0.4)
210 actionpack (= 7.0.4)
212 actiontext (= 7.0.4)
211 actiontext (= 7.0.4)
213 actionview (= 7.0.4)
212 actionview (= 7.0.4)
214 activejob (= 7.0.4)
213 activejob (= 7.0.4)
215 activemodel (= 7.0.4)
214 activemodel (= 7.0.4)
216 activerecord (= 7.0.4)
215 activerecord (= 7.0.4)
217 activestorage (= 7.0.4)
216 activestorage (= 7.0.4)
218 activesupport (= 7.0.4)
217 activesupport (= 7.0.4)
219 bundler (>= 1.15.0)
218 bundler (>= 1.15.0)
220 railties (= 7.0.4)
219 railties (= 7.0.4)
221 rails-dom-testing (2.0.3)
220 rails-dom-testing (2.0.3)
222 activesupport (>= 4.2.0)
221 activesupport (>= 4.2.0)
223 nokogiri (>= 1.6)
222 nokogiri (>= 1.6)
224 rails-html-sanitizer (1.4.3)
223 rails-html-sanitizer (1.4.3)
225 loofah (~> 2.3)
224 loofah (~> 2.3)
226 railties (7.0.4)
225 railties (7.0.4)
227 actionpack (= 7.0.4)
226 actionpack (= 7.0.4)
228 activesupport (= 7.0.4)
227 activesupport (= 7.0.4)
229 method_source
228 method_source
230 rake (>= 12.2)
229 rake (>= 12.2)
231 thor (~> 1.0)
230 thor (~> 1.0)
232 zeitwerk (~> 2.5)
231 zeitwerk (~> 2.5)
233 rake (13.0.6)
232 rake (13.0.6)
234 rb-fsevent (0.11.2)
233 rb-fsevent (0.11.2)
235 rb-inotify (0.10.1)
234 rb-inotify (0.10.1)
236 ffi (~> 1.0)
235 ffi (~> 1.0)
237 rdiscount (2.2.0.2)
236 rdiscount (2.2.0.2)
238 regexp_parser (2.5.0)
237 regexp_parser (2.5.0)
239 rexml (3.2.5)
238 rexml (3.2.5)
240 rouge (4.0.0)
239 rouge (4.0.0)
241 ruby-progressbar (1.11.0)
240 ruby-progressbar (1.11.0)
242 ruby_parser (3.19.1)
241 ruby_parser (3.19.1)
243 sexp_processor (~> 4.16)
242 sexp_processor (~> 4.16)
244 rubyzip (2.3.2)
243 rubyzip (2.3.2)
245 sassc (2.4.0)
244 sassc (2.4.0)
246 ffi (~> 1.9)
245 ffi (~> 1.9)
247 sassc-rails (2.1.2)
246 sassc-rails (2.1.2)
248 railties (>= 4.0.0)
247 railties (>= 4.0.0)
249 sassc (>= 2.0)
248 sassc (>= 2.0)
250 sprockets (> 3.0)
249 sprockets (> 3.0)
251 sprockets-rails
250 sprockets-rails
252 tilt
251 tilt
253 selenium-webdriver (4.4.0)
252 selenium-webdriver (4.4.0)
254 childprocess (>= 0.5, < 5.0)
253 childprocess (>= 0.5, < 5.0)
255 rexml (~> 3.2, >= 3.2.5)
254 rexml (~> 3.2, >= 3.2.5)
256 rubyzip (>= 1.2.2, < 3.0)
255 rubyzip (>= 1.2.2, < 3.0)
257 websocket (~> 1.0)
256 websocket (~> 1.0)
258 sexp_processor (4.16.1)
257 sexp_processor (4.16.1)
259 simple_form (5.1.0)
258 simple_form (5.1.0)
260 actionpack (>= 5.2)
259 actionpack (>= 5.2)
261 activemodel (>= 5.2)
260 activemodel (>= 5.2)
262 spring (2.1.1)
261 spring (2.1.1)
263 spring-watcher-listen (2.0.1)
262 spring-watcher-listen (2.0.1)
264 listen (>= 2.7, < 4.0)
263 listen (>= 2.7, < 4.0)
265 spring (>= 1.2, < 3.0)
264 spring (>= 1.2, < 3.0)
266 sprockets (4.1.1)
265 sprockets (4.1.1)
267 concurrent-ruby (~> 1.0)
266 concurrent-ruby (~> 1.0)
268 rack (> 1, < 3)
267 rack (> 1, < 3)
269 sprockets-rails (3.4.2)
268 sprockets-rails (3.4.2)
270 actionpack (>= 5.2)
269 actionpack (>= 5.2)
271 activesupport (>= 5.2)
270 activesupport (>= 5.2)
272 sprockets (>= 3.0.0)
271 sprockets (>= 3.0.0)
273 sqlite3 (1.5.0-x86_64-linux)
272 sqlite3 (1.5.0-x86_64-linux)
274 strscan (3.0.4)
273 strscan (3.0.4)
275 temple (0.8.2)
274 temple (0.8.2)
276 thor (1.2.1)
275 thor (1.2.1)
277 tilt (2.0.11)
276 tilt (2.0.11)
278 timeout (0.3.0)
277 timeout (0.3.0)
279 tzinfo (2.0.5)
278 tzinfo (2.0.5)
280 concurrent-ruby (~> 1.0)
279 concurrent-ruby (~> 1.0)
281 web-console (4.2.0)
280 web-console (4.2.0)
282 actionview (>= 6.0.0)
281 actionview (>= 6.0.0)
283 activemodel (>= 6.0.0)
282 activemodel (>= 6.0.0)
284 bindex (>= 0.4.0)
283 bindex (>= 0.4.0)
285 railties (>= 6.0.0)
284 railties (>= 6.0.0)
286 webdrivers (5.1.0)
285 webdrivers (5.1.0)
287 nokogiri (~> 1.6)
286 nokogiri (~> 1.6)
288 rubyzip (>= 1.3.0)
287 rubyzip (>= 1.3.0)
289 selenium-webdriver (~> 4.0)
288 selenium-webdriver (~> 4.0)
290 websocket (1.2.9)
289 websocket (1.2.9)
291 websocket-driver (0.7.5)
290 websocket-driver (0.7.5)
292 websocket-extensions (>= 0.1.0)
291 websocket-extensions (>= 0.1.0)
293 websocket-extensions (0.1.5)
292 websocket-extensions (0.1.5)
294 xpath (3.2.0)
293 xpath (3.2.0)
295 nokogiri (~> 1.8)
294 nokogiri (~> 1.8)
296 zeitwerk (2.6.0)
295 zeitwerk (2.6.0)
297
296
298 PLATFORMS
297 PLATFORMS
299 x86_64-linux
298 x86_64-linux
300
299
301 DEPENDENCIES
300 DEPENDENCIES
302 ace-rails-ap
301 ace-rails-ap
303 activerecord-session_store
302 activerecord-session_store
304 best_in_place!
303 best_in_place!
305 bootsnap
304 bootsnap
306 bootstrap (~> 5.2)
305 bootstrap (~> 5.2)
307 byebug
306 byebug
308 capybara
307 capybara
309 coffee-rails
308 coffee-rails
310 - dynamic_form
311 fuzzy-string-match
309 fuzzy-string-match
312 haml
310 haml
313 haml-rails
311 haml-rails
314 importmap-rails (~> 1.1)
312 importmap-rails (~> 1.1)
315 in_place_editing
313 in_place_editing
316 jbuilder
314 jbuilder
317 jquery-rails
315 jquery-rails
318 listen (>= 3.0.5, < 3.2)
316 listen (>= 3.0.5, < 3.2)
319 mail
317 mail
320 material_icons
318 material_icons
321 minitest-reporters
319 minitest-reporters
322 momentjs-rails
320 momentjs-rails
323 mysql2
321 mysql2
324 puma
322 puma
325 rails (~> 7.0)
323 rails (~> 7.0)
326 rdiscount
324 rdiscount
327 rouge
325 rouge
328 sassc-rails
326 sassc-rails
329 selenium-webdriver
327 selenium-webdriver
330 simple_form
328 simple_form
331 spring
329 spring
332 spring-watcher-listen (~> 2.0.0)
330 spring-watcher-listen (~> 2.0.0)
333 sprockets-rails
331 sprockets-rails
334 sqlite3
332 sqlite3
335 web-console (>= 3.3.0)
333 web-console (>= 3.3.0)
336 webdrivers
334 webdrivers
337
335
338 RUBY VERSION
336 RUBY VERSION
339 ruby 3.1.2p20
337 ruby 3.1.2p20
340
338
341 BUNDLED WITH
339 BUNDLED WITH
342 2.3.22
340 2.3.22
@@ -1,416 +1,424
1
1
2 .secondnavbar {
2 .secondnavbar {
3 top: 50px;
3 top: 50px;
4 }
4 }
5
5
6 +
7 + //for google material design
8 + .mi-bs {
9 + vertical-align: middle;
10 + position: relative;
11 + top: -3px;
12 + }
13 +
6 // --------------- bootstrap file upload ----------------------
14 // --------------- bootstrap file upload ----------------------
7 .btn-file {
15 .btn-file {
8 position: relative;
16 position: relative;
9 overflow: hidden;
17 overflow: hidden;
10 }
18 }
11
19
12 .btn-file input[type=file] {
20 .btn-file input[type=file] {
13 position: absolute;
21 position: absolute;
14 top: 0;
22 top: 0;
15 right: 0;
23 right: 0;
16 min-width: 100%;
24 min-width: 100%;
17 min-height: 100%;
25 min-height: 100%;
18 font-size: 100px;
26 font-size: 100px;
19 text-align: right;
27 text-align: right;
20 filter: alpha(opacity = 0);
28 filter: alpha(opacity = 0);
21 opacity: 0;
29 opacity: 0;
22 outline: none;
30 outline: none;
23 background: white;
31 background: white;
24 cursor: inherit;
32 cursor: inherit;
25 display: block;
33 display: block;
26 }
34 }
27
35
28 body {
36 body {
29 //font-size: 13px
37 //font-size: 13px
30 font-family: 'Krub', Tahoma, "sans-serif";
38 font-family: 'Krub', Tahoma, "sans-serif";
31 margin: 10px;
39 margin: 10px;
32 padding: 10px;
40 padding: 10px;
33 padding-top: 60px;
41 padding-top: 60px;
34 }
42 }
35
43
36 // ------------------ bootstrap sortable --------------------
44 // ------------------ bootstrap sortable --------------------
37 table.sortable th {
45 table.sortable th {
38 padding-right: 20px !important;
46 padding-right: 20px !important;
39
47
40 span.sign {
48 span.sign {
41 right: (-15px) !important;
49 right: (-15px) !important;
42 }
50 }
43
51
44 &.text-right {
52 &.text-right {
45 padding-left: 20px !important;
53 padding-left: 20px !important;
46 padding-right: 8px !important;
54 padding-right: 8px !important;
47
55
48 &:after, span.sign {
56 &:after, span.sign {
49 left: (-15px) !important;
57 left: (-15px) !important;
50 }
58 }
51 }
59 }
52 }
60 }
53
61
54 input {
62 input {
55 font-family: Tahoma, "sans-serif";
63 font-family: Tahoma, "sans-serif";
56 }
64 }
57
65
58 h1 {
66 h1 {
59 color: #334488;
67 color: #334488;
60 }
68 }
61
69
62 h2 {
70 h2 {
63 color: #5566bb;
71 color: #5566bb;
64 }
72 }
65
73
66 hr {
74 hr {
67 border-top: 1px solid #dddddd;
75 border-top: 1px solid #dddddd;
68 border-bottom: 1px solid #eeeeee;
76 border-bottom: 1px solid #eeeeee;
69 }
77 }
70
78
71 //#a
79 //#a
72 // color: #6666cc
80 // color: #6666cc
73 // text-decoration: none
81 // text-decoration: none
74 //
82 //
75 // &:link, &:visited
83 // &:link, &:visited
76 // color: #6666cc
84 // color: #6666cc
77 // text-decoration: none
85 // text-decoration: none
78 //
86 //
79 // &:hover, &:focus
87 // &:hover, &:focus
80 // color: #111166
88 // color: #111166
81 // text-decoration: none
89 // text-decoration: none
82
90
83 div {
91 div {
84 &.userbar {
92 &.userbar {
85 line-height: 1.5em;
93 line-height: 1.5em;
86 text-align: right;
94 text-align: right;
87 font-size: 12px;
95 font-size: 12px;
88 }
96 }
89
97
90 &.title {
98 &.title {
91 padding: 10px 0px;
99 padding: 10px 0px;
92 line-height: 1.5em;
100 line-height: 1.5em;
93 font-size: 13px;
101 font-size: 13px;
94
102
95 span.contest-over-msg {
103 span.contest-over-msg {
96 font-size: 15px;
104 font-size: 15px;
97 color: red;
105 color: red;
98 }
106 }
99
107
100 table {
108 table {
101 width: 100%;
109 width: 100%;
102 font-weight: bold;
110 font-weight: bold;
103 }
111 }
104
112
105 td {
113 td {
106 &.left-col {
114 &.left-col {
107 text-align: left;
115 text-align: left;
108 vertical-align: top;
116 vertical-align: top;
109 color: #444444;
117 color: #444444;
110 }
118 }
111
119
112 &.right-col {
120 &.right-col {
113 text-align: right;
121 text-align: right;
114 vertical-align: top;
122 vertical-align: top;
115 font-size: 18px;
123 font-size: 18px;
116 color: #116699;
124 color: #116699;
117 }
125 }
118 }
126 }
119 }
127 }
120 }
128 }
121
129
122 table.info {
130 table.info {
123 margin: 10px 0;
131 margin: 10px 0;
124 border: 1px solid #666666;
132 border: 1px solid #666666;
125 border-collapse: collapse;
133 border-collapse: collapse;
126 font-size: 12px;
134 font-size: 12px;
127
135
128 th {
136 th {
129 border: 1px solid #666666;
137 border: 1px solid #666666;
130 line-height: 1.5em;
138 line-height: 1.5em;
131 padding: 0 0.5em;
139 padding: 0 0.5em;
132 }
140 }
133
141
134 td {
142 td {
135 border-left: 1px solid #666666;
143 border-left: 1px solid #666666;
136 border-right: 1px solid #666666;
144 border-right: 1px solid #666666;
137 line-height: 1.5em;
145 line-height: 1.5em;
138 padding: 0 0.5em;
146 padding: 0 0.5em;
139 }
147 }
140 }
148 }
141
149
142 tr {
150 tr {
143 &.info-head {
151 &.info-head {
144 background: #777777;
152 background: #777777;
145 color: white;
153 color: white;
146 }
154 }
147
155
148 &.info-odd {
156 &.info-odd {
149 background: #eeeeee;
157 background: #eeeeee;
150 }
158 }
151
159
152 &.info-even {
160 &.info-even {
153 background: #fcfcfc;
161 background: #fcfcfc;
154 }
162 }
155 }
163 }
156
164
157 @mixin basicbox {
165 @mixin basicbox {
158 background: #eeeeff;
166 background: #eeeeff;
159 border: 1px dotted #99aaee;
167 border: 1px dotted #99aaee;
160 padding: 5px;
168 padding: 5px;
161 margin: 10px 0px;
169 margin: 10px 0px;
162 color: black;
170 color: black;
163 font-size: 13px;
171 font-size: 13px;
164 }
172 }
165
173
166 .infobox {
174 .infobox {
167 @include basicbox;
175 @include basicbox;
168 }
176 }
169
177
170 .submitbox {
178 .submitbox {
171 @include basicbox;
179 @include basicbox;
172 }
180 }
173
181
174 .errorExplanation {
182 .errorExplanation {
175 border: 1px dotted gray;
183 border: 1px dotted gray;
176 color: #bb2222;
184 color: #bb2222;
177 padding: 5px 15px 5px 15px;
185 padding: 5px 15px 5px 15px;
178 margin-bottom: 5px;
186 margin-bottom: 5px;
179 background-color: white;
187 background-color: white;
180 font-weight: normal;
188 font-weight: normal;
181
189
182 h2 {
190 h2 {
183 color: #cc1111;
191 color: #cc1111;
184 font-weight: bold;
192 font-weight: bold;
185 }
193 }
186 }
194 }
187
195
188 table.uinfo {
196 table.uinfo {
189 border-collapse: collapse;
197 border-collapse: collapse;
190 border: 1px solid black;
198 border: 1px solid black;
191 font-size: 13px;
199 font-size: 13px;
192 }
200 }
193
201
194 td.uinfo {
202 td.uinfo {
195 vertical-align: top;
203 vertical-align: top;
196 border: 1px solid black;
204 border: 1px solid black;
197 padding: 5px;
205 padding: 5px;
198 }
206 }
199
207
200 th.uinfo {
208 th.uinfo {
201 background: lightgreen;
209 background: lightgreen;
202 vertical-align: top;
210 vertical-align: top;
203 text-align: right;
211 text-align: right;
204 border: 1px solid black;
212 border: 1px solid black;
205 padding: 5px;
213 padding: 5px;
206 }
214 }
207
215
208 div {
216 div {
209 &.compilermsgbody {
217 &.compilermsgbody {
210 font-family: monospace;
218 font-family: monospace;
211 }
219 }
212
220
213 &.task-menu {
221 &.task-menu {
214 text-align: center;
222 text-align: center;
215 font-size: 13px;
223 font-size: 13px;
216 line-height: 1.75em;
224 line-height: 1.75em;
217 font-weight: bold;
225 font-weight: bold;
218 border-top: 1px dashed gray;
226 border-top: 1px dashed gray;
219 border-bottom: 1px dashed gray;
227 border-bottom: 1px dashed gray;
220 margin-top: 2px;
228 margin-top: 2px;
221 margin-bottom: 4px;
229 margin-bottom: 4px;
222 }
230 }
223 }
231 }
224
232
225 table.taskdesc {
233 table.taskdesc {
226 border: 2px solid #dddddd;
234 border: 2px solid #dddddd;
227 border-collapse: collapse;
235 border-collapse: collapse;
228 margin: 10px auto;
236 margin: 10px auto;
229 width: 90%;
237 width: 90%;
230 font-size: 13px;
238 font-size: 13px;
231
239
232 p {
240 p {
233 font-size: 13px;
241 font-size: 13px;
234 }
242 }
235
243
236 tr.name {
244 tr.name {
237 border: 2px solid #dddddd;
245 border: 2px solid #dddddd;
238 background: #dddddd;
246 background: #dddddd;
239 color: #333333;
247 color: #333333;
240 font-weight: bold;
248 font-weight: bold;
241 font-size: 14px;
249 font-size: 14px;
242 line-height: 1.5em;
250 line-height: 1.5em;
243 text-align: center;
251 text-align: center;
244 }
252 }
245
253
246 td {
254 td {
247 &.desc-odd {
255 &.desc-odd {
248 padding: 5px;
256 padding: 5px;
249 padding-left: 20px;
257 padding-left: 20px;
250 background: #fefeee;
258 background: #fefeee;
251 }
259 }
252
260
253 &.desc-even {
261 &.desc-even {
254 padding: 5px;
262 padding: 5px;
255 padding-left: 20px;
263 padding-left: 20px;
256 background: #feeefe;
264 background: #feeefe;
257 }
265 }
258 }
266 }
259 }
267 }
260
268
261 .announcementbox {
269 .announcementbox {
262 margin: 10px 0px;
270 margin: 10px 0px;
263 background: #bbddee;
271 background: #bbddee;
264 padding: 1px;
272 padding: 1px;
265
273
266 span.title {
274 span.title {
267 font-weight: bold;
275 font-weight: bold;
268 color: #224455;
276 color: #224455;
269 padding-left: 10px;
277 padding-left: 10px;
270 line-height: 1.6em;
278 line-height: 1.6em;
271 }
279 }
272 }
280 }
273
281
274 .announcement {
282 .announcement {
275 margin: 2px;
283 margin: 2px;
276 background: white;
284 background: white;
277 padding: 1px;
285 padding: 1px;
278 padding-left: 10px;
286 padding-left: 10px;
279 padding-right: 10px;
287 padding-right: 10px;
280 padding-top: 5px;
288 padding-top: 5px;
281 padding-bottom: 5px;
289 padding-bottom: 5px;
282 }
290 }
283
291
284 .announcement p {
292 .announcement p {
285 font-size: 12px;
293 font-size: 12px;
286 margin: 2px;
294 margin: 2px;
287 }
295 }
288
296
289 .pub-info {
297 .pub-info {
290 text-align: right;
298 text-align: right;
291 font-style: italic;
299 font-style: italic;
292 font-size: 9px;
300 font-size: 9px;
293
301
294 p {
302 p {
295 text-align: right;
303 text-align: right;
296 font-style: italic;
304 font-style: italic;
297 font-size: 9px;
305 font-size: 9px;
298 }
306 }
299 }
307 }
300
308
301 .announcement {
309 .announcement {
302 .toggles {
310 .toggles {
303 font-weight: normal;
311 font-weight: normal;
304 float: right;
312 float: right;
305 font-size: 80%;
313 font-size: 80%;
306 }
314 }
307
315
308 .announcement-title {
316 .announcement-title {
309 font-weight: bold;
317 font-weight: bold;
310 }
318 }
311 }
319 }
312
320
313 div {
321 div {
314 &.message {
322 &.message {
315 margin: 10px 0 0;
323 margin: 10px 0 0;
316
324
317 div {
325 div {
318 &.message {
326 &.message {
319 margin: 0 0 0 30px;
327 margin: 0 0 0 30px;
320 }
328 }
321
329
322 &.body {
330 &.body {
323 border: 2px solid #dddddd;
331 border: 2px solid #dddddd;
324 background: #fff8f8;
332 background: #fff8f8;
325 padding-left: 5px;
333 padding-left: 5px;
326 }
334 }
327
335
328 &.reply-body {
336 &.reply-body {
329 border: 2px solid #bbbbbb;
337 border: 2px solid #bbbbbb;
330 background: #fffff8;
338 background: #fffff8;
331 padding-left: 5px;
339 padding-left: 5px;
332 }
340 }
333
341
334 &.stat {
342 &.stat {
335 font-size: 10px;
343 font-size: 10px;
336 line-height: 1.75em;
344 line-height: 1.75em;
337 padding: 0 5px;
345 padding: 0 5px;
338 color: #333333;
346 color: #333333;
339 background: #dddddd;
347 background: #dddddd;
340 font-weight: bold;
348 font-weight: bold;
341 }
349 }
342
350
343 &.message div.stat {
351 &.message div.stat {
344 font-size: 10px;
352 font-size: 10px;
345 line-height: 1.75em;
353 line-height: 1.75em;
346 padding: 0 5px;
354 padding: 0 5px;
347 color: #444444;
355 color: #444444;
348 background: #bbbbbb;
356 background: #bbbbbb;
349 font-weight: bold;
357 font-weight: bold;
350 }
358 }
351 }
359 }
352 }
360 }
353
361
354 &.contest-title {
362 &.contest-title {
355 color: white;
363 color: white;
356 text-align: center;
364 text-align: center;
357 line-height: 2em;
365 line-height: 2em;
358 }
366 }
359
367
360 &.registration-desc, &.test-desc {
368 &.registration-desc, &.test-desc {
361 border: 1px dotted gray;
369 border: 1px dotted gray;
362 background: #f5f5f5;
370 background: #f5f5f5;
363 padding: 5px;
371 padding: 5px;
364 margin: 10px 0;
372 margin: 10px 0;
365 font-size: 12px;
373 font-size: 12px;
366 line-height: 1.5em;
374 line-height: 1.5em;
367 }
375 }
368 }
376 }
369
377
370 h2.contest-title {
378 h2.contest-title {
371 margin-top: 5px;
379 margin-top: 5px;
372 margin-bottom: 5px;
380 margin-bottom: 5px;
373 }
381 }
374
382
375
383
376
384
377 .grader-comment {
385 .grader-comment {
378 word-wrap: break-word;
386 word-wrap: break-word;
379 font-family: consolas;
387 font-family: consolas;
380 }
388 }
381
389
382
390
383 golden-btn + .golden-btn { margin-top: 1em; }
391 golden-btn + .golden-btn { margin-top: 1em; }
384
392
385 .golden-btn {
393 .golden-btn {
386 display: inline-block;
394 display: inline-block;
387 outline: none;
395 outline: none;
388 font-family: inherit;
396 font-family: inherit;
389 box-sizing: border-box;
397 box-sizing: border-box;
390 border: none;
398 border: none;
391 box-shadow: 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(110,80,20,.4),
399 box-shadow: 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(110,80,20,.4),
392 inset 0 -2px 5px 1px rgba(139,66,8,1),
400 inset 0 -2px 5px 1px rgba(139,66,8,1),
393 inset 0 -1px 1px 3px rgba(250,227,133,1);
401 inset 0 -1px 1px 3px rgba(250,227,133,1);
394 background-image: linear-gradient(160deg, #a54e07, #b47e11, #fef1a2, #bc881b, #a54e07) !important;
402 background-image: linear-gradient(160deg, #a54e07, #b47e11, #fef1a2, #bc881b, #a54e07) !important;
395 border: 1px solid #a55d07;
403 border: 1px solid #a55d07;
396 color: rgb(120,50,5);
404 color: rgb(120,50,5);
397 text-shadow: 0 2px 2px rgba(250, 227, 133, 1);
405 text-shadow: 0 2px 2px rgba(250, 227, 133, 1);
398 cursor: pointer;
406 cursor: pointer;
399 transition: all .2s ease-in-out;
407 transition: all .2s ease-in-out;
400 background-size: 100% 100%;
408 background-size: 100% 100%;
401 background-position:center;
409 background-position:center;
402 }
410 }
403 .golden-btn:focus,
411 .golden-btn:focus,
404 .golden-btn:hover {
412 .golden-btn:hover {
405 background-size: 150% 150%;
413 background-size: 150% 150%;
406 box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23),
414 box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23),
407 inset 0 -2px 5px 1px #b17d10,
415 inset 0 -2px 5px 1px #b17d10,
408 inset 0 -1px 1px 3px rgba(250,227,133,1);
416 inset 0 -1px 1px 3px rgba(250,227,133,1);
409 border: 1px solid rgba(165,93,7,.6);
417 border: 1px solid rgba(165,93,7,.6);
410 color: rgba(120,50,5,.8);
418 color: rgba(120,50,5,.8);
411 }
419 }
412 .golden-btn:active {
420 .golden-btn:active {
413 box-shadow: 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(110,80,20,.4),
421 box-shadow: 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(110,80,20,.4),
414 inset 0 -2px 5px 1px #b17d10,
422 inset 0 -2px 5px 1px #b17d10,
415 inset 0 -1px 1px 3px rgba(250,227,133,1);
423 inset 0 -1px 1px 3px rgba(250,227,133,1);
416 }
424 }
@@ -1,116 +1,114
1 class AnnouncementsController < ApplicationController
1 class AnnouncementsController < ApplicationController
2
2
3 before_action :admin_authorization
3 before_action :admin_authorization
4
4
5 - in_place_edit_for :announcement, :published
6 -
7 # GET /announcements
5 # GET /announcements
8 # GET /announcements.xml
6 # GET /announcements.xml
9 def index
7 def index
10 @announcements = Announcement.order(created_at: :desc)
8 @announcements = Announcement.order(created_at: :desc)
11
9
12 respond_to do |format|
10 respond_to do |format|
13 format.html # index.html.erb
11 format.html # index.html.erb
14 format.xml { render :xml => @announcements }
12 format.xml { render :xml => @announcements }
15 end
13 end
16 end
14 end
17
15
18 # GET /announcements/1
16 # GET /announcements/1
19 # GET /announcements/1.xml
17 # GET /announcements/1.xml
20 def show
18 def show
21 @announcement = Announcement.find(params[:id])
19 @announcement = Announcement.find(params[:id])
22
20
23 respond_to do |format|
21 respond_to do |format|
24 format.html # show.html.erb
22 format.html # show.html.erb
25 format.xml { render :xml => @announcement }
23 format.xml { render :xml => @announcement }
26 end
24 end
27 end
25 end
28
26
29 # GET /announcements/new
27 # GET /announcements/new
30 # GET /announcements/new.xml
28 # GET /announcements/new.xml
31 def new
29 def new
32 @announcement = Announcement.new
30 @announcement = Announcement.new
33
31
34 respond_to do |format|
32 respond_to do |format|
35 format.html # new.html.erb
33 format.html # new.html.erb
36 format.xml { render :xml => @announcement }
34 format.xml { render :xml => @announcement }
37 end
35 end
38 end
36 end
39
37
40 # GET /announcements/1/edit
38 # GET /announcements/1/edit
41 def edit
39 def edit
42 @announcement = Announcement.find(params[:id])
40 @announcement = Announcement.find(params[:id])
43 end
41 end
44
42
45 # POST /announcements
43 # POST /announcements
46 # POST /announcements.xml
44 # POST /announcements.xml
47 def create
45 def create
48 @announcement = Announcement.new(announcement_params)
46 @announcement = Announcement.new(announcement_params)
49
47
50 respond_to do |format|
48 respond_to do |format|
51 if @announcement.save
49 if @announcement.save
52 flash[:notice] = 'Announcement was successfully created.'
50 flash[:notice] = 'Announcement was successfully created.'
53 format.html { redirect_to(@announcement) }
51 format.html { redirect_to(@announcement) }
54 format.xml { render :xml => @announcement, :status => :created, :location => @announcement }
52 format.xml { render :xml => @announcement, :status => :created, :location => @announcement }
55 else
53 else
56 format.html { render :action => "new" }
54 format.html { render :action => "new" }
57 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
55 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
58 end
56 end
59 end
57 end
60 end
58 end
61
59
62 # PUT /announcements/1
60 # PUT /announcements/1
63 # PUT /announcements/1.xml
61 # PUT /announcements/1.xml
64 def update
62 def update
65 @announcement = Announcement.find(params[:id])
63 @announcement = Announcement.find(params[:id])
66
64
67 respond_to do |format|
65 respond_to do |format|
68 if @announcement.update(announcement_params)
66 if @announcement.update(announcement_params)
69 flash[:notice] = 'Announcement was successfully updated.'
67 flash[:notice] = 'Announcement was successfully updated.'
70 format.html { redirect_to(@announcement) }
68 format.html { redirect_to(@announcement) }
71 format.js {}
69 format.js {}
72 format.xml { head :ok }
70 format.xml { head :ok }
73 else
71 else
74 format.html { render :action => "edit" }
72 format.html { render :action => "edit" }
75 format.js {}
73 format.js {}
76 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
74 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
77 end
75 end
78 end
76 end
79 end
77 end
80
78
81 def toggle
79 def toggle
82 @announcement = Announcement.find(params[:id])
80 @announcement = Announcement.find(params[:id])
83 @announcement.update( published: !@announcement.published? )
81 @announcement.update( published: !@announcement.published? )
84 respond_to do |format|
82 respond_to do |format|
85 format.js { render partial: 'toggle_button',
83 format.js { render partial: 'toggle_button',
86 locals: {button_id: "#announcement_toggle_#{@announcement.id}",button_on: @announcement.published? } }
84 locals: {button_id: "#announcement_toggle_#{@announcement.id}",button_on: @announcement.published? } }
87 end
85 end
88 end
86 end
89
87
90 def toggle_front
88 def toggle_front
91 @announcement = Announcement.find(params[:id])
89 @announcement = Announcement.find(params[:id])
92 - @announcement.update_attributes( frontpage: !@announcement.frontpage? )
90 + @announcement.update( frontpage: !@announcement.frontpage? )
93 respond_to do |format|
91 respond_to do |format|
94 format.js { render partial: 'toggle_button',
92 format.js { render partial: 'toggle_button',
95 locals: {button_id: "#announcement_toggle_front_#{@announcement.id}",button_on: @announcement.frontpage? } }
93 locals: {button_id: "#announcement_toggle_front_#{@announcement.id}",button_on: @announcement.frontpage? } }
96 end
94 end
97 end
95 end
98
96
99 # DELETE /announcements/1
97 # DELETE /announcements/1
100 # DELETE /announcements/1.xml
98 # DELETE /announcements/1.xml
101 def destroy
99 def destroy
102 @announcement = Announcement.find(params[:id])
100 @announcement = Announcement.find(params[:id])
103 @announcement.destroy
101 @announcement.destroy
104
102
105 respond_to do |format|
103 respond_to do |format|
106 format.html { redirect_to(announcements_url) }
104 format.html { redirect_to(announcements_url) }
107 format.xml { head :ok }
105 format.xml { head :ok }
108 end
106 end
109 end
107 end
110
108
111 private
109 private
112
110
113 def announcement_params
111 def announcement_params
114 params.require(:announcement).permit(:author, :body, :published, :frontpage, :contest_only, :title, :on_nav_bar)
112 params.require(:announcement).permit(:author, :body, :published, :frontpage, :contest_only, :title, :on_nav_bar)
115 end
113 end
116 end
114 end
@@ -1,310 +1,306
1 class ProblemsController < ApplicationController
1 class ProblemsController < ApplicationController
2
2
3 before_action :admin_authorization, except: [:stat]
3 before_action :admin_authorization, except: [:stat]
4 before_action only: [:stat] do
4 before_action only: [:stat] do
5 authorization_by_roles(['admin','ta'])
5 authorization_by_roles(['admin','ta'])
6 end
6 end
7
7
8 - in_place_edit_for :problem, :name
9 - in_place_edit_for :problem, :full_name
10 - in_place_edit_for :problem, :full_score
11 -
12 def index
8 def index
13 @problems = Problem.order(date_added: :desc)
9 @problems = Problem.order(date_added: :desc)
14 end
10 end
15
11
16
12
17 def show
13 def show
18 @problem = Problem.find(params[:id])
14 @problem = Problem.find(params[:id])
19 end
15 end
20
16
21 def new
17 def new
22 @problem = Problem.new
18 @problem = Problem.new
23 @description = nil
19 @description = nil
24 end
20 end
25
21
26 def create
22 def create
27 @problem = Problem.new(problem_params)
23 @problem = Problem.new(problem_params)
28 @description = Description.new(description_params)
24 @description = Description.new(description_params)
29 if @description.body!=''
25 if @description.body!=''
30 if !@description.save
26 if !@description.save
31 render :action => new and return
27 render :action => new and return
32 end
28 end
33 else
29 else
34 @description = nil
30 @description = nil
35 end
31 end
36 @problem.description = @description
32 @problem.description = @description
37 if @problem.save
33 if @problem.save
38 flash[:notice] = 'Problem was successfully created.'
34 flash[:notice] = 'Problem was successfully created.'
39 redirect_to action: :index
35 redirect_to action: :index
40 else
36 else
41 render :action => 'new'
37 render :action => 'new'
42 end
38 end
43 end
39 end
44
40
45 def quick_create
41 def quick_create
46 @problem = Problem.new(problem_params)
42 @problem = Problem.new(problem_params)
47 @problem.full_name = @problem.name if @problem.full_name == ''
43 @problem.full_name = @problem.name if @problem.full_name == ''
48 @problem.full_score = 100
44 @problem.full_score = 100
49 @problem.available = false
45 @problem.available = false
50 @problem.test_allowed = true
46 @problem.test_allowed = true
51 @problem.output_only = false
47 @problem.output_only = false
52 @problem.date_added = Time.new
48 @problem.date_added = Time.new
53 if @problem.save
49 if @problem.save
54 flash[:notice] = 'Problem was successfully created.'
50 flash[:notice] = 'Problem was successfully created.'
55 redirect_to action: :index
51 redirect_to action: :index
56 else
52 else
57 flash[:notice] = 'Error saving problem'
53 flash[:notice] = 'Error saving problem'
58 redirect_to action: :index
54 redirect_to action: :index
59 end
55 end
60 end
56 end
61
57
62 def edit
58 def edit
63 @problem = Problem.find(params[:id])
59 @problem = Problem.find(params[:id])
64 @description = @problem.description
60 @description = @problem.description
65 end
61 end
66
62
67 def update
63 def update
68 @problem = Problem.find(params[:id])
64 @problem = Problem.find(params[:id])
69 @description = @problem.description
65 @description = @problem.description
70 if @description.nil? and params[:description][:body]!=''
66 if @description.nil? and params[:description][:body]!=''
71 @description = Description.new(description_params)
67 @description = Description.new(description_params)
72 if !@description.save
68 if !@description.save
73 flash[:notice] = 'Error saving description'
69 flash[:notice] = 'Error saving description'
74 render :action => 'edit' and return
70 render :action => 'edit' and return
75 end
71 end
76 @problem.description = @description
72 @problem.description = @description
77 elsif @description
73 elsif @description
78 if !@description.update(description_params)
74 if !@description.update(description_params)
79 flash[:notice] = 'Error saving description'
75 flash[:notice] = 'Error saving description'
80 render :action => 'edit' and return
76 render :action => 'edit' and return
81 end
77 end
82 end
78 end
83 if params[:file] and params[:file].content_type != 'application/pdf'
79 if params[:file] and params[:file].content_type != 'application/pdf'
84 flash[:notice] = 'Error: Uploaded file is not PDF'
80 flash[:notice] = 'Error: Uploaded file is not PDF'
85 render :action => 'edit' and return
81 render :action => 'edit' and return
86 end
82 end
87 if @problem.update(problem_params)
83 if @problem.update(problem_params)
88 flash[:notice] = 'Problem was successfully updated.'
84 flash[:notice] = 'Problem was successfully updated.'
89 unless params[:file] == nil or params[:file] == ''
85 unless params[:file] == nil or params[:file] == ''
90 flash[:notice] = 'Problem was successfully updated and a new PDF file is uploaded.'
86 flash[:notice] = 'Problem was successfully updated and a new PDF file is uploaded.'
91 out_dirname = "#{Problem.download_file_basedir}/#{@problem.id}"
87 out_dirname = "#{Problem.download_file_basedir}/#{@problem.id}"
92 if not FileTest.exists? out_dirname
88 if not FileTest.exists? out_dirname
93 Dir.mkdir out_dirname
89 Dir.mkdir out_dirname
94 end
90 end
95
91
96 out_filename = "#{out_dirname}/#{@problem.name}.pdf"
92 out_filename = "#{out_dirname}/#{@problem.name}.pdf"
97 if FileTest.exists? out_filename
93 if FileTest.exists? out_filename
98 File.delete out_filename
94 File.delete out_filename
99 end
95 end
100
96
101 File.open(out_filename,"wb") do |file|
97 File.open(out_filename,"wb") do |file|
102 file.write(params[:file].read)
98 file.write(params[:file].read)
103 end
99 end
104 @problem.description_filename = "#{@problem.name}.pdf"
100 @problem.description_filename = "#{@problem.name}.pdf"
105 @problem.save
101 @problem.save
106 end
102 end
107 redirect_to :action => 'show', :id => @problem
103 redirect_to :action => 'show', :id => @problem
108 else
104 else
109 render :action => 'edit'
105 render :action => 'edit'
110 end
106 end
111 end
107 end
112
108
113 def destroy
109 def destroy
114 p = Problem.find(params[:id]).destroy
110 p = Problem.find(params[:id]).destroy
115 redirect_to action: :index
111 redirect_to action: :index
116 end
112 end
117
113
118 def toggle
114 def toggle
119 @problem = Problem.find(params[:id])
115 @problem = Problem.find(params[:id])
120 @problem.update(available: !(@problem.available) )
116 @problem.update(available: !(@problem.available) )
121 respond_to do |format|
117 respond_to do |format|
122 format.js { }
118 format.js { }
123 end
119 end
124 end
120 end
125
121
126 def toggle_test
122 def toggle_test
127 @problem = Problem.find(params[:id])
123 @problem = Problem.find(params[:id])
128 @problem.update(test_allowed: !(@problem.test_allowed?) )
124 @problem.update(test_allowed: !(@problem.test_allowed?) )
129 respond_to do |format|
125 respond_to do |format|
130 format.js { }
126 format.js { }
131 end
127 end
132 end
128 end
133
129
134 def toggle_view_testcase
130 def toggle_view_testcase
135 @problem = Problem.find(params[:id])
131 @problem = Problem.find(params[:id])
136 @problem.update(view_testcase: !(@problem.view_testcase?) )
132 @problem.update(view_testcase: !(@problem.view_testcase?) )
137 respond_to do |format|
133 respond_to do |format|
138 format.js { }
134 format.js { }
139 end
135 end
140 end
136 end
141
137
142 def turn_all_off
138 def turn_all_off
143 Problem.available.all.each do |problem|
139 Problem.available.all.each do |problem|
144 problem.available = false
140 problem.available = false
145 problem.save
141 problem.save
146 end
142 end
147 redirect_to action: :index
143 redirect_to action: :index
148 end
144 end
149
145
150 def turn_all_on
146 def turn_all_on
151 Problem.where.not(available: true).each do |problem|
147 Problem.where.not(available: true).each do |problem|
152 problem.available = true
148 problem.available = true
153 problem.save
149 problem.save
154 end
150 end
155 redirect_to action: :index
151 redirect_to action: :index
156 end
152 end
157
153
158 def stat
154 def stat
159 @problem = Problem.find(params[:id])
155 @problem = Problem.find(params[:id])
160 unless @problem.available or session[:admin]
156 unless @problem.available or session[:admin]
161 redirect_to :controller => 'main', :action => 'list'
157 redirect_to :controller => 'main', :action => 'list'
162 return
158 return
163 end
159 end
164 @submissions = Submission.includes(:user).includes(:language).where(problem_id: params[:id]).order(:user_id,:id)
160 @submissions = Submission.includes(:user).includes(:language).where(problem_id: params[:id]).order(:user_id,:id)
165
161
166 #stat summary
162 #stat summary
167 range =65
163 range =65
168 @histogram = { data: Array.new(range,0), summary: {} }
164 @histogram = { data: Array.new(range,0), summary: {} }
169 user = Hash.new(0)
165 user = Hash.new(0)
170 @submissions.find_each do |sub|
166 @submissions.find_each do |sub|
171 d = (DateTime.now.in_time_zone - sub.submitted_at) / 24 / 60 / 60
167 d = (DateTime.now.in_time_zone - sub.submitted_at) / 24 / 60 / 60
172 @histogram[:data][d.to_i] += 1 if d < range
168 @histogram[:data][d.to_i] += 1 if d < range
173 user[sub.user_id] = [user[sub.user_id], ((sub.try(:points) || 0) >= @problem.full_score) ? 1 : 0].max
169 user[sub.user_id] = [user[sub.user_id], ((sub.try(:points) || 0) >= @problem.full_score) ? 1 : 0].max
174 end
170 end
175 @histogram[:summary][:max] = [@histogram[:data].max,1].max
171 @histogram[:summary][:max] = [@histogram[:data].max,1].max
176
172
177 @summary = { attempt: user.count, solve: 0 }
173 @summary = { attempt: user.count, solve: 0 }
178 user.each_value { |v| @summary[:solve] += 1 if v == 1 }
174 user.each_value { |v| @summary[:solve] += 1 if v == 1 }
179 end
175 end
180
176
181 def manage
177 def manage
182 @problems = Problem.order(date_added: :desc)
178 @problems = Problem.order(date_added: :desc)
183 end
179 end
184
180
185 def do_manage
181 def do_manage
186 if params.has_key? 'change_date_added' and params[:date_added].strip.empty? == false
182 if params.has_key? 'change_date_added' and params[:date_added].strip.empty? == false
187 change_date_added
183 change_date_added
188 elsif params.has_key? 'add_to_contest'
184 elsif params.has_key? 'add_to_contest'
189 add_to_contest
185 add_to_contest
190 elsif params.has_key? 'enable_problem'
186 elsif params.has_key? 'enable_problem'
191 set_available(true)
187 set_available(true)
192 elsif params.has_key? 'disable_problem'
188 elsif params.has_key? 'disable_problem'
193 set_available(false)
189 set_available(false)
194 elsif params.has_key? 'add_group'
190 elsif params.has_key? 'add_group'
195 group = Group.find(params[:group_id])
191 group = Group.find(params[:group_id])
196 ok = []
192 ok = []
197 failed = []
193 failed = []
198 get_problems_from_params.each do |p|
194 get_problems_from_params.each do |p|
199 begin
195 begin
200 group.problems << p
196 group.problems << p
201 ok << p.full_name
197 ok << p.full_name
202 rescue => e
198 rescue => e
203 failed << p.full_name
199 failed << p.full_name
204 end
200 end
205 end
201 end
206 flash[:success] = "The following problems are added to the group #{group.name}: " + ok.join(', ') if ok.count > 0
202 flash[:success] = "The following problems are added to the group #{group.name}: " + ok.join(', ') if ok.count > 0
207 flash[:alert] = "The following problems are already in the group #{group.name}: " + failed.join(', ') if failed.count > 0
203 flash[:alert] = "The following problems are already in the group #{group.name}: " + failed.join(', ') if failed.count > 0
208 elsif params.has_key? 'add_tags'
204 elsif params.has_key? 'add_tags'
209 get_problems_from_params.each do |p|
205 get_problems_from_params.each do |p|
210 p.tag_ids += params[:tag_ids]
206 p.tag_ids += params[:tag_ids]
211 end
207 end
212 end
208 end
213
209
214 redirect_to :action => 'manage'
210 redirect_to :action => 'manage'
215 end
211 end
216
212
217 def import
213 def import
218 @allow_test_pair_import = allow_test_pair_import?
214 @allow_test_pair_import = allow_test_pair_import?
219 end
215 end
220
216
221 def do_import
217 def do_import
222 old_problem = Problem.find_by_name(params[:name])
218 old_problem = Problem.find_by_name(params[:name])
223 if !allow_test_pair_import? and params.has_key? :import_to_db
219 if !allow_test_pair_import? and params.has_key? :import_to_db
224 params.delete :import_to_db
220 params.delete :import_to_db
225 end
221 end
226 @problem, import_log = Problem.create_from_import_form_params(params,
222 @problem, import_log = Problem.create_from_import_form_params(params,
227 old_problem)
223 old_problem)
228
224
229 if !@problem.errors.empty?
225 if !@problem.errors.empty?
230 render :action => 'import' and return
226 render :action => 'import' and return
231 end
227 end
232
228
233 if old_problem!=nil
229 if old_problem!=nil
234 flash[:notice] = "The test data has been replaced for problem #{@problem.name}"
230 flash[:notice] = "The test data has been replaced for problem #{@problem.name}"
235 end
231 end
236 @log = import_log
232 @log = import_log
237 end
233 end
238
234
239 def remove_contest
235 def remove_contest
240 problem = Problem.find(params[:id])
236 problem = Problem.find(params[:id])
241 contest = Contest.find(params[:contest_id])
237 contest = Contest.find(params[:contest_id])
242 if problem!=nil and contest!=nil
238 if problem!=nil and contest!=nil
243 problem.contests.delete(contest)
239 problem.contests.delete(contest)
244 end
240 end
245 redirect_to :action => 'manage'
241 redirect_to :action => 'manage'
246 end
242 end
247
243
248 ##################################
244 ##################################
249 protected
245 protected
250
246
251 def allow_test_pair_import?
247 def allow_test_pair_import?
252 if defined? ALLOW_TEST_PAIR_IMPORT
248 if defined? ALLOW_TEST_PAIR_IMPORT
253 return ALLOW_TEST_PAIR_IMPORT
249 return ALLOW_TEST_PAIR_IMPORT
254 else
250 else
255 return false
251 return false
256 end
252 end
257 end
253 end
258
254
259 def change_date_added
255 def change_date_added
260 problems = get_problems_from_params
256 problems = get_problems_from_params
261 date = Date.parse(params[:date_added])
257 date = Date.parse(params[:date_added])
262 problems.each do |p|
258 problems.each do |p|
263 p.date_added = date
259 p.date_added = date
264 p.save
260 p.save
265 end
261 end
266 end
262 end
267
263
268 def add_to_contest
264 def add_to_contest
269 problems = get_problems_from_params
265 problems = get_problems_from_params
270 contest = Contest.find(params[:contest][:id])
266 contest = Contest.find(params[:contest][:id])
271 if contest!=nil and contest.enabled
267 if contest!=nil and contest.enabled
272 problems.each do |p|
268 problems.each do |p|
273 p.contests << contest
269 p.contests << contest
274 end
270 end
275 end
271 end
276 end
272 end
277
273
278 def set_available(avail)
274 def set_available(avail)
279 problems = get_problems_from_params
275 problems = get_problems_from_params
280 problems.each do |p|
276 problems.each do |p|
281 p.available = avail
277 p.available = avail
282 p.save
278 p.save
283 end
279 end
284 end
280 end
285
281
286 def get_problems_from_params
282 def get_problems_from_params
287 problems = []
283 problems = []
288 params.keys.each do |k|
284 params.keys.each do |k|
289 if k.index('prob-')==0
285 if k.index('prob-')==0
290 name, id, order = k.split('-')
286 name, id, order = k.split('-')
291 problems << Problem.find(id)
287 problems << Problem.find(id)
292 end
288 end
293 end
289 end
294 problems
290 problems
295 end
291 end
296
292
297 def get_problems_stat
293 def get_problems_stat
298 end
294 end
299
295
300 private
296 private
301
297
302 def problem_params
298 def problem_params
303 params.require(:problem).permit(:name, :full_name, :full_score, :change_date_added, :date_added, :available, :test_allowed,:output_only, :url, :description, tag_ids:[])
299 params.require(:problem).permit(:name, :full_name, :full_score, :change_date_added, :date_added, :available, :test_allowed,:output_only, :url, :description, tag_ids:[])
304 end
300 end
305
301
306 def description_params
302 def description_params
307 params.require(:description).permit(:body, :markdowned)
303 params.require(:description).permit(:body, :markdowned)
308 end
304 end
309
305
310 end
306 end
@@ -1,222 +1,222
1 # Methods added to this helper will be available to all templates in the application.
1 # Methods added to this helper will be available to all templates in the application.
2 module ApplicationHelper
2 module ApplicationHelper
3
3
4 #new bootstrap header
4 #new bootstrap header
5 def navbar_user_header
5 def navbar_user_header
6 left_menu = ''
6 left_menu = ''
7 right_menu = ''
7 right_menu = ''
8 user = User.find(session[:user_id])
8 user = User.find(session[:user_id])
9
9
10 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
10 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
11 left_menu << add_menu("#{I18n.t 'menu.tasks'}", 'tasks', 'list')
11 left_menu << add_menu("#{I18n.t 'menu.tasks'}", 'tasks', 'list')
12 left_menu << add_menu("#{I18n.t 'menu.submissions'}", 'main', 'submission')
12 left_menu << add_menu("#{I18n.t 'menu.submissions'}", 'main', 'submission')
13 left_menu << add_menu("#{I18n.t 'menu.test'}", 'test', 'index')
13 left_menu << add_menu("#{I18n.t 'menu.test'}", 'test', 'index')
14 end
14 end
15
15
16 if GraderConfiguration['right.user_hall_of_fame']
16 if GraderConfiguration['right.user_hall_of_fame']
17 left_menu << add_menu("#{I18n.t 'menu.hall_of_fame'}", 'report', 'problem_hof')
17 left_menu << add_menu("#{I18n.t 'menu.hall_of_fame'}", 'report', 'problem_hof')
18 end
18 end
19
19
20 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-question-sign')}".html_safe, 'main', 'help')
20 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-question-sign')}".html_safe, 'main', 'help')
21 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-comment')}".html_safe, 'messages', 'list', {title: I18n.t('menu.messages'), data: {toggle: 'tooltip'}})
21 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-comment')}".html_safe, 'messages', 'list', {title: I18n.t('menu.messages'), data: {toggle: 'tooltip'}})
22 if GraderConfiguration['system.user_setting_enabled']
22 if GraderConfiguration['system.user_setting_enabled']
23 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-cog')}".html_safe, 'users', 'index', {title: I18n.t('menu.settings'), data: {toggle: 'tooltip'}})
23 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-cog')}".html_safe, 'users', 'index', {title: I18n.t('menu.settings'), data: {toggle: 'tooltip'}})
24 end
24 end
25 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-log-out')} #{user.full_name}".html_safe, 'main', 'login', {title: I18n.t('menu.log_out'), data: {toggle: 'tooltip'}})
25 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-log-out')} #{user.full_name}".html_safe, 'main', 'login', {title: I18n.t('menu.log_out'), data: {toggle: 'tooltip'}})
26
26
27
27
28 result = content_tag(:ul,left_menu.html_safe,class: 'nav navbar-nav') + content_tag(:ul,right_menu.html_safe,class: 'nav navbar-nav navbar-right')
28 result = content_tag(:ul,left_menu.html_safe,class: 'nav navbar-nav') + content_tag(:ul,right_menu.html_safe,class: 'nav navbar-nav navbar-right')
29 end
29 end
30
30
31 def add_menu(title, controller, action, html_option = {})
31 def add_menu(title, controller, action, html_option = {})
32 link_option = {controller: controller, action: action}
32 link_option = {controller: controller, action: action}
33 html_option[:class] = (html_option[:class] || '') + " active" if current_page?(link_option)
33 html_option[:class] = (html_option[:class] || '') + " active" if current_page?(link_option)
34 content_tag(:li, link_to(title,link_option),html_option)
34 content_tag(:li, link_to(title,link_option),html_option)
35 end
35 end
36
36
37 def user_header
37 def user_header
38 menu_items = ''
38 menu_items = ''
39 user = User.find(session[:user_id])
39 user = User.find(session[:user_id])
40
40
41 if (user!=nil) and (session[:admin])
41 if (user!=nil) and (session[:admin])
42 # admin menu
42 # admin menu
43 menu_items << "<b>Administrative task:</b> "
43 menu_items << "<b>Administrative task:</b> "
44 append_to menu_items, '[Announcements]', 'announcements', 'index'
44 append_to menu_items, '[Announcements]', 'announcements', 'index'
45 append_to menu_items, '[Msg console]', 'messages', 'console'
45 append_to menu_items, '[Msg console]', 'messages', 'console'
46 append_to menu_items, '[Problems]', 'problems', 'index'
46 append_to menu_items, '[Problems]', 'problems', 'index'
47 append_to menu_items, '[Users]', 'user_admin', 'index'
47 append_to menu_items, '[Users]', 'user_admin', 'index'
48 append_to menu_items, '[Results]', 'user_admin', 'user_stat'
48 append_to menu_items, '[Results]', 'user_admin', 'user_stat'
49 append_to menu_items, '[Report]', 'report', 'multiple_login'
49 append_to menu_items, '[Report]', 'report', 'multiple_login'
50 append_to menu_items, '[Graders]', 'graders', 'list'
50 append_to menu_items, '[Graders]', 'graders', 'list'
51 append_to menu_items, '[Contests]', 'contest_management', 'index'
51 append_to menu_items, '[Contests]', 'contest_management', 'index'
52 append_to menu_items, '[Sites]', 'sites', 'index'
52 append_to menu_items, '[Sites]', 'sites', 'index'
53 append_to menu_items, '[System config]', 'configurations', 'index'
53 append_to menu_items, '[System config]', 'configurations', 'index'
54 menu_items << "<br/>"
54 menu_items << "<br/>"
55 end
55 end
56
56
57 # main page
57 # main page
58 append_to menu_items, "[#{I18n.t 'menu.main'}]", 'main', 'list'
58 append_to menu_items, "[#{I18n.t 'menu.main'}]", 'main', 'list'
59 append_to menu_items, "[#{I18n.t 'menu.messages'}]", 'messages', 'list'
59 append_to menu_items, "[#{I18n.t 'menu.messages'}]", 'messages', 'list'
60
60
61 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
61 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
62 append_to menu_items, "[#{I18n.t 'menu.tasks'}]", 'tasks', 'list'
62 append_to menu_items, "[#{I18n.t 'menu.tasks'}]", 'tasks', 'list'
63 append_to menu_items, "[#{I18n.t 'menu.submissions'}]", 'main', 'submission'
63 append_to menu_items, "[#{I18n.t 'menu.submissions'}]", 'main', 'submission'
64 append_to menu_items, "[#{I18n.t 'menu.test'}]", 'test', 'index'
64 append_to menu_items, "[#{I18n.t 'menu.test'}]", 'test', 'index'
65 end
65 end
66
66
67 if GraderConfiguration['right.user_hall_of_fame']
67 if GraderConfiguration['right.user_hall_of_fame']
68 append_to menu_items, "[#{I18n.t 'menu.hall_of_fame'}]", 'report', 'problem_hof'
68 append_to menu_items, "[#{I18n.t 'menu.hall_of_fame'}]", 'report', 'problem_hof'
69 end
69 end
70 append_to menu_items, "[#{I18n.t 'menu.help'}]", 'main', 'help'
70 append_to menu_items, "[#{I18n.t 'menu.help'}]", 'main', 'help'
71
71
72 if GraderConfiguration['system.user_setting_enabled']
72 if GraderConfiguration['system.user_setting_enabled']
73 append_to menu_items, "[#{I18n.t 'menu.settings'}]", 'users', 'index'
73 append_to menu_items, "[#{I18n.t 'menu.settings'}]", 'users', 'index'
74 end
74 end
75 append_to menu_items, "[#{I18n.t 'menu.log_out'}]", 'main', 'login'
75 append_to menu_items, "[#{I18n.t 'menu.log_out'}]", 'main', 'login'
76
76
77 menu_items.html_safe
77 menu_items.html_safe
78 end
78 end
79
79
80 def append_to(option,label, controller, action)
80 def append_to(option,label, controller, action)
81 option << ' ' if option!=''
81 option << ' ' if option!=''
82 option << link_to_unless_current(label,
82 option << link_to_unless_current(label,
83 :controller => controller,
83 :controller => controller,
84 :action => action)
84 :action => action)
85 end
85 end
86
86
87 def format_short_time(time)
87 def format_short_time(time)
88 now = Time.zone.now
88 now = Time.zone.now
89 st = ''
89 st = ''
90 if (time.yday != now.yday) or (time.year != now.year)
90 if (time.yday != now.yday) or (time.year != now.year)
91 st = time.strftime("%d/%m/%y ")
91 st = time.strftime("%d/%m/%y ")
92 end
92 end
93 st + time.strftime("%X")
93 st + time.strftime("%X")
94 end
94 end
95
95
96 def format_short_duration(duration)
96 def format_short_duration(duration)
97 return '' if duration==nil
97 return '' if duration==nil
98 d = duration.to_f
98 d = duration.to_f
99 return Time.at(d).gmtime.strftime("%X")
99 return Time.at(d).gmtime.strftime("%X")
100 end
100 end
101
101
102 def format_full_time_ago(time)
102 def format_full_time_ago(time)
103 st = time_ago_in_words(time) + ' ago (' + format_short_time(time) + ')'
103 st = time_ago_in_words(time) + ' ago (' + format_short_time(time) + ')'
104 end
104 end
105
105
106 def read_textfile(fname,max_size=2048)
106 def read_textfile(fname,max_size=2048)
107 begin
107 begin
108 File.open(fname).read(max_size)
108 File.open(fname).read(max_size)
109 rescue
109 rescue
110 nil
110 nil
111 end
111 end
112 end
112 end
113
113
114 def toggle_button(on,toggle_url,id, option={})
114 def toggle_button(on,toggle_url,id, option={})
115 - btn_size = option[:size] || 'btn-xs'
115 + btn_size = option[:size] || 'btn-sm'
116 btn_block = option[:block] || 'btn-block'
116 btn_block = option[:block] || 'btn-block'
117 link_to (on ? "Yes" : "No"), toggle_url,
117 link_to (on ? "Yes" : "No"), toggle_url,
118 - {class: "btn #{btn_block} #{btn_size} btn-#{on ? 'success' : 'default'} ajax-toggle",
118 + {class: "btn #{btn_block} #{btn_size} btn-#{on ? 'success' : 'outline-secondary'} ajax-toggle",
119 id: id,
119 id: id,
120 data: {remote: true, method: 'get'}}
120 data: {remote: true, method: 'get'}}
121 end
121 end
122
122
123 def get_ace_mode(language)
123 def get_ace_mode(language)
124 # return ace mode string from Language
124 # return ace mode string from Language
125
125
126 case language.pretty_name
126 case language.pretty_name
127 when 'Pascal'
127 when 'Pascal'
128 'ace/mode/pascal'
128 'ace/mode/pascal'
129 when 'C++','C'
129 when 'C++','C'
130 'ace/mode/c_cpp'
130 'ace/mode/c_cpp'
131 when 'Ruby'
131 when 'Ruby'
132 'ace/mode/ruby'
132 'ace/mode/ruby'
133 when 'Python'
133 when 'Python'
134 'ace/mode/python'
134 'ace/mode/python'
135 when 'Java'
135 when 'Java'
136 'ace/mode/java'
136 'ace/mode/java'
137 else
137 else
138 'ace/mode/c_cpp'
138 'ace/mode/c_cpp'
139 end
139 end
140 end
140 end
141
141
142
142
143 def user_title_bar(user)
143 def user_title_bar(user)
144 header = ''
144 header = ''
145 time_left = ''
145 time_left = ''
146
146
147 #
147 #
148 # if the contest is over
148 # if the contest is over
149 if GraderConfiguration.time_limit_mode?
149 if GraderConfiguration.time_limit_mode?
150 if user.contest_finished?
150 if user.contest_finished?
151 header = <<CONTEST_OVER
151 header = <<CONTEST_OVER
152 <tr><td colspan="2" align="center">
152 <tr><td colspan="2" align="center">
153 <span class="contest-over-msg">THE CONTEST IS OVER</span>
153 <span class="contest-over-msg">THE CONTEST IS OVER</span>
154 </td></tr>
154 </td></tr>
155 CONTEST_OVER
155 CONTEST_OVER
156 end
156 end
157 if !user.contest_started?
157 if !user.contest_started?
158 time_left = "&nbsp;&nbsp;" + (t 'title_bar.contest_not_started')
158 time_left = "&nbsp;&nbsp;" + (t 'title_bar.contest_not_started')
159 else
159 else
160 time_left = "&nbsp;&nbsp;" + (t 'title_bar.remaining_time') +
160 time_left = "&nbsp;&nbsp;" + (t 'title_bar.remaining_time') +
161 " #{format_short_duration(user.contest_time_left)}"
161 " #{format_short_duration(user.contest_time_left)}"
162 end
162 end
163 end
163 end
164
164
165 #
165 #
166 # if the contest is in the anaysis mode
166 # if the contest is in the anaysis mode
167 if GraderConfiguration.analysis_mode?
167 if GraderConfiguration.analysis_mode?
168 header = <<ANALYSISMODE
168 header = <<ANALYSISMODE
169 <tr><td colspan="2" align="center">
169 <tr><td colspan="2" align="center">
170 <span class="contest-over-msg">ANALYSIS MODE</span>
170 <span class="contest-over-msg">ANALYSIS MODE</span>
171 </td></tr>
171 </td></tr>
172 ANALYSISMODE
172 ANALYSISMODE
173 end
173 end
174
174
175 contest_name = GraderConfiguration['contest.name']
175 contest_name = GraderConfiguration['contest.name']
176
176
177 #
177 #
178 # build real title bar
178 # build real title bar
179 result = <<TITLEBAR
179 result = <<TITLEBAR
180 <div class="title">
180 <div class="title">
181 <table>
181 <table>
182 #{header}
182 #{header}
183 <tr>
183 <tr>
184 <td class="left-col">
184 <td class="left-col">
185 <br/>
185 <br/>
186 </td>
186 </td>
187 <td class="right-col">#{contest_name}</td>
187 <td class="right-col">#{contest_name}</td>
188 </tr>
188 </tr>
189 </table>
189 </table>
190 </div>
190 </div>
191 TITLEBAR
191 TITLEBAR
192 result.html_safe
192 result.html_safe
193 end
193 end
194
194
195 def markdown(text)
195 def markdown(text)
196 markdown = RDiscount.new(text)
196 markdown = RDiscount.new(text)
197 markdown.to_html.html_safe
197 markdown.to_html.html_safe
198 end
198 end
199
199
200
200
201 BOOTSTRAP_FLASH_MSG = {
201 BOOTSTRAP_FLASH_MSG = {
202 success: 'alert-success',
202 success: 'alert-success',
203 error: 'alert-danger',
203 error: 'alert-danger',
204 alert: 'alert-danger',
204 alert: 'alert-danger',
205 notice: 'alert-info'
205 notice: 'alert-info'
206 }
206 }
207
207
208 def bootstrap_class_for(flash_type)
208 def bootstrap_class_for(flash_type)
209 BOOTSTRAP_FLASH_MSG.fetch(flash_type.to_sym, flash_type.to_s)
209 BOOTSTRAP_FLASH_MSG.fetch(flash_type.to_sym, flash_type.to_s)
210 end
210 end
211
211
212 def flash_messages
212 def flash_messages
213 flash.each do |msg_type, message|
213 flash.each do |msg_type, message|
214 concat(content_tag(:div, message, class: "alert #{bootstrap_class_for(msg_type)} fade in") do
214 concat(content_tag(:div, message, class: "alert #{bootstrap_class_for(msg_type)} fade in") do
215 concat content_tag(:button, 'x', class: "close", data: { dismiss: 'alert' })
215 concat content_tag(:button, 'x', class: "close", data: { dismiss: 'alert' })
216 concat message
216 concat message
217 end)
217 end)
218 end
218 end
219 nil
219 nil
220 end
220 end
221
221
222 end
222 end
@@ -1,45 +1,6
1 %h1 Edit Announcement
1 %h1 Edit Announcement
2
2
3 -content_for(:form_buttons) do
3 -content_for(:form_buttons) do
4 = link_to t(:back), announcements_path, class: 'card-link btn btn-secondary'
4 = link_to t(:back), announcements_path, class: 'card-link btn btn-secondary'
5
5
6 = render 'form'
6 = render 'form'
7 - -# old style
8 - .container-fluid
9 - %h1 Editing announcement
10 - = error_messages_for :announcement
11 - .row
12 - .col-md-6
13 - = form_for(@announcement) do |f|
14 - .form-group
15 - %label Title
16 - = f.text_field :title, class: 'form-control'
17 - .form-group
18 - %label Notes
19 - (shown internally, used to organize announcements)
20 - = f.text_field :notes, class: 'form-control'
21 - .form-group
22 - %label Body
23 - = f.text_area :body, class: 'form-control', style: 'height: 200px;'
24 - .form-group
25 - %label Author
26 - = f.text_field :author, class: 'form-control'
27 - .checkbox
28 - %label
29 - = f.check_box :published
30 - Published
31 - .checkbox
32 - %label
33 - = f.check_box :frontpage
34 - Show on front page?
35 - .checkbox
36 - %label
37 - = f.check_box :on_nav_bar
38 - Show on top menu bar?
39 - .checkbox
40 - %label
41 - = f.check_box :contest_only
42 - Show only in contest?
43 - = f.submit "Update", class: 'btn btn-primary'
44 - = link_to 'Show', @announcement, class: 'btn btn-default'
45 - = link_to 'Back', announcements_path, class: 'btn btn-default'
@@ -1,7 +1,7
1 :plain
1 :plain
2 var t = $("#{button_id}");
2 var t = $("#{button_id}");
3 - t.removeClass('btn-default');
3 + t.removeClass('btn-outline-secondary');
4 t.removeClass('btn-success');
4 t.removeClass('btn-success');
5 t.removeClass('btn-warning');
5 t.removeClass('btn-warning');
6 - t.addClass("btn-#{button_on ? 'success' : 'default'}");
6 + t.addClass("btn-#{button_on ? 'success' : 'outline-secondary'}");
7 t.text("#{button_on ? 'Yes' : 'No'}");
7 t.text("#{button_on ? 'Yes' : 'No'}");
@@ -1,87 +1,87
1 %header
1 %header
2 %nav.navbar.fixed-top.navbar-dark.bg-primary.navbar-expand-lg
2 %nav.navbar.fixed-top.navbar-dark.bg-primary.navbar-expand-lg
3 .container-fluid
3 .container-fluid
4 %a.navbar-brand{href: list_main_path}
4 %a.navbar-brand{href: list_main_path}
5 - %span.glyphicon.glyphicon-home
5 + %span.mi.mi-bs home
6 MAIN
6 MAIN
7 %button.navbar-toggler.collapsed{ type: :button, 'data-bs': {toggle: 'collapse', target: '#navbar-collapse'} }
7 %button.navbar-toggler.collapsed{ type: :button, 'data-bs': {toggle: 'collapse', target: '#navbar-collapse'} }
8 %span.navbar-toggler-icon
8 %span.navbar-toggler-icon
9 .collapse.navbar-collapse#navbar-collapse
9 .collapse.navbar-collapse#navbar-collapse
10 %ul.navbar-nav.me-auto.mb-2.mb-lg-0
10 %ul.navbar-nav.me-auto.mb-2.mb-lg-0
11 / submission
11 / submission
12 - if (@current_user!=nil) and (GraderConfiguration.show_tasks_to?(@current_user))
12 - if (@current_user!=nil) and (GraderConfiguration.show_tasks_to?(@current_user))
13 %li.nav-item.dropdown.mx-2
13 %li.nav-item.dropdown.mx-2
14 %a.nav-link.dropdown-toggle{href: '#', 'data-bs': {toggle:'dropdown'}, aria: {expanded:"false"}, role: "button"}
14 %a.nav-link.dropdown-toggle{href: '#', 'data-bs': {toggle:'dropdown'}, aria: {expanded:"false"}, role: "button"}
15 = "#{I18n.t 'menu.submissions'}"
15 = "#{I18n.t 'menu.submissions'}"
16 %ul.dropdown-menu
16 %ul.dropdown-menu
17 %li= link_to 'View', submissions_path, class:'dropdown-item'
17 %li= link_to 'View', submissions_path, class:'dropdown-item'
18 %li= link_to 'Self Test', test_index_path, class:'dropdown-item'
18 %li= link_to 'Self Test', test_index_path, class:'dropdown-item'
19 / hall of fame
19 / hall of fame
20 - if GraderConfiguration['right.user_hall_of_fame']
20 - if GraderConfiguration['right.user_hall_of_fame']
21 %li= link_to "#{I18n.t 'menu.hall_of_fame'}", problem_hof_report_path, class: 'nav-link mx-2'
21 %li= link_to "#{I18n.t 'menu.hall_of_fame'}", problem_hof_report_path, class: 'nav-link mx-2'
22 / display MODE button (with countdown in contest mode)
22 / display MODE button (with countdown in contest mode)
23 - if GraderConfiguration.analysis_mode?
23 - if GraderConfiguration.analysis_mode?
24 %div.btn.btn-success#countdown= "ANALYSIS MODE"
24 %div.btn.btn-success#countdown= "ANALYSIS MODE"
25 - elsif GraderConfiguration.time_limit_mode?
25 - elsif GraderConfiguration.time_limit_mode?
26 - if @current_user.contest_finished?
26 - if @current_user.contest_finished?
27 %div.btn.btn-danger#countdown= "Contest is over"
27 %div.btn.btn-danger#countdown= "Contest is over"
28 - elsif !@current_user.contest_started?
28 - elsif !@current_user.contest_started?
29 %div.btn.btn-primary#countdown= (t 'title_bar.contest_not_started')
29 %div.btn.btn-primary#countdown= (t 'title_bar.contest_not_started')
30 - else
30 - else
31 %div.btn.btn-primary#countdown asdf
31 %div.btn.btn-primary#countdown asdf
32 :javascript
32 :javascript
33 $("#countdown").countdown({until: "+#{@current_user.contest_time_left.to_i}s", layout: 'Time left: {hnn}:{mnn}:{snn}'});
33 $("#countdown").countdown({until: "+#{@current_user.contest_time_left.to_i}s", layout: 'Time left: {hnn}:{mnn}:{snn}'});
34 / admin section
34 / admin section
35 - if (@current_user!=nil) and (session[:admin])
35 - if (@current_user!=nil) and (session[:admin])
36 / management
36 / management
37 %li.nav-item.dropdown.mx-2
37 %li.nav-item.dropdown.mx-2
38 %a.nav-link.dropdown-toggle{href: '#', 'data-bs': {toggle:'dropdown'}, aria: {haspopup:"true", expanded:"false"}, role: "button"}
38 %a.nav-link.dropdown-toggle{href: '#', 'data-bs': {toggle:'dropdown'}, aria: {haspopup:"true", expanded:"false"}, role: "button"}
39 Manage
39 Manage
40 %ul.dropdown-menu
40 %ul.dropdown-menu
41 %li= link_to 'Announcements', announcements_path, class: 'dropdown-item'
41 %li= link_to 'Announcements', announcements_path, class: 'dropdown-item'
42 %li= link_to 'Problems', problems_path, class: 'dropdown-item'
42 %li= link_to 'Problems', problems_path, class: 'dropdown-item'
43 %li= link_to 'Tags', tags_path, class: 'dropdown-item'
43 %li= link_to 'Tags', tags_path, class: 'dropdown-item'
44 %li= link_to 'Users', user_admin_index_path, class: 'dropdown-item'
44 %li= link_to 'Users', user_admin_index_path, class: 'dropdown-item'
45 %li= link_to 'User Groups', groups_path, class: 'dropdown-item'
45 %li= link_to 'User Groups', groups_path, class: 'dropdown-item'
46 %li= link_to 'Graders', graders_list_path, class: 'dropdown-item'
46 %li= link_to 'Graders', graders_list_path, class: 'dropdown-item'
47 %li= link_to 'Message ', console_messages_path, class: 'dropdown-item'
47 %li= link_to 'Message ', console_messages_path, class: 'dropdown-item'
48 %li
48 %li
49 %hr.dropdown-divider
49 %hr.dropdown-divider
50 %li= link_to 'System config', grader_configuration_index_path, class: 'dropdown-item'
50 %li= link_to 'System config', grader_configuration_index_path, class: 'dropdown-item'
51 %li
51 %li
52 %hr.dropdown-divider
52 %hr.dropdown-divider
53 %li= link_to 'Sites', sites_path, class: 'dropdown-item'
53 %li= link_to 'Sites', sites_path, class: 'dropdown-item'
54 %li= link_to 'Contests', contest_management_index_path, class: 'dropdown-item'
54 %li= link_to 'Contests', contest_management_index_path, class: 'dropdown-item'
55 -#
55 -#
56 / report
56 / report
57 %li.nav-item.dropdown.mx-2
57 %li.nav-item.dropdown.mx-2
58 %a.nav-link.dropdown-toggle{href: '#', 'data-bs': {toggle:'dropdown'}, aria: {haspopup:"true", expanded:"false"}, role: "button"}
58 %a.nav-link.dropdown-toggle{href: '#', 'data-bs': {toggle:'dropdown'}, aria: {haspopup:"true", expanded:"false"}, role: "button"}
59 Report
59 Report
60 %ul.dropdown-menu
60 %ul.dropdown-menu
61 %li= link_to 'Current Score', current_score_report_path, class: 'dropdown-item'
61 %li= link_to 'Current Score', current_score_report_path, class: 'dropdown-item'
62 %li= link_to 'Score Report', max_score_report_path, class: 'dropdown-item'
62 %li= link_to 'Score Report', max_score_report_path, class: 'dropdown-item'
63 %li= link_to 'Submission Report', submission_report_path, class: 'dropdown-item'
63 %li= link_to 'Submission Report', submission_report_path, class: 'dropdown-item'
64 %li= link_to 'Login Report', login_report_path, class: 'dropdown-item'
64 %li= link_to 'Login Report', login_report_path, class: 'dropdown-item'
65 - if (ungraded = Submission.where('graded_at is null').where('submitted_at < ?', 1.minutes.ago).count) > 0
65 - if (ungraded = Submission.where('graded_at is null').where('submitted_at < ?', 1.minutes.ago).count) > 0
66 =link_to "#{ungraded} backlogs!",
66 =link_to "#{ungraded} backlogs!",
67 graders_list_path,
67 graders_list_path,
68 class: 'navbar-btn btn btn-default btn-warning', data: {toggle: 'tooltip'},title: 'Number of ungraded submission'
68 class: 'navbar-btn btn btn-default btn-warning', data: {toggle: 'tooltip'},title: 'Number of ungraded submission'
69 / announcement
69 / announcement
70 - @nav_announcement.each do |ann|
70 - @nav_announcement.each do |ann|
71 %p.navbar-text
71 %p.navbar-text
72 = ann.body.html_safe
72 = ann.body.html_safe
73 %ul.navbar-nav
73 %ul.navbar-nav
74 %li.nav-item
74 %li.nav-item
75 %a.nav-link{href: help_main_path}
75 %a.nav-link{href: help_main_path}
76 - %span.mi.md-18 help
76 + %span.mi.mi-bs.md-18 help
77 %li.nav-item
77 %li.nav-item
78 %a.nav-link{href: messages_path}
78 %a.nav-link{href: messages_path}
79 - %span.mi.md-18 chat
79 + %span.mi.mi-bs.md-18 chat
80 - if GraderConfiguration['system.user_setting_enabled']
80 - if GraderConfiguration['system.user_setting_enabled']
81 %li.nav-item
81 %li.nav-item
82 %a.nav-link{href: profile_users_path}
82 %a.nav-link{href: profile_users_path}
83 - %span.mi.md-18 settings
83 + %span.mi.mi-bs.md-18 settings
84 %li.nav-item
84 %li.nav-item
85 %a.nav-link{href: login_main_path}
85 %a.nav-link{href: login_main_path}
86 - %span.mi.md-18 exit_to_app
86 + %span.mi.mi-bs.md-18 exit_to_app
87 = @current_user.full_name
87 = @current_user.full_name
@@ -1,19 +1,19
1 = form_with url: submit_main_path, multipart: true, class: 'form' do |form|
1 = form_with url: submit_main_path, multipart: true, class: 'form' do |form|
2 - if @submission and @submission.errors.any?
2 - if @submission and @submission.errors.any?
3 #error_explanation
3 #error_explanation
4 .alert.alert-danger
4 .alert.alert-danger
5 %h3= "#{pluralize(@submission.errors.count, "error")} prohibited this user from being saved:"
5 %h3= "#{pluralize(@submission.errors.count, "error")} prohibited this user from being saved:"
6 %ul
6 %ul
7 - @submission.errors.full_messages.each do |msg|
7 - @submission.errors.full_messages.each do |msg|
8 %li= msg
8 %li= msg
9 .row.mb-2
9 .row.mb-2
10 .col-sm-2
10 .col-sm-2
11 - = form.label :submission, 'Problem:', class: 'form-label'
11 + = form.label :submission, 'Problem:', class: 'col-form-label'
12 .col-sm-10
12 .col-sm-10
13 = select 'submission', 'problem_id', [[(t 'main.specified_in_header'),'-1']] + @problems.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]}, {:selected => '-1'}, { class: 'select2 form-control', style: "width: 100%" }
13 = select 'submission', 'problem_id', [[(t 'main.specified_in_header'),'-1']] + @problems.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]}, {:selected => '-1'}, { class: 'select2 form-control', style: "width: 100%" }
14 .row.mb-2
14 .row.mb-2
15 .col-sm-2
15 .col-sm-2
16 - = form.label :file, 'File:', class: 'form-label'
16 + = form.label :file, 'File:', class: 'col-form-label'
17 .col-sm-10
17 .col-sm-10
18 = form.file_field :file, class: 'form-control'
18 = form.file_field :file, class: 'form-control'
19 = form.submit 'Submit', class: 'btn btn-primary'
19 = form.submit 'Submit', class: 'btn btn-primary'
@@ -1,65 +1,65
1 - content_for :head do
1 - content_for :head do
2 = stylesheet_link_tag 'problems'
2 = stylesheet_link_tag 'problems'
3 %h1 Problems
3 %h1 Problems
4 %p
4 %p
5 = link_to 'Import problems', {:action => 'import'}, class: 'btn btn-success btn-sm'
5 = link_to 'Import problems', {:action => 'import'}, class: 'btn btn-success btn-sm'
6 = link_to 'New problem', new_problem_path, class: 'btn btn-success btn-sm'
6 = link_to 'New problem', new_problem_path, class: 'btn btn-success btn-sm'
7 = link_to 'Bulk Manage', { action: 'manage'}, class: 'btn btn-info btn-sm'
7 = link_to 'Bulk Manage', { action: 'manage'}, class: 'btn btn-info btn-sm'
8 = link_to 'Turn off all problems', {:action => 'turn_all_off'}, class: 'btn btn-default btn-sm'
8 = link_to 'Turn off all problems', {:action => 'turn_all_off'}, class: 'btn btn-default btn-sm'
9 = link_to 'Turn on all problems', {:action => 'turn_all_on'}, class: 'btn btn-default btn-sm'
9 = link_to 'Turn on all problems', {:action => 'turn_all_on'}, class: 'btn btn-default btn-sm'
10 .submitbox
10 .submitbox
11 = form_tag action: 'quick_create', controller: 'problems' do
11 = form_tag action: 'quick_create', controller: 'problems' do
12 %b Quick New:
12 %b Quick New:
13 %label{:for => "problem_name"} Name
13 %label{:for => "problem_name"} Name
14 = text_field 'problem', 'name'
14 = text_field 'problem', 'name'
15 |
15 |
16 %label{:for => "problem_full_name"} Full name
16 %label{:for => "problem_full_name"} Full name
17 = text_field 'problem', 'full_name'
17 = text_field 'problem', 'full_name'
18 = submit_tag "Create"
18 = submit_tag "Create"
19 %table.table.table-condense.table-hover
19 %table.table.table-condense.table-hover
20 %thead
20 %thead
21 %th Name
21 %th Name
22 %th Full name
22 %th Full name
23 %th.text-right Full score
23 %th.text-right Full score
24 %th Tags
24 %th Tags
25 %th
25 %th
26 Submit
26 Submit
27 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Admin can always submit to any problem' } [?]
27 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Admin can always submit to any problem' } [?]
28 %th Date added
28 %th Date added
29 %th.text-center
29 %th.text-center
30 Avail?
30 Avail?
31 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Let user submits to this problem?' } [?]
31 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Let user submits to this problem?' } [?]
32 %th.text-center
32 %th.text-center
33 View Data?
33 View Data?
34 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Let user view the testcase of this problem?' } [?]
34 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Let user view the testcase of this problem?' } [?]
35 %th.text-center
35 %th.text-center
36 Test?
36 Test?
37 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Let user uses test interface on this problem?' } [?]
37 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Let user uses test interface on this problem?' } [?]
38 - if GraderConfiguration.multicontests?
38 - if GraderConfiguration.multicontests?
39 %th Contests
39 %th Contests
40 - for problem in @problems
40 - for problem in @problems
41 - %tr{:class => "#{(problem.available) ? "success" : "danger"}", :id => "prob-#{problem.id}", :name => "prob-#{problem.id}"}
41 + %tr{:class => "#{(problem.available) ? "bg-success bg-opacity-25" : "bg-opacity-25"}", :id => "prob-#{problem.id}", :name => "prob-#{problem.id}"}
42 - @problem=problem
42 - @problem=problem
43 %td= problem.name #in_place_editor_field :problem, :name, {}, :rows=>1
43 %td= problem.name #in_place_editor_field :problem, :name, {}, :rows=>1
44 %td
44 %td
45 = problem.full_name #in_place_editor_field :problem, :full_name, {}, :rows=>1
45 = problem.full_name #in_place_editor_field :problem, :full_name, {}, :rows=>1
46 = link_to_description_if_any "[#{t 'main.problem_desc'}] <span class='glyphicon glyphicon-file'></span>".html_safe, problem
46 = link_to_description_if_any "[#{t 'main.problem_desc'}] <span class='glyphicon glyphicon-file'></span>".html_safe, problem
47 %td.text-right= problem.full_score #in_place_editor_field :problem, :full_score, {}, :rows=>1
47 %td.text-right= problem.full_score #in_place_editor_field :problem, :full_score, {}, :rows=>1
48 %td
48 %td
49 - problem.tags.each do |t|
49 - problem.tags.each do |t|
50 - - #%button.btn.btn-default.btn-xs= t.name
50 + - #%button.btn.btn-default.btn-sm= t.name
51 %span.label.label-default= t.name
51 %span.label.label-default= t.name
52 - %td= link_to "Submit", direct_edit_problem_submissions_path(problem,@current_user.id), class: 'btn btn-xs btn-primary'
52 + %td= link_to "Submit", direct_edit_problem_submissions_path(problem,@current_user.id), class: 'btn btn-sm btn-primary'
53 %td= problem.date_added
53 %td= problem.date_added
54 %td= toggle_button(@problem.available?, toggle_problem_path(@problem), "problem-avail-#{@problem.id}")
54 %td= toggle_button(@problem.available?, toggle_problem_path(@problem), "problem-avail-#{@problem.id}")
55 %td= toggle_button(@problem.view_testcase?, toggle_view_testcase_problem_path(@problem), "problem-view-testcase-#{@problem.id}")
55 %td= toggle_button(@problem.view_testcase?, toggle_view_testcase_problem_path(@problem), "problem-view-testcase-#{@problem.id}")
56 %td= toggle_button(@problem.test_allowed?, toggle_test_problem_path(@problem), "problem-test-#{@problem.id}")
56 %td= toggle_button(@problem.test_allowed?, toggle_test_problem_path(@problem), "problem-test-#{@problem.id}")
57 - if GraderConfiguration.multicontests?
57 - if GraderConfiguration.multicontests?
58 %td
58 %td
59 = problem.contests.collect { |c| c.name }.join(', ')
59 = problem.contests.collect { |c| c.name }.join(', ')
60 - %td= link_to 'Stat', {:action => 'stat', :id => problem.id}, class: 'btn btn-info btn-xs btn-block'
60 + %td= link_to 'Stat', {:action => 'stat', :id => problem.id}, class: 'btn btn-info btn-sm btn-block'
61 - %td= link_to 'Show', {:action => 'show', :id => problem}, class: 'btn btn-info btn-xs btn-block'
61 + %td= link_to 'Show', {:action => 'show', :id => problem}, class: 'btn btn-info btn-sm btn-block'
62 - %td= link_to 'Edit', {:action => 'edit', :id => problem}, class: 'btn btn-info btn-xs btn-block'
62 + %td= link_to 'Edit', {:action => 'edit', :id => problem}, class: 'btn btn-info btn-sm btn-block'
63 - %td= link_to 'Destroy', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :delete, class: 'btn btn-danger btn-xs btn-block'
63 + %td= link_to 'Destroy', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :delete, class: 'btn btn-danger btn-sm btn-block'
64 %br/
64 %br/
65 = link_to '[New problem]', :action => 'new'
65 = link_to '[New problem]', :action => 'new'
@@ -1,8 +1,8
1 = render partial: 'toggle_button',
1 = render partial: 'toggle_button',
2 locals: {button_id: "#problem-avail-#{@problem.id}",button_on: @problem.available }
2 locals: {button_id: "#problem-avail-#{@problem.id}",button_on: @problem.available }
3 :plain
3 :plain
4 r = $("#prob-#{@problem.id}");
4 r = $("#prob-#{@problem.id}");
5 - r.removeClass('success');
5 + r.removeClass('bg-success');
6 - r.removeClass('danger');
6 + r.removeClass('bg-danger');
7 - r.addClass("#{@problem.available? ? 'success' : 'danger'}");
7 + r.addClass("#{@problem.available? ? 'bg-success' : 'bg-danger-'}");
8
8
@@ -1,25 +1,25
1 %h1 Test cases
1 %h1 Test cases
2 %h2= @problem.long_name
2 %h2= @problem.long_name
3
3
4 /navbar
4 /navbar
5 %ul.nav.nav-pills{role: :tablist}
5 %ul.nav.nav-pills{role: :tablist}
6 - @problem.testcases.each.with_index do |tc,id|
6 - @problem.testcases.each.with_index do |tc,id|
7 - %li{role: :presentation, class: ('active' if id == 0)}
7 + %li.nav-item{role: :presentation, class: ('active' if id == 0)}
8 - %a{href:"#tc#{tc.id}", role: 'tab', data: {toggle: 'tab'}}= tc.num
8 + %a.nav-link{href:"#tc#{tc.id}", role: 'tab', 'data-bs': {toggle: 'tab', target: "#tc#{tc.id}"}}= tc.num
9
9
10 /actual data
10 /actual data
11 .tab-content
11 .tab-content
12 - @problem.testcases.each.with_index do |tc,id|
12 - @problem.testcases.each.with_index do |tc,id|
13 .tab-pane{id: "tc#{tc.id}",class: ('active' if id == 0)}
13 .tab-pane{id: "tc#{tc.id}",class: ('active' if id == 0)}
14 .row
14 .row
15 .col-md-6
15 .col-md-6
16 %h3 Input
16 %h3 Input
17 = link_to "Download",download_input_testcase_path(tc),class: 'btn btn-info btn-sm'
17 = link_to "Download",download_input_testcase_path(tc),class: 'btn btn-info btn-sm'
18 .col-md-6
18 .col-md-6
19 %h3 Output
19 %h3 Output
20 = link_to "Download",download_sol_testcase_path(tc),class: 'btn btn-info btn-sm'
20 = link_to "Download",download_sol_testcase_path(tc),class: 'btn btn-info btn-sm'
21 .row
21 .row
22 .col-md-6
22 .col-md-6
23 %textarea{ rows: 25,readonly: true,style: "width:100%;resize=none;overflow-y: scroll;"}= tc.input
23 %textarea{ rows: 25,readonly: true,style: "width:100%;resize=none;overflow-y: scroll;"}= tc.input
24 .col-md-6
24 .col-md-6
25 %textarea{ rows: 25,readonly: true,style: "width:100%;resize=none;overflow-y: scroll;"}= tc.sol
25 %textarea{ rows: 25,readonly: true,style: "width:100%;resize=none;overflow-y: scroll;"}= tc.sol
You need to be logged in to leave comments. Login now