Skip to content

Commit c28a6b5

Browse files
committed
Merge branch 'staging' of github.com:web-cat/code-workout into staging
2 parents a6ccf5c + 5a3ba87 commit c28a6b5

20 files changed

+559
-12
lines changed

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,5 @@ gem 'rest-client'
128128
gem 'user_agent_parser' # 2.6 requires ruby 2.4
129129
gem 'rails_same_site_cookie'
130130
gem 'sprockets', '< 4.0.0'
131+
gem 'image_hash'
132+
gem 'carrierwave', '1.3.1'

Gemfile.lock

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ GEM
128128
rack-test (>= 0.6.3)
129129
regexp_parser (~> 1.2)
130130
xpath (~> 3.2)
131+
carrierwave (1.3.1)
132+
activemodel (>= 4.0.0)
133+
activesupport (>= 4.0.0)
134+
mime-types (>= 1.16)
131135
celluloid (0.17.4)
132136
celluloid-essentials
133137
celluloid-extras
@@ -228,6 +232,8 @@ GEM
228232
domain_name (~> 0.5)
229233
i18n (0.9.5)
230234
concurrent-ruby (~> 1.0)
235+
image_hash (1.0.0)
236+
mini_magick
231237
immigrant (0.3.6)
232238
activerecord (>= 3.0)
233239
ims-lti (1.1.13)
@@ -270,6 +276,7 @@ GEM
270276
mime-types (3.2.2)
271277
mime-types-data (~> 3.2015)
272278
mime-types-data (3.2019.0331)
279+
mini_magick (4.11.0)
273280
mini_mime (1.0.2)
274281
mini_portile2 (2.4.0)
275282
minitest (5.14.1)
@@ -500,6 +507,7 @@ DEPENDENCIES
500507
capistrano-rvm
501508
capistrano3-puma!
502509
capybara
510+
carrierwave (= 1.3.1)
503511
cocoon
504512
codemirror-rails
505513
coffee-rails (~> 4.0.0)
@@ -517,6 +525,7 @@ DEPENDENCIES
517525
gravtastic
518526
haml (>= 3.1.4)
519527
haml-rails
528+
image_hash
520529
immigrant
521530
ims-lti (~> 1.1.8)
522531
jquery-rails

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Students may practice coding exercises or multiple-choice-questions on a variety
77
CodeWorkout was inspired by many great systems built by others, but aims to bring together the best from earlier forerunners while adding important new features.
88
It provides comprehensive support for teachers who want to use coding exercises in their courses, while also maintaining flexibility for self-paced learners who aren't part of an organized course.
99

10-
Try it out at [https://code-workout.cs.vt.edu].
10+
Try it out at https://codeworkout.cs.vt.edu.
1111
You can play around without signing up if you like.
1212

1313
## Contents

app/assets/javascripts/application.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,4 @@ $.fn.editable.defaults.mode = 'inline';
8787
$(document).ready(function() {
8888
$('.xeditable').editable();
8989
});
90+
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
var oldfileList = document.getElementById("exercise_oldfileList").value.split(' ')
2+
var oldfilesName = transferData("exercise_oldfileList")
3+
var oldfilesNameBackup = oldfilesName.slice()
4+
var oldfilesHashName = transferData("exercise_ownerships_res_name")
5+
var totalList = oldfilesName.slice()
6+
var table = document.getElementById("tablelist")
7+
var path = "/uploads/resource_file/"
8+
document.getElementById("exercise_fileList").value = totalList.toString()
9+
10+
function applyHideAndShow(){
11+
if(totalList.length==0){
12+
$(filelist).addClass("hidden");
13+
}
14+
else{
15+
$(function () {
16+
$('#filelist').removeClass('hidden')
17+
})
18+
}
19+
}
20+
21+
22+
function transferData(tag){
23+
var data = []
24+
oldfileList = document.getElementById(tag).value.split(' ')
25+
for( var i = 0; i < oldfileList.length; i++){
26+
if(oldfileList[i].replace(/\s/g, '').length){
27+
data.push(oldfileList[i])
28+
}
29+
}
30+
return data
31+
}
32+
33+
34+
function removeEle(arr,ele){
35+
if(!Array.isArray(arr)){
36+
arr = arr.split(",")
37+
}
38+
for( var i = 0; i < arr.length; i++){
39+
if ( arr[i] == ele.trim()) {
40+
arr.splice(i, 1)
41+
}
42+
}
43+
return arr
44+
}
45+
46+
47+
function deleteTableRow(row){
48+
var count = $('#tablelist tr').length;
49+
if(row == -1){
50+
for(var i = 1; i < count; i++){
51+
table.deleteRow(1)
52+
}
53+
}
54+
else{
55+
var entireRow= document.getElementById(row+"row")
56+
entireRow.remove()
57+
}
58+
}
59+
60+
61+
62+
function isImage(filename){
63+
var filename = /[^.]+$/.exec(filename)
64+
if (String(filename).match(/(jpg|jpeg|png|gif)/g))
65+
return true
66+
return false
67+
}
68+
69+
70+
function addButtonListener(){
71+
document.getElementById("tablelist").addEventListener('click',function(e){
72+
if(e.target && e.target.id != null && e.target.id!= "" && e.target.id.length<=2 ){
73+
var id = parseInt(e.target.id.charAt(0))
74+
var filename = document.getElementById(id+"name").innerHTML.trim()
75+
totalList = removeEle(totalList, filename)
76+
if(oldfilesName.includes(filename)){
77+
oldfilesName = removeEle(oldfilesName, filename)
78+
}
79+
deleteTableRow(id)
80+
document.getElementById("exercise_fileList").value = totalList.toString()
81+
applyHideAndShow()
82+
}
83+
});
84+
}
85+
86+
87+
function checkRes(fileName){
88+
var a = oldfilesNameBackup.indexOf(fileName)
89+
if(a != -1){
90+
return oldfilesHashName[a]
91+
}
92+
return null
93+
}
94+
95+
96+
function createTextAndButton(fileName,SizeList){
97+
deleteTableRow(-1)
98+
for (var i = 0; i < fileName.length; i++) {
99+
var exist = checkRes(fileName[i])
100+
var row = table.insertRow();
101+
row.setAttribute("id",(i+1)+"row")
102+
var imageOrNot = isImage(fileName[i])
103+
// Type info
104+
var cell0 = row.insertCell(0)
105+
if(imageOrNot){
106+
cell0.innerHTML = "Image"
107+
}
108+
else{
109+
cell0.innerHTML = "File"
110+
}
111+
// Thumbnail display
112+
var cell1 = row.insertCell(1)
113+
if(exist != null && imageOrNot){
114+
cell1.innerHTML = "<img class=\"img\" src=\""+path+exist+"\">"
115+
}
116+
else if (exist != null && !imageOrNot){
117+
cell1.innerHTML = "Not showable"
118+
}
119+
else{
120+
cell1.innerHTML = "Unknown"
121+
}
122+
//Name text
123+
var cell2 = row.insertCell(2)
124+
cell2.setAttribute("id",(i+1)+"name")
125+
cell2.innerHTML = fileName[i]
126+
//Pixel text
127+
var cell3 = row.insertCell(3)
128+
tempsrc = path+oldfilesHashName[i]
129+
if(exist != null && imageOrNot){
130+
var img = new Image()
131+
img.src = tempsrc
132+
cell3.innerHTML = img.width + 'x' + img.height+" pixels"
133+
}
134+
else if (exist != null && !imageOrNot){
135+
//wait
136+
}
137+
else if (exist == null && imageOrNot){
138+
cell3.innerHTML = "0x0 pixels"
139+
} else if (exist == null && !imageOrNot){
140+
var index = i - oldfilesName.length
141+
cell3.innerHTML = SizeList[index] + " bytes"
142+
}
143+
//Mark icon
144+
var cell4 = row.insertCell(4)
145+
if(exist != null){
146+
cell4.innerHTML = "<a href=\"#\"> <span class=\"glyphicon glyphicon-ok iconpadding fa-lg\"></span> </a>"
147+
}else{
148+
cell4.innerHTML = "<a > <span class=\"glyphicon glyphicon-remove iconpadding fa-lg\"></span> </a>"
149+
}
150+
//Delete Button
151+
var cell5 = row.insertCell(5)
152+
cell5.innerHTML = "<button class=\"btn btn-link glyphicon glyphicon-trash fa-lg\" id="+(i+1)+" type=\"button\"></button>"
153+
}
154+
addButtonListener()
155+
}
156+
157+
158+
// upload button
159+
$("#exercise_files").bind("change", function (e)
160+
{
161+
totalList = oldfilesName.slice()
162+
var SizeList=[]
163+
var file = document.getElementById("exercise_files")
164+
for (var i = 0; i < file.files.length; i++) {
165+
filename = file.files[i].name
166+
if(totalList.indexOf(filename) === -1) {
167+
totalList.push(filename.trim())
168+
SizeList.push(file.files[i].size)
169+
}
170+
}
171+
document.getElementById("exercise_fileList").value = totalList.toString()
172+
applyHideAndShow()
173+
createTextAndButton(totalList,SizeList)
174+
});
175+
176+
177+
applyHideAndShow()
178+
createTextAndButton(oldfilesName,"old")
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
img {
2+
3+
max-width: 58%;
4+
height: auto;
5+
}
6+
7+
.image-upload > input
8+
{
9+
display: none;
10+
}
11+
12+
.image-upload > label{
13+
cursor:pointer;
14+
padding-left: 1em;
15+
16+
}
17+
18+
.hidden
19+
{
20+
display: none;
21+
}
22+
23+
.iconpadding
24+
{
25+
padding-left: 1em;
26+
27+
}

0 commit comments

Comments
 (0)