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

r870:9386e234b7f9 - - 29 files changed: 587 inserted, 683 deleted

@@ -0,0 +1,1
1 + $font-size-base: 0.875rem;
@@ -0,0 +1,416
1 +
2 + .secondnavbar {
3 + top: 50px;
4 + }
5 +
6 + // --------------- bootstrap file upload ----------------------
7 + .btn-file {
8 + position: relative;
9 + overflow: hidden;
10 + }
11 +
12 + .btn-file input[type=file] {
13 + position: absolute;
14 + top: 0;
15 + right: 0;
16 + min-width: 100%;
17 + min-height: 100%;
18 + font-size: 100px;
19 + text-align: right;
20 + filter: alpha(opacity = 0);
21 + opacity: 0;
22 + outline: none;
23 + background: white;
24 + cursor: inherit;
25 + display: block;
26 + }
27 +
28 + body {
29 + //font-size: 13px
30 + font-family: 'Krub', Tahoma, "sans-serif";
31 + margin: 10px;
32 + padding: 10px;
33 + padding-top: 60px;
34 + }
35 +
36 + // ------------------ bootstrap sortable --------------------
37 + table.sortable th {
38 + padding-right: 20px !important;
39 +
40 + span.sign {
41 + right: (-15px) !important;
42 + }
43 +
44 + &.text-right {
45 + padding-left: 20px !important;
46 + padding-right: 8px !important;
47 +
48 + &:after, span.sign {
49 + left: (-15px) !important;
50 + }
51 + }
52 + }
53 +
54 + input {
55 + font-family: Tahoma, "sans-serif";
56 + }
57 +
58 + h1 {
59 + color: #334488;
60 + }
61 +
62 + h2 {
63 + color: #5566bb;
64 + }
65 +
66 + hr {
67 + border-top: 1px solid #dddddd;
68 + border-bottom: 1px solid #eeeeee;
69 + }
70 +
71 + //#a
72 + // color: #6666cc
73 + // text-decoration: none
74 + //
75 + // &:link, &:visited
76 + // color: #6666cc
77 + // text-decoration: none
78 + //
79 + // &:hover, &:focus
80 + // color: #111166
81 + // text-decoration: none
82 +
83 + div {
84 + &.userbar {
85 + line-height: 1.5em;
86 + text-align: right;
87 + font-size: 12px;
88 + }
89 +
90 + &.title {
91 + padding: 10px 0px;
92 + line-height: 1.5em;
93 + font-size: 13px;
94 +
95 + span.contest-over-msg {
96 + font-size: 15px;
97 + color: red;
98 + }
99 +
100 + table {
101 + width: 100%;
102 + font-weight: bold;
103 + }
104 +
105 + td {
106 + &.left-col {
107 + text-align: left;
108 + vertical-align: top;
109 + color: #444444;
110 + }
111 +
112 + &.right-col {
113 + text-align: right;
114 + vertical-align: top;
115 + font-size: 18px;
116 + color: #116699;
117 + }
118 + }
119 + }
120 + }
121 +
122 + table.info {
123 + margin: 10px 0;
124 + border: 1px solid #666666;
125 + border-collapse: collapse;
126 + font-size: 12px;
127 +
128 + th {
129 + border: 1px solid #666666;
130 + line-height: 1.5em;
131 + padding: 0 0.5em;
132 + }
133 +
134 + td {
135 + border-left: 1px solid #666666;
136 + border-right: 1px solid #666666;
137 + line-height: 1.5em;
138 + padding: 0 0.5em;
139 + }
140 + }
141 +
142 + tr {
143 + &.info-head {
144 + background: #777777;
145 + color: white;
146 + }
147 +
148 + &.info-odd {
149 + background: #eeeeee;
150 + }
151 +
152 + &.info-even {
153 + background: #fcfcfc;
154 + }
155 + }
156 +
157 + @mixin basicbox {
158 + background: #eeeeff;
159 + border: 1px dotted #99aaee;
160 + padding: 5px;
161 + margin: 10px 0px;
162 + color: black;
163 + font-size: 13px;
164 + }
165 +
166 + .infobox {
167 + @include basicbox;
168 + }
169 +
170 + .submitbox {
171 + @include basicbox;
172 + }
173 +
174 + .errorExplanation {
175 + border: 1px dotted gray;
176 + color: #bb2222;
177 + padding: 5px 15px 5px 15px;
178 + margin-bottom: 5px;
179 + background-color: white;
180 + font-weight: normal;
181 +
182 + h2 {
183 + color: #cc1111;
184 + font-weight: bold;
185 + }
186 + }
187 +
188 + table.uinfo {
189 + border-collapse: collapse;
190 + border: 1px solid black;
191 + font-size: 13px;
192 + }
193 +
194 + td.uinfo {
195 + vertical-align: top;
196 + border: 1px solid black;
197 + padding: 5px;
198 + }
199 +
200 + th.uinfo {
201 + background: lightgreen;
202 + vertical-align: top;
203 + text-align: right;
204 + border: 1px solid black;
205 + padding: 5px;
206 + }
207 +
208 + div {
209 + &.compilermsgbody {
210 + font-family: monospace;
211 + }
212 +
213 + &.task-menu {
214 + text-align: center;
215 + font-size: 13px;
216 + line-height: 1.75em;
217 + font-weight: bold;
218 + border-top: 1px dashed gray;
219 + border-bottom: 1px dashed gray;
220 + margin-top: 2px;
221 + margin-bottom: 4px;
222 + }
223 + }
224 +
225 + table.taskdesc {
226 + border: 2px solid #dddddd;
227 + border-collapse: collapse;
228 + margin: 10px auto;
229 + width: 90%;
230 + font-size: 13px;
231 +
232 + p {
233 + font-size: 13px;
234 + }
235 +
236 + tr.name {
237 + border: 2px solid #dddddd;
238 + background: #dddddd;
239 + color: #333333;
240 + font-weight: bold;
241 + font-size: 14px;
242 + line-height: 1.5em;
243 + text-align: center;
244 + }
245 +
246 + td {
247 + &.desc-odd {
248 + padding: 5px;
249 + padding-left: 20px;
250 + background: #fefeee;
251 + }
252 +
253 + &.desc-even {
254 + padding: 5px;
255 + padding-left: 20px;
256 + background: #feeefe;
257 + }
258 + }
259 + }
260 +
261 + .announcementbox {
262 + margin: 10px 0px;
263 + background: #bbddee;
264 + padding: 1px;
265 +
266 + span.title {
267 + font-weight: bold;
268 + color: #224455;
269 + padding-left: 10px;
270 + line-height: 1.6em;
271 + }
272 + }
273 +
274 + .announcement {
275 + margin: 2px;
276 + background: white;
277 + padding: 1px;
278 + padding-left: 10px;
279 + padding-right: 10px;
280 + padding-top: 5px;
281 + padding-bottom: 5px;
282 + }
283 +
284 + .announcement p {
285 + font-size: 12px;
286 + margin: 2px;
287 + }
288 +
289 + .pub-info {
290 + text-align: right;
291 + font-style: italic;
292 + font-size: 9px;
293 +
294 + p {
295 + text-align: right;
296 + font-style: italic;
297 + font-size: 9px;
298 + }
299 + }
300 +
301 + .announcement {
302 + .toggles {
303 + font-weight: normal;
304 + float: right;
305 + font-size: 80%;
306 + }
307 +
308 + .announcement-title {
309 + font-weight: bold;
310 + }
311 + }
312 +
313 + div {
314 + &.message {
315 + margin: 10px 0 0;
316 +
317 + div {
318 + &.message {
319 + margin: 0 0 0 30px;
320 + }
321 +
322 + &.body {
323 + border: 2px solid #dddddd;
324 + background: #fff8f8;
325 + padding-left: 5px;
326 + }
327 +
328 + &.reply-body {
329 + border: 2px solid #bbbbbb;
330 + background: #fffff8;
331 + padding-left: 5px;
332 + }
333 +
334 + &.stat {
335 + font-size: 10px;
336 + line-height: 1.75em;
337 + padding: 0 5px;
338 + color: #333333;
339 + background: #dddddd;
340 + font-weight: bold;
341 + }
342 +
343 + &.message div.stat {
344 + font-size: 10px;
345 + line-height: 1.75em;
346 + padding: 0 5px;
347 + color: #444444;
348 + background: #bbbbbb;
349 + font-weight: bold;
350 + }
351 + }
352 + }
353 +
354 + &.contest-title {
355 + color: white;
356 + text-align: center;
357 + line-height: 2em;
358 + }
359 +
360 + &.registration-desc, &.test-desc {
361 + border: 1px dotted gray;
362 + background: #f5f5f5;
363 + padding: 5px;
364 + margin: 10px 0;
365 + font-size: 12px;
366 + line-height: 1.5em;
367 + }
368 + }
369 +
370 + h2.contest-title {
371 + margin-top: 5px;
372 + margin-bottom: 5px;
373 + }
374 +
375 +
376 +
377 + .grader-comment {
378 + word-wrap: break-word;
379 + font-family: consolas;
380 + }
381 +
382 +
383 + golden-btn + .golden-btn { margin-top: 1em; }
384 +
385 + .golden-btn {
386 + display: inline-block;
387 + outline: none;
388 + font-family: inherit;
389 + box-sizing: border-box;
390 + border: none;
391 + 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),
393 + inset 0 -1px 1px 3px rgba(250,227,133,1);
394 + background-image: linear-gradient(160deg, #a54e07, #b47e11, #fef1a2, #bc881b, #a54e07) !important;
395 + border: 1px solid #a55d07;
396 + color: rgb(120,50,5);
397 + text-shadow: 0 2px 2px rgba(250, 227, 133, 1);
398 + cursor: pointer;
399 + transition: all .2s ease-in-out;
400 + background-size: 100% 100%;
401 + background-position:center;
402 + }
403 + .golden-btn:focus,
404 + .golden-btn:hover {
405 + 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),
407 + inset 0 -2px 5px 1px #b17d10,
408 + inset 0 -1px 1px 3px rgba(250,227,133,1);
409 + border: 1px solid rgba(165,93,7,.6);
410 + color: rgba(120,50,5,.8);
411 + }
412 + .golden-btn:active {
413 + 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,
415 + inset 0 -1px 1px 3px rgba(250,227,133,1);
416 + }
@@ -30,6 +30,8
30 30
31 31 #ignore rvm setting file
32 32 #.ruby-gemset
33 33 #.ruby-version
34 34
35 35 /config/secrets.yml
36 +
37 + /.byebug_history
@@ -99,13 +99,13
99 99 #---------------- for console --------------------
100 100 gem 'fuzzy-string-match'
101 101
102 102
103 103 group :development, :test do
104 104 # Call 'byebug' anywhere in the code to stop execution and get a debugger console
105 - gem 'debug', platforms: [:mri, :mingw, :x64_mingw]
105 + gem 'byebug'
106 106 end
107 107
108 108 group :development do
109 109 # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
110 110 gem 'web-console', '>= 3.3.0'
111 111 gem 'listen', '>= 3.0.5', '< 3.2'
@@ -89,17 +89,18
89 89 ansi (1.5.0)
90 90 autoprefixer-rails (10.4.7.0)
91 91 execjs (~> 2)
92 92 bindex (0.8.1)
93 93 bootsnap (1.13.0)
94 94 msgpack (~> 1.2)
95 - bootstrap (5.2.0)
95 + bootstrap (5.2.1)
96 96 autoprefixer-rails (>= 9.1.0)
97 - popper_js (>= 2.11.5, < 3)
97 + popper_js (>= 2.11.6, < 3)
98 98 sassc-rails (>= 2.0.0)
99 99 builder (3.2.4)
100 + byebug (11.1.3)
100 101 capybara (3.37.1)
101 102 addressable
102 103 matrix
103 104 mini_mime (>= 0.1.3)
104 105 nokogiri (~> 1.8)
105 106 rack (>= 1.6.0)
@@ -113,15 +114,12
113 114 coffee-script (2.4.1)
114 115 coffee-script-source
115 116 execjs
116 117 coffee-script-source (1.12.2)
117 118 concurrent-ruby (1.1.10)
118 119 crass (1.0.6)
119 - debug (1.6.2)
120 - irb (>= 1.3.6)
121 - reline (>= 0.3.1)
122 120 digest (3.1.0)
123 121 dynamic_form (1.1.4)
124 122 erubi (1.11.0)
125 123 erubis (2.7.0)
126 124 execjs (2.8.1)
127 125 ffi (1.15.5)
@@ -146,26 +144,23
146 144 i18n (1.12.0)
147 145 concurrent-ruby (~> 1.0)
148 146 importmap-rails (1.1.5)
149 147 actionpack (>= 6.0.0)
150 148 railties (>= 6.0.0)
151 149 in_place_editing (1.2.0)
152 - io-console (0.5.11)
153 - irb (1.4.1)
154 - reline (>= 0.3.0)
155 150 jbuilder (2.11.5)
156 151 actionview (>= 5.0.0)
157 152 activesupport (>= 5.0.0)
158 153 jquery-rails (4.5.0)
159 154 rails-dom-testing (>= 1, < 3)
160 155 railties (>= 4.2.0)
161 156 thor (>= 0.14, < 2.0)
162 157 listen (3.0.8)
163 158 rb-fsevent (~> 0.9, >= 0.9.4)
164 159 rb-inotify (~> 0.9, >= 0.9.7)
165 - loofah (2.18.0)
160 + loofah (2.19.0)
166 161 crass (~> 1.0.2)
167 162 nokogiri (>= 1.5.9)
168 163 mail (2.7.1)
169 164 mini_mime (>= 0.1.1)
170 165 marcel (1.0.2)
171 166 material_icons (2.2.1)
@@ -196,17 +191,15
196 191 timeout
197 192 net-smtp (0.3.1)
198 193 digest
199 194 net-protocol
200 195 timeout
201 196 nio4r (2.5.8)
202 - nokogiri (1.13.8-x86_64-darwin)
203 - racc (~> 1.4)
204 197 nokogiri (1.13.8-x86_64-linux)
205 198 racc (~> 1.4)
206 - popper_js (2.11.5)
199 + popper_js (2.11.6)
207 200 public_suffix (5.0.0)
208 201 puma (5.6.5)
209 202 nio4r (~> 2.0)
210 203 racc (1.6.0)
211 204 rack (2.2.4)
212 205 rack-test (2.0.2)
@@ -240,14 +233,12
240 233 rake (13.0.6)
241 234 rb-fsevent (0.11.2)
242 235 rb-inotify (0.10.1)
243 236 ffi (~> 1.0)
244 237 rdiscount (2.2.0.2)
245 238 regexp_parser (2.5.0)
246 - reline (0.3.1)
247 - io-console (~> 0.5)
248 239 rexml (3.2.5)
249 240 rouge (4.0.0)
250 241 ruby-progressbar (1.11.0)
251 242 ruby_parser (3.19.1)
252 243 sexp_processor (~> 4.16)
253 244 rubyzip (2.3.2)
@@ -276,13 +267,12
276 267 concurrent-ruby (~> 1.0)
277 268 rack (> 1, < 3)
278 269 sprockets-rails (3.4.2)
279 270 actionpack (>= 5.2)
280 271 activesupport (>= 5.2)
281 272 sprockets (>= 3.0.0)
282 - sqlite3 (1.5.0-x86_64-darwin)
283 273 sqlite3 (1.5.0-x86_64-linux)
284 274 strscan (3.0.4)
285 275 temple (0.8.2)
286 276 thor (1.2.1)
287 277 tilt (2.0.11)
288 278 timeout (0.3.0)
@@ -290,37 +280,36
290 280 concurrent-ruby (~> 1.0)
291 281 web-console (4.2.0)
292 282 actionview (>= 6.0.0)
293 283 activemodel (>= 6.0.0)
294 284 bindex (>= 0.4.0)
295 285 railties (>= 6.0.0)
296 - webdrivers (5.0.0)
286 + webdrivers (5.1.0)
297 287 nokogiri (~> 1.6)
298 288 rubyzip (>= 1.3.0)
299 289 selenium-webdriver (~> 4.0)
300 290 websocket (1.2.9)
301 291 websocket-driver (0.7.5)
302 292 websocket-extensions (>= 0.1.0)
303 293 websocket-extensions (0.1.5)
304 294 xpath (3.2.0)
305 295 nokogiri (~> 1.8)
306 296 zeitwerk (2.6.0)
307 297
308 298 PLATFORMS
309 - x86_64-darwin-20
310 299 x86_64-linux
311 300
312 301 DEPENDENCIES
313 302 ace-rails-ap
314 303 activerecord-session_store
315 304 best_in_place!
316 305 bootsnap
317 306 bootstrap (~> 5.2)
307 + byebug
318 308 capybara
319 309 coffee-rails
320 - debug
321 310 dynamic_form
322 311 fuzzy-string-match
323 312 haml
324 313 haml-rails
325 314 importmap-rails (~> 1.1)
326 315 in_place_editing
@@ -1,8 +1,9
1 1 //main entry point for sprocket
2 - //= require jquery
2 + //= require jquery3
3 + //= require jquery_ujs
3 4 //= require moment
4 5 //= require moment/th
5 6 //= require ace-rails-ap
6 7 //= require ace/mode-c_cpp
7 8 //= require ace/mode-python
8 9 //= require ace/mode-ruby
@@ -23,12 +23,13
23 23 //@import "jquery-tablesorter/theme.metro-dark";
24 24 //@import "jquery.countdown";
25 25 //@import "tablesorter-theme.cafe";
26 26
27 27 //bootstrap
28 28 //@import "bootstrap-sprockets";
29 + @import "my_bootstrap_var";
29 30 @import "bootstrap";
30 31 @import "select2/select2.min";
31 32 @import "select2/select2-bootstrap-5-theme.min";
32 33
33 34 //@import bootstrap3-switch
34 35 //@import "bootstrap-toggle";
@@ -40,12 +41,13
40 41
41 42 //new import
42 43 @import 'datatables/datatables.min';
43 44 @import 'material_icons';
44 45
45 46 //bootstrap navbar color (from)
47 + /*
46 48 $bgDefault: #19197b;
47 49 $bgHighlight: #06064b;
48 50 $colDefault: #8e8eb4;
49 51 $colHighlight: #ffffff;
50 52 $dropDown: false;
51 53
@@ -54,12 +56,15
54 56 src: font-path('bootstrap/glyphicons-halflings-regular.eot');
55 57 src: font-path('bootstrap/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),
56 58 font-path('bootstrap/glyphicons-halflings-regular.woff') format('woff'),
57 59 font-path('bootstrap/glyphicons-halflings-regular.ttf') format('truetype'),
58 60 font-path('bootstrap/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');
59 61 }
62 + */
63 +
64 + @import 'my_custom'
60 65
61 66 /*
62 67 .navbar-default {
63 68 background-color: $bgDefault;
64 69 border-color: $bgHighlight;
65 70
@@ -173,428 +178,8
173 178 color: $colHighlight;
174 179 background-color: $bgHighlight;
175 180 }
176 181 }
177 182 }
178 183 }
179 -
180 184 */
181 - .secondnavbar {
182 - top: 50px;
183 - }
184 -
185 - // --------------- bootstrap file upload ----------------------
186 - .btn-file {
187 - position: relative;
188 - overflow: hidden;
189 - }
190 -
191 - .btn-file input[type=file] {
192 - position: absolute;
193 - top: 0;
194 - right: 0;
195 - min-width: 100%;
196 - min-height: 100%;
197 - font-size: 100px;
198 - text-align: right;
199 - filter: alpha(opacity = 0);
200 - opacity: 0;
201 - outline: none;
202 - background: white;
203 - cursor: inherit;
204 - display: block;
205 - }
206 -
207 - body {
208 - background: white image-url("topbg.jpg") repeat-x top center;
209 -
210 - //font-size: 13px
211 - //font-family: Tahoma, "sans-serif"
212 - margin: 10px;
213 - padding: 10px;
214 - padding-top: 60px;
215 - }
216 -
217 - // ------------------ bootstrap sortable --------------------
218 - table.sortable th {
219 - padding-right: 20px !important;
220 -
221 - span.sign {
222 - right: (-15px) !important;
223 - }
224 -
225 - &.text-right {
226 - padding-left: 20px !important;
227 - padding-right: 8px !important;
228 -
229 - &:after, span.sign {
230 - left: (-15px) !important;
231 - }
232 - }
233 - }
234 -
235 - input {
236 - font-family: Tahoma, "sans-serif";
237 - }
238 -
239 - h1 {
240 - font-size: 24px;
241 - color: #334488;
242 - line-height: 2em;
243 - }
244 -
245 - h2 {
246 - font-size: 18px;
247 - color: #5566bb;
248 - line-height: 1.5em;
249 - }
250 -
251 - hr {
252 - border-top: 1px solid #dddddd;
253 - border-bottom: 1px solid #eeeeee;
254 - }
255 -
256 - //#a
257 - // color: #6666cc
258 - // text-decoration: none
259 - //
260 - // &:link, &:visited
261 - // color: #6666cc
262 - // text-decoration: none
263 - //
264 - // &:hover, &:focus
265 - // color: #111166
266 - // text-decoration: none
267 -
268 - div {
269 - &.userbar {
270 - line-height: 1.5em;
271 - text-align: right;
272 - font-size: 12px;
273 - }
274 -
275 - &.title {
276 - padding: 10px 0px;
277 - line-height: 1.5em;
278 - font-size: 13px;
279 -
280 - span.contest-over-msg {
281 - font-size: 15px;
282 - color: red;
283 - }
284 -
285 - table {
286 - width: 100%;
287 - font-weight: bold;
288 - }
289 -
290 - td {
291 - &.left-col {
292 - text-align: left;
293 - vertical-align: top;
294 - color: #444444;
295 - }
296 -
297 - &.right-col {
298 - text-align: right;
299 - vertical-align: top;
300 - font-size: 18px;
301 - color: #116699;
302 - }
303 - }
304 - }
305 - }
306 -
307 - table.info {
308 - margin: 10px 0;
309 - border: 1px solid #666666;
310 - border-collapse: collapse;
311 - font-size: 12px;
312 -
313 - th {
314 - border: 1px solid #666666;
315 - line-height: 1.5em;
316 - padding: 0 0.5em;
317 - }
318 -
319 - td {
320 - border-left: 1px solid #666666;
321 - border-right: 1px solid #666666;
322 - line-height: 1.5em;
323 - padding: 0 0.5em;
324 - }
325 - }
326 -
327 - tr {
328 - &.info-head {
329 - background: #777777;
330 - color: white;
331 - }
332 -
333 - &.info-odd {
334 - background: #eeeeee;
335 - }
336 -
337 - &.info-even {
338 - background: #fcfcfc;
339 - }
340 - }
341 -
342 - @mixin basicbox {
343 - background: #eeeeff;
344 - border: 1px dotted #99aaee;
345 - padding: 5px;
346 - margin: 10px 0px;
347 - color: black;
348 - font-size: 13px;
349 - }
350 -
351 - .infobox {
352 - @include basicbox;
353 - }
354 -
355 - .submitbox {
356 - @include basicbox;
357 - }
358 -
359 - .errorExplanation {
360 - border: 1px dotted gray;
361 - color: #bb2222;
362 - padding: 5px 15px 5px 15px;
363 - margin-bottom: 5px;
364 - background-color: white;
365 - font-weight: normal;
366 -
367 - h2 {
368 - color: #cc1111;
369 - font-weight: bold;
370 - }
371 - }
372 -
373 - table.uinfo {
374 - border-collapse: collapse;
375 - border: 1px solid black;
376 - font-size: 13px;
377 - }
378 -
379 - td.uinfo {
380 - vertical-align: top;
381 - border: 1px solid black;
382 - padding: 5px;
383 - }
384 185
385 - th.uinfo {
386 - background: lightgreen;
387 - vertical-align: top;
388 - text-align: right;
389 - border: 1px solid black;
390 - padding: 5px;
391 - }
392 -
393 - div {
394 - &.compilermsgbody {
395 - font-family: monospace;
396 - }
397 -
398 - &.task-menu {
399 - text-align: center;
400 - font-size: 13px;
401 - line-height: 1.75em;
402 - font-weight: bold;
403 - border-top: 1px dashed gray;
404 - border-bottom: 1px dashed gray;
405 - margin-top: 2px;
406 - margin-bottom: 4px;
407 - }
408 - }
409 -
410 - table.taskdesc {
411 - border: 2px solid #dddddd;
412 - border-collapse: collapse;
413 - margin: 10px auto;
414 - width: 90%;
415 - font-size: 13px;
416 -
417 - p {
418 - font-size: 13px;
419 - }
420 -
421 - tr.name {
422 - border: 2px solid #dddddd;
423 - background: #dddddd;
424 - color: #333333;
425 - font-weight: bold;
426 - font-size: 14px;
427 - line-height: 1.5em;
428 - text-align: center;
429 - }
430 -
431 - td {
432 - &.desc-odd {
433 - padding: 5px;
434 - padding-left: 20px;
435 - background: #fefeee;
436 - }
437 -
438 - &.desc-even {
439 - padding: 5px;
440 - padding-left: 20px;
441 - background: #feeefe;
442 - }
443 - }
444 - }
445 -
446 - .announcementbox {
447 - margin: 10px 0px;
448 - background: #bbddee;
449 - padding: 1px;
450 -
451 - span.title {
452 - font-weight: bold;
453 - color: #224455;
454 - padding-left: 10px;
455 - line-height: 1.6em;
456 - }
457 - }
458 -
459 - .announcement {
460 - margin: 2px;
461 - background: white;
462 - padding: 1px;
463 - padding-left: 10px;
464 - padding-right: 10px;
465 - padding-top: 5px;
466 - padding-bottom: 5px;
467 - }
468 -
469 - .announcement p {
470 - font-size: 12px;
471 - margin: 2px;
472 - }
473 -
474 - .pub-info {
475 - text-align: right;
476 - font-style: italic;
477 - font-size: 9px;
478 -
479 - p {
480 - text-align: right;
481 - font-style: italic;
482 - font-size: 9px;
483 - }
484 - }
485 -
486 - .announcement {
487 - .toggles {
488 - font-weight: normal;
489 - float: right;
490 - font-size: 80%;
491 - }
492 -
493 - .announcement-title {
494 - font-weight: bold;
495 - }
496 - }
497 -
498 - div {
499 - &.message {
500 - margin: 10px 0 0;
501 -
502 - div {
503 - &.message {
504 - margin: 0 0 0 30px;
505 - }
506 -
507 - &.body {
508 - border: 2px solid #dddddd;
509 - background: #fff8f8;
510 - padding-left: 5px;
511 - }
512 -
513 - &.reply-body {
514 - border: 2px solid #bbbbbb;
515 - background: #fffff8;
516 - padding-left: 5px;
517 - }
518 -
519 - &.stat {
520 - font-size: 10px;
521 - line-height: 1.75em;
522 - padding: 0 5px;
523 - color: #333333;
524 - background: #dddddd;
525 - font-weight: bold;
526 - }
527 -
528 - &.message div.stat {
529 - font-size: 10px;
530 - line-height: 1.75em;
531 - padding: 0 5px;
532 - color: #444444;
533 - background: #bbbbbb;
534 - font-weight: bold;
535 - }
536 - }
537 - }
538 -
539 - &.contest-title {
540 - color: white;
541 - text-align: center;
542 - line-height: 2em;
543 - }
544 -
545 - &.registration-desc, &.test-desc {
546 - border: 1px dotted gray;
547 - background: #f5f5f5;
548 - padding: 5px;
549 - margin: 10px 0;
550 - font-size: 12px;
551 - line-height: 1.5em;
552 - }
553 - }
554 -
555 - h2.contest-title {
556 - margin-top: 5px;
557 - margin-bottom: 5px;
558 - }
559 -
560 -
561 -
562 - .grader-comment {
563 - word-wrap: break-word;
564 - }
565 -
566 -
567 - golden-btn + .golden-btn { margin-top: 1em; }
568 -
569 - .golden-btn {
570 - display: inline-block;
571 - outline: none;
572 - font-family: inherit;
573 - box-sizing: border-box;
574 - border: none;
575 - box-shadow: 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(110,80,20,.4),
576 - inset 0 -2px 5px 1px rgba(139,66,8,1),
577 - inset 0 -1px 1px 3px rgba(250,227,133,1);
578 - background-image: linear-gradient(160deg, #a54e07, #b47e11, #fef1a2, #bc881b, #a54e07) !important;
579 - border: 1px solid #a55d07;
580 - color: rgb(120,50,5);
581 - text-shadow: 0 2px 2px rgba(250, 227, 133, 1);
582 - cursor: pointer;
583 - transition: all .2s ease-in-out;
584 - background-size: 100% 100%;
585 - background-position:center;
586 - }
587 - .golden-btn:focus,
588 - .golden-btn:hover {
589 - background-size: 150% 150%;
590 - box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23),
591 - inset 0 -2px 5px 1px #b17d10,
592 - inset 0 -1px 1px 3px rgba(250,227,133,1);
593 - border: 1px solid rgba(165,93,7,.6);
594 - color: rgba(120,50,5,.8);
595 - }
596 - .golden-btn:active {
597 - box-shadow: 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(110,80,20,.4),
598 - inset 0 -2px 5px 1px #b17d10,
599 - inset 0 -1px 1px 3px rgba(250,227,133,1);
600 - }
@@ -1,25 +1,21
1 1 // Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
2 2 //import "@hotwired/turbo-rails"
3 3 //import "controllers"
4 4 //
5 5
6 - //import "my_sprocket"
7 - import "pdfmake"
8 - import "pdfmake-vfs"
9 - import "jszip"
10 6
11 7 //bootstrap
12 8 import "bootstrap"
13 9 window.bootstrap = bootstrap
14 - console.log($); // ok
15 - console.log(bootstrap)
16 - console.log(JSZip);
17 10
18 11 //datatable
19 12 //import 'datatables-bundle'
13 + import "pdfmake"
14 + import "pdfmake-vfs"
15 + import "jszip"
20 16 import "datatables"
21 17 import "datatables-bs5"
22 18 import "datatables-editor"
23 19 import "datatables-editor-bs5"
24 20 import "datatables-autofill"
25 21 import "datatables-autofill-bs5"
@@ -46,16 +42,12
46 42 import "datatables-staterestore"
47 43 import "datatables-staterestore-bs5"
48 44 /* */
49 45
50 46 import "select2"
51 47
52 - //import "ace-rails-ap"
53 - //import "ace/theme-merbivore"
54 - //import "ace/mode-python"
55 -
56 48 //my own customization
57 49 import 'custom'
58 50
59 51
60 52 console.log('application.js ready')
61 53
@@ -5,13 +5,18
5 5 label = input.val().replace(/\\/g, '/').replace(/.*\//, '');
6 6 input.trigger('fileselect', [numFiles, label]);
7 7 });
8 8
9 9 $(function() {
10 10 var e;
11 - $(".select2").select2({});
11 + $(".select2").select2({
12 + theme: "bootstrap-5",
13 + //selectionCssClass: "select2--small",
14 + //dropdownCssClass: "select2--small",
15 + });
16 +
12 17 $('.btn-file :file').on('fileselect', function(event, numFiles, label) {
13 18 var input, log;
14 19 input = $(this).parents('.input-group').find(':text');
15 20 log = numFiles > 1 ? numFiles + ' files selected' : label;
16 21 if (input.length) {
17 22 input.val(log);
@@ -1,3 +1,3
1 1 class ApplicationRecord < ActiveRecord::Base
2 - self.abstract_class = true
2 + primary_abstract_class
3 3 end
@@ -1,7 +1,7
1 - class Submission < ActiveRecord::Base
1 + class Submission < ApplicationRecord
2 2
3 3 enum tag: {default: 0, model: 1}, _prefix: true
4 4
5 5 belongs_to :language
6 6 belongs_to :problem
7 7 belongs_to :user
@@ -88,13 +88,13
88 88 return nil
89 89 end
90 90
91 91 def self.find_language_in_source(source, source_filename="")
92 92 langopt = find_option_in_source(/^LANG:/,source)
93 93 if langopt
94 - return (Language.find_by_name(langopt) ||
94 + return (Language.find_by_name(langopt) ||
95 95 Language.find_by_pretty_name(langopt))
96 96 else
97 97 if source_filename
98 98 return Language.find_by_extension(source_filename.split('.').last)
99 99 else
100 100 return nil
@@ -140,20 +140,20
140 140 return if self.source==nil
141 141
142 142 # for output_only tasks
143 143 return if self.problem!=nil and self.problem.output_only
144 144
145 145 if self.language == nil
146 - errors.add('source',"Cannot detect language. Did you submit a correct source file?")
146 + errors.add(:source,:invalid,message: "Cannot detect language. Did you submit a correct source file?")
147 147 end
148 148 end
149 149
150 150 def must_have_valid_problem
151 151 return if self.source==nil
152 152 if self.problem==nil
153 - errors.add('problem',"must be specified.")
153 + errors.add(:problem,:blank,'aaa')
154 154 else
155 155 #admin always have right
156 156 return if self.user.admin?
157 157
158 158 #check if user has the right to submit the problem
159 159 errors[:base] << "Authorization error: you have no right to submit to this problem" if (!self.user.available_problems.include?(self.problem)) and (self.new_record?)
@@ -9,18 +9,11
9 9 = "( #{time_ago_in_words(submission.submitted_at)} ago)"
10 10 %td
11 11 = submission.source_filename
12 12 = " (#{submission.language.pretty_name}) "
13 13 = link_to '[load]', download_submission_path(submission)
14 14 %td
15 - - if submission.graded_at
16 - = "Graded at #{format_short_time(submission.graded_at)}."
17 - %br/
18 - = "Score: #{(submission.points*100/submission.problem.full_score).to_i} " if GraderConfiguration['ui.show_score']
19 - = " ["
20 - %tt
21 - = submission.grader_comment
22 - = "]"
15 + = render 'submission_short', submission: submission, show_button: false, problem_id: submission&.problem&.id
23 16 %td
24 17 = render :partial => 'compiler_message', :locals => {:compiler_message => submission.compiler_message }
25 18 %td
26 19 = link_to 'Edit', edit_submission_path(submission.id), class: 'btn btn-success'
@@ -1,32 +1,33
1 1 - if submission.nil?
2 2 = "-"
3 3 - else
4 - %strong= "Submission ID:"
5 - = submission.id
6 - %br
4 + - if local_assigns[:show_id]
5 + .row
6 + .col-3.text-secondary
7 + Sub ID:
8 + %strong.col-9= submission.id
7 9 - unless submission.graded_at
8 - %strong= t 'main.submitted_at:'
9 - = format_full_time_ago(submission.submitted_at.localtime)
10 + .row
11 + .col-3.text-secondary= t 'main.submitted_at'
12 + %strong.col-9= format_full_time_ago(submission.submitted_at.localtime)
10 13 - else
11 - %strong= t 'main.graded_at:'
12 - = format_full_time_ago(submission.graded_at.localtime)
13 - %br
14 + .row
15 + .col-3.text-secondary= t 'main.graded_at'
16 + %strong.col-9= format_full_time_ago(submission.graded_at.localtime)
14 17 - if GraderConfiguration['ui.show_score']
15 - %strong=t 'main.score'
16 - = "#{(submission.points*100/submission.problem.full_score).to_i} "
17 - = " ["
18 - %tt
19 - = submission.grader_comment
20 - = "]"
21 - %br
22 - %strong View:
23 - - if GraderConfiguration.show_grading_result
24 - = link_to '[detailed result]', :action => 'result', :id => submission.id
25 - - if submission.graded_at
26 - = link_to "#{t 'main.cmp_msg'}", compiler_msg_submission_path(submission), {popup: true,remote: true,class: 'btn btn-xs btn-info'}
27 - -#
28 - %button.btn.btn-info.btn-xs{type: 'button', data: {toggle: 'modal', target: '#compiler'}}
29 - =t 'main.cmp_msg'
30 - = link_to "#{t 'main.src_link'}", download_submission_path(submission.id), class: 'btn btn-xs btn-info'
31 - = link_to "#{t 'main.submissions_link'}", problem_submissions_path(problem_id), class: 'btn btn-xs btn-info'
18 + .row
19 + .col-3.text-secondary=t 'main.score'
20 + %strong.col-9
21 + = (submission.points*100/submission.problem.full_score).to_i
22 + %tt.grader-comment
23 + = " [#{submission.grader_comment}]"
24 + - if local_assigns[:show_button]
25 + - if submission.graded_at
26 + - if GraderConfiguration.show_grading_result
27 + = link_to '[detailed result]', :action => 'result', :id => submission.id
28 + = link_to "#{t 'main.cmp_msg'}", compiler_msg_submission_path(submission), {popup: true,remote: true,class: 'btn btn-sm btn-info'}
29 + = link_to "#{t 'main.src_link'}",download_submission_path(submission), class: 'btn btn-sm btn-info'
30 + = link_to "#{t 'main.submissions_link'}", problem_submissions_path(submission.problem.id), class: 'btn btn-sm btn-info'
31 + - if GraderConfiguration.show_testcase
32 + = link_to "testcases", show_problem_testcases_path(submission.problem.id), class: 'btn btn-sm btn-info'
32 33
@@ -11,13 +11,15
11 11 = content_for :header
12 12 = yield :head
13 13 -# %link{href:"https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/css/bootstrap.min.css",rel:"stylesheet",integrity:"sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT",crossorigin:"anonymous"}
14 14 -# %script{src:"https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js",integrity:"sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3",crossorigin:"anonymous"}
15 15 -# %script{src:"https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.bundle.min.js",integrity:"sha384-7VPbUDkoPSGFnVtYi0QogXtr74QeVeeIs99Qfg5YCF+TidwNdjvaKZX19NZ/e6oz",crossorigin:"anonymous"}
16 16
17 -
17 + <link rel="preconnect" href="https://fonts.googleapis.com">
18 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
19 + <link href="https://fonts.googleapis.com/css2?family=Bai+Jamjuree:ital@0;1&family=Krub:ital,wght@0,200;0,400;0,600;1,200;1,400;1,600&family=Sarabun:ital,wght@0,200;0,400;0,600;1,200;1,400;1,600&display=swap" rel="stylesheet">
18 20
19 21 %body
20 22 - unless local_assigns[:skip_header]
21 23 = render 'layouts/header'
22 24
23 25 /= content_tag(:p,flash[:notice],class: 'alert alert-success') if flash[:notice]!=nil
@@ -1,11 +1,12
1 - .card-body
1 + %li.list-group-item
2 2 .card-title
3 - = announcement.title
4 - - if @current_user and @current_user.admin?
5 - = link_to 'Edit', edit_announcement_path(announcement), class: 'btn btn-xs btn-default'
3 + %h1
4 + = announcement.title
5 + - if @current_user and @current_user.admin?
6 + = link_to 'Edit', edit_announcement_path(announcement), class: 'btn btn-sm btn-outline-secondary'
6 7 .card-subtitle
7 8 = "(updated #{time_ago_in_words(announcement.updated_at)} ago on #{announcement.updated_at})"
8 9 .card-text
9 10 = markdown(announcement.body)
10 11
11 12
@@ -10,13 +10,13
10 10 %br
11 11 = link_to_description_if_any "[#{t 'main.problem_desc'}] <span class='glyphicon glyphicon-file'></span>".html_safe, problem
12 12 %td
13 13 = @prob_submissions[problem.id][:count]
14 14 -#= link_to "[subs]", main_submission_path(problem.id)
15 15 %td
16 - = render :partial => 'submission_short',
17 - :locals => {:submission => @prob_submissions[problem.id][:submission], :problem_name => problem.name, :problem_id => problem.id }
16 + = render partial: 'submission_short',
17 + locals: {:submission => @prob_submissions[problem.id][:submission], :problem_name => problem.name, :problem_id => problem.id, show_button: true }
18 18 %td
19 19 - if @prob_submissions[problem.id][:submission]
20 20 = link_to 'Edit', edit_submission_path(@prob_submissions[problem.id][:submission]), class: 'btn btn-success'
21 21 - else
22 22 = link_to 'New', direct_edit_problem_submissions_path(problem.id), class: 'btn btn-success'
@@ -44,19 +44,19
44 44 %th
45 45 = render :partial => 'problem', :collection => cp[:problems]
46 46 .col-md-5
47 47 .card
48 48 .card-header
49 49 Announcement
50 - = link_to 'Manage', announcements_path, class: 'btn btn-small'
51 - .card-body
50 + = link_to 'Manage', announcements_path, class: 'btn btn-secondary btn-sm'
51 + %ul.list-group.list-group-flush
52 52 = render :partial => 'announcement', :collection => @announcements
53 -
54 - %script{:type => 'text/javascript'}
55 - = "Announcement.refreshUrl = '#{url_for :controller => 'main', :action => 'announcements'}';"
56 - Announcement.registerRefreshEventTimer();
53 + -#
54 + %script{:type => 'text/javascript'}
55 + = "Announcement.refreshUrl = '#{url_for :controller => 'main', :action => 'announcements'}';".html_safe
56 + Announcement.registerRefreshEventTimer();
57 57
58 58 .modal.fade#compiler{tabindex: -1,role: 'dialog'}
59 59 .modal-dialog.modal-lg{role:'document'}
60 60 .modal-content
61 61 .modal-header
62 62 %button.close{type: 'button', data: {dismissed: :modal}, aria: {label: 'close'}}
@@ -1,4 +1,4
1 1 :plain
2 2 $("#compiler_msg").html("#{j @submission.compiler_message}");
3 - $("#compiler").modal();
3 + $("#compiler").modal('show');
4 4
@@ -9,47 +9,50
9 9 .alert.alert-info
10 10 Write your code in the following box, choose language, and click submit button when finished
11 11 .row
12 12 .col-md-8
13 13 %div#editor{style: 'height: 500px; border-radius: 7px; font-size: 14px;'}
14 14 .col-md-4
15 - - # submission form
16 - = form_tag({controller: :main, :action => 'submit'}, :multipart => true, class: 'form') do
17 -
18 - = hidden_field_tag 'editor_text', @source
19 - = hidden_field_tag 'submission[problem_id]', @problem.id
20 - .form-group
21 - = label_tag "Task:"
22 - = text_field_tag 'asdf', "#{@problem.long_name}", class: 'form-control', disabled: true
23 - .form-group
24 - = label_tag "Description:"
25 - = link_to_description_if_any "[download] <span class='glyphicon glyphicon-file'></span>".html_safe, @problem
15 + -# submission form
16 + .card.mb-3
17 + .card-header
18 + Submission
19 + .card-body
20 + = form_with url: submit_main_path, :multipart => true, class: 'form' do |form|
21 + = hidden_field_tag 'editor_text', @source
22 + = hidden_field_tag 'submission[problem_id]', @problem.id
23 + .row.mb-2
24 + .col-md-4
25 + = form.label "Task", class: 'col-form-label text-secondary'
26 + .col-md-8
27 + = form.label nil, "#{@problem.long_name}", class: 'col-form-label fw-bold'
28 + .row.mb-2
29 + .col-md-4
30 + = form.label "Description", class: 'col-form-label text-secondary'
31 + .col-md-8
32 + = link_to_description_if_any "[download] <span class='mi'>description</span>".html_safe, @problem
33 + .row.mb-2
34 + .col-md-4
35 + = form.label :language_id, 'Language', class: 'col-form-label text-secondary'
36 + .col-md-8
37 + = form.select :language_id, options_from_collection_for_select(Language.all, 'id', 'pretty_name', @lang_id || @current_user.default_language || Language.find_by_pretty_name("Python").id || Language.first.id), {}, class: 'form-select', style: "width: 100px", id: 'language_id'
38 + .row.mb-2
39 + .col-12
40 + = form.file_field :load_file, class: 'form-control', id: 'load_file'
41 + .row.mb-2
42 + .col-12
43 + = submit_tag 'Submit', class: 'btn ' + (@submission && @submission.number >= 100 ? 'golden-btn' : 'btn-success'), id: 'live_submit',
44 + data: {confirm: "Submitting this source code for task #{@problem.long_name}?"}
26 45
27 - .form-group
28 - = label_tag 'Language:'
29 - = select_tag 'language_id', options_from_collection_for_select(Language.all, 'id', 'pretty_name', @lang_id || @current_user.default_language || Language.find_by_pretty_name("Python").id || Language.first.id), class: 'form-control select', style: "width: 100px"
30 - .form-group
31 - .input-group
32 - %span.input-group-btn
33 - %span.btn.btn-default.btn-file
34 - Browse
35 - = file_field_tag 'load_file'
36 - = text_field_tag '' , nil, {readonly: true, class: 'form-control'}
37 - .form-group
38 - = submit_tag 'Submit', class: 'btn ' + (@submission && @submission.number >= 100 ? 'golden-btn' : 'btn-success'), id: 'live_submit',
39 - data: {confirm: "Submitting this source code for task #{@problem.long_name}?"}
40 - - # latest submission status
41 - .panel{class: (@submission && @submission.graded_at) ? "panel-info" : "panel-warning"}
42 - .panel-heading
46 + -# latest submission status
47 + .card
48 + .card-header.text-bg-info.border-info
43 49 Latest Submission Status
44 - = link_to "Refresh",get_latest_submission_status_submissions_path(@submission.user,@problem), class: "btn btn-default btn-sm", remote: true if @submission
45 - .panel-body
46 - %div#latest_status
47 - - if @submission
48 - = render :partial => 'submission_short',
49 - :locals => {submission: @submission, problem_name: @problem.name, problem_id: @problem.id }
50 + = link_to "Refresh",get_latest_submission_status_submissions_path(@submission.user,@problem), id: 'refresh', class: "btn btn-light btn-sm", remote: true if @submission
51 + .card-body
52 + #latest_status
50 53
51 54 .modal.fade#compiler{tabindex: -1,role: 'dialog'}
52 55 .modal-dialog.modal-lg{role:'document'}
53 56 .modal-content
54 57 .modal-header
55 58 %button.close{type: 'button', data: {dismissed: :modal}, aria: {label: 'close'}}
@@ -61,13 +64,13
61 64 = @submission.compiler_message
62 65 .modal-footer
63 66 %button.btn.btn-default{type: 'button', data: {dismiss: 'modal'}} Close
64 67
65 68 :javascript
66 69 $(document).ready(function() {
67 - e = ace.edit("editor")
70 + var e = ace.edit("editor")
68 71 e.setValue($("#text_sourcecode").val());
69 72 e.gotoLine(1);
70 73 $("#language_id").trigger('change');
71 74
72 75 $("#load_file").on('change',function(evt) {
73 76 var file = evt.target.files[0];
@@ -77,12 +80,41
77 80 e.setValue(theFile.target.result);
78 81 e.gotoLine(1);
79 82 };
80 83 reader.readAsText(file)
81 84 });
82 85
86 + $("#live_submit").on("click", function(event) {
87 + $("#editor_text").val(e.getValue());
88 + });
89 +
90 + $("#language_id").on("change", function(event) {
91 + text = $("#language_id option:selected").text();
92 + mode = 'ace/mode/c_cpp';
93 + switch (text) {
94 + case 'Pascal':
95 + mode = 'ace/mode/pascal';
96 + break;
97 + case 'C++':
98 + case 'C':
99 + mode = 'ace/mode/c_cpp';
100 + break;
101 + case 'Ruby':
102 + mode = 'ace/mode/ruby';
103 + break;
104 + case 'Python':
105 + mode = 'ace/mode/python';
106 + break;
107 + case 'Java':
108 + mode = 'ace/mode/java';
109 + }
110 + e.getSession().setMode(mode);
111 + });
112 +
83 113 //brython();
114 + $('#refresh').click()
115 +
84 116 });
85 117
86 118
87 119
88 120
@@ -1,2 +1,2
1 1 :plain
2 - $("#latest_status").html("#{j render({partial: 'submission_short', locals: {submission: @submission, problem_name: @problem.name, problem_id: @problem.id}})}")
2 + $("#latest_status").html("#{j render({partial: 'submission_short', locals: {submission: @submission, show_id: true, show_button: true } })}")
@@ -1,17 +1,19
1 - .panel.panel-info
2 - .panel-heading
1 + .card.border-info.mb-2
2 + .card-header.text-bg-info.border-info
3 3 Select Problems
4 - .panel-body
5 - .form-inline
6 - = select 'submission',
7 - 'problem_id',
8 - @problems.collect {|p| ["[#{p.name}] #{p.full_name}", problem_submissions_url(p.id)]},
9 - { selected: (@problem ? problem_submissions_url(@problem) : -1) },
10 - { class: 'select2 form-control'}
11 - %button.btn.btn-primary.btn-sm.go-button#problem_go{data: {source: '#submission_problem_id'}} Go
4 + .card-body
5 + .row
6 + .col-6
7 + = select 'submission',
8 + 'problem_id',
9 + @problems.collect {|p| ["[#{p.name}] #{p.full_name}", problem_submissions_url(p.id)]},
10 + { selected: (@problem ? problem_submissions_url(@problem) : -1) },
11 + { class: 'select2 form-control'}
12 + .col-6
13 + %a.btn.btn-primary.go-button#problem_go{data: {source: '#submission_problem_id'}} Go
12 14
13 15 - if @problem!=nil
14 16 %h2= "Task: #{@problem.full_name} (#{@problem.name})"
15 17
16 18 - if @submissions!=nil
17 19 - if @submissions.length>0
@@ -84,38 +84,38
84 84 %strong Memory (kb)
85 85 %td #{@submission.peak_memory}
86 86 %tr
87 87 %td.text-right
88 88 %strong Compiler result
89 89 %td
90 - %button.btn.btn-info.btn-xs{type: 'button', data: {toggle: 'modal', target: '#compiler'}}
90 + %button.btn.btn-info.btn-sm{type: 'button', data: {toggle: 'modal', target: '#compiler'}}
91 91 view
92 92 %tr
93 93 %td.text-right
94 94 %strong Grading Task Status
95 95 %td
96 96 = @task.status_str if @task
97 97 - if @current_user.admin?
98 - = link_to "rejudge", rejudge_submission_path, data: {remote: true}, class: 'btn btn-info btn-xs'
98 + = link_to "rejudge", rejudge_submission_path, data: {remote: true}, class: 'btn btn-info btn-sm'
99 99 - if @current_user.has_role?('ta')
100 100 %tr
101 101 %td.text-right
102 102 %strong IP
103 103 %td #{@submission.ip_address}
104 104 %tr
105 105 %td.text-right
106 106 %strong Model solution
107 107 %td
108 108 - if @submission.tag_model?
109 109 YES
110 110 - if @current_user.has_role?('ta')
111 - = link_to "remove model status", set_tag_submission_path(@submission, tag: :default), class: 'btn btn-warning btn-xs'
111 + = link_to "remove model status", set_tag_submission_path(@submission, tag: :default), class: 'btn btn-warning btn-sm'
112 112 - else
113 113 No
114 114 - if @current_user.has_role?('ta')
115 - = link_to "set as model solution", set_tag_submission_path(@submission, tag: :model), class: 'btn btn-success btn-xs'
115 + = link_to "set as model solution", set_tag_submission_path(@submission, tag: :model), class: 'btn btn-success btn-sm'
116 116
117 117
118 118 .modal.fade#compiler{tabindex: -1,role: 'dialog'}
119 119 .modal-dialog.modal-lg{role:'document'}
120 120 .modal-content
121 121 .modal-header
@@ -3,13 +3,14
3 3 #entry point
4 4 pin "application"
5 5 pin "prepend_jquery"
6 6 pin "my_sprocket"
7 7 pin_all_from "app/javascript/controllers", under: "controllers"
8 8
9 - pin "jquery", to: 'jquery.js', preload: true
9 + #we don't need jquery in importmap because we use sprocket version
10 + #pin "jquery", to: 'jquery.js', preload: true
10 11 pin "bootstrap", to: "bootstrap.bundle.min.js", preload: true
11 12 #no need popper, because bundled already in bootstrap
12 13 #pin "@popperjs/core", to: "https://ga.jspm.io/npm:@popperjs/core@2.11.6/lib/index.js"
13 14
14 15 # datatable
15 16 # I have to fix vfs_font.js for this to work
@@ -3,23 +3,23
3 3 # This file contains migration options to ease your Rails 5.0 upgrade.
4 4 #
5 5 # Once upgraded flip defaults one by one to migrate to the new default.
6 6 #
7 7 # Read the Guide for Upgrading Ruby on Rails for more info on each option.
8 8
9 - Rails.application.config.action_controller.raise_on_unfiltered_parameters = true
9 + #Rails.application.config.action_controller.raise_on_unfiltered_parameters = true
10 10
11 11 # Enable per-form CSRF tokens. Previous versions had false.
12 - Rails.application.config.action_controller.per_form_csrf_tokens = false
12 + #Rails.application.config.action_controller.per_form_csrf_tokens = false
13 13
14 14 # Enable origin-checking CSRF mitigation. Previous versions had false.
15 - Rails.application.config.action_controller.forgery_protection_origin_check = false
15 + #Rails.application.config.action_controller.forgery_protection_origin_check = false
16 16
17 17 # Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`.
18 18 # Previous versions had false.
19 - ActiveSupport.to_time_preserves_timezone = false
19 + #ActiveSupport.to_time_preserves_timezone = false
20 20
21 21 # Require `belongs_to` associations by default. Previous versions had false.
22 - Rails.application.config.active_record.belongs_to_required_by_default = false
22 + #Rails.application.config.active_record.belongs_to_required_by_default = false
23 23
24 24 # Do not halt callback chains when a callback returns false. Previous versions had true.
25 25 # ActiveSupport.halt_callback_chains_on_return_false = true
@@ -39,16 +39,17
39 39 forget_password: 'Forget password?'
40 40
41 41 main:
42 42 start_soon: "The contest at your site will start soon. Please wait."
43 43 specified_in_header: "Specified in header"
44 44
45 - problem_desc: "desc"
46 - submitted_at: "Submitted at"
47 - graded_at: "Graded at"
48 - score: "score: "
45 + problem_desc: desc
46 + submission_id: Sub ID
47 + submitted_at: Submitted
48 + graded_at: Graded
49 + score: score
49 50 cmp_msg: "compiler msg"
50 51 src_link: "src"
51 52 submissions_link: "submissions"
52 53
53 54 confirm_contest_start:
54 55 box_title: "Contest confirmation"
deleted file
deleted file
deleted file
deleted file
You need to be logged in to leave comments. Login now