Skip to content

Commit 58ce6c2

Browse files
committed
update uploader
1 parent e801301 commit 58ce6c2

4 files changed

Lines changed: 246 additions & 69 deletions

File tree

Lines changed: 151 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,178 @@
1-
var allfiles = []
2-
var oldfiles = []
3-
var oldfileList
4-
var oldfiles= []
5-
oldfileList = document.getElementById("exercise_oldfileList").value.split(' ')
6-
for( var i = 0; i < oldfileList.length; i++){
7-
if(oldfileList[i].replace(/\s/g, '').length){
8-
oldfiles.push(oldfileList[i])
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+
}
929
}
30+
return data
1031
}
11-
createTextAndButton(oldfiles)
32+
1233

1334
function removeEle(arr,ele){
1435
if(!Array.isArray(arr)){
1536
arr = arr.split(",")
1637
}
1738
for( var i = 0; i < arr.length; i++){
1839
if ( arr[i] == ele.trim()) {
19-
arr.splice(i, 1);
40+
arr.splice(i, 1)
2041
}
2142
}
2243
return arr
2344
}
2445

25-
function addButtonListener(allfiles){
26-
document.querySelector('#fileName').addEventListener('click', function(event) {
27-
28-
var text= document.getElementById(event.target.id.match(/\d*/g)[0])
29-
allfiles = document.getElementById("exercise_fileList").value
30-
oldfiles = removeEle(oldfiles, text.innerHTML.toString().trim())
31-
allfiles += oldfiles
32-
allfiles = removeEle(allfiles, text.innerHTML.toString().trim())
33-
var button = document.getElementById(event.target.id)
34-
text.nextSibling.remove()
35-
text.remove()
36-
button.remove()
37-
document.getElementById("exercise_fileList").value = allfiles.toString()
38-
});
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
3993
}
4094

41-
// update file name and delete button
42-
function createTextAndButton(allfiles){
43-
$("#fileName").empty()
44-
for (var i = 0; i < allfiles.length; i++) {
45-
var button = document.createElement("button");
46-
button.setAttribute("id", i+"button");
47-
button.setAttribute("type", "button");
48-
button.setAttribute("style", "height:23px;width:108px;text-align: center");
49-
button.innerHTML = "Delete File";
50-
$("#fileName").append(button);
51-
$("#fileName").append("<span id="+i+" label="+allfiles[i]+">"+" "+allfiles[i]+"</span>");
52-
$("#fileName").append("<br>");
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>"
53153
}
54-
addButtonListener(allfiles)
154+
addButtonListener()
55155
}
56156

57-
// listener for upload button
157+
158+
// upload button
58159
$("#exercise_files").bind("change", function (e)
59160
{
60-
allfiles = []
61-
62-
for (var i of oldfiles) {
63-
allfiles.push(i);
64-
}
161+
totalList = oldfilesName.slice()
162+
var SizeList=[]
65163
var file = document.getElementById("exercise_files")
66164
for (var i = 0; i < file.files.length; i++) {
67165
filename = file.files[i].name
68-
if(allfiles.indexOf(filename) === -1) {
69-
allfiles.push(filename.trim());
166+
if(totalList.indexOf(filename) === -1) {
167+
totalList.push(filename.trim())
168+
SizeList.push(file.files[i].size)
70169
}
71170
}
72-
document.getElementById("exercise_fileList").value = allfiles.toString()
73-
createTextAndButton(allfiles)
171+
document.getElementById("exercise_fileList").value = totalList.toString()
172+
applyHideAndShow()
173+
createTextAndButton(totalList,SizeList)
74174
});
175+
176+
177+
applyHideAndShow()
178+
createTextAndButton(oldfilesName,"old")
Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
1-
.inputWrapper {
2-
height: 32px;
3-
width: 114px;
4-
overflow: hidden;
5-
position: relative;
6-
cursor: pointer;
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+
727
}

app/controllers/exercises_controller.rb

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ class ExercisesController < ApplicationController
33
require 'oauth/request_proxy/rack_request'
44
require 'zip'
55
require 'tempfile'
6-
6+
7+
78
load_and_authorize_resource
89
skip_authorize_resource only: [:practice, :call_open_pop]
910

@@ -138,8 +139,12 @@ def new
138139
def edit
139140
@exercise_version = @exercise.current_version
140141
@ownerships_all = []
142+
@ownerships_res_name = []
141143
@exercise_version.ownerships.each do |e|
142144
@ownerships_all.push(e.filename)
145+
uniqueFile = ResourceFile.all.where(id: e.resource_file_id)[0]
146+
uniqueFilename = uniqueFile.token+uniqueFile.filename.file.file.match(/\.\w*/)[0]
147+
@ownerships_res_name.push(uniqueFilename)
143148
end
144149

145150
@text_representation = @exercise_version.text_representation ||
@@ -397,13 +402,11 @@ def upload_create
397402
end
398403
end
399404
end
400-
# p "&&&&&&&&&&&&&"
401-
# p ex_ver.ownerships
402-
# add new ownertable
403405
unless files.nil?
404406
files.each do |file|
407+
file.original_filename = file.original_filename.gsub(/ /, '_')
405408
tempfile = Tempfile.create{file}
406-
hashval = ImageHash.new("#{tempfile.path}").hash
409+
hashval = Digest::MD5.hexdigest File.read "#{tempfile.path}"
407410
if ResourceFile.all.where(hashval: hashval).exists?
408411
ownertable = ex_ver.ownerships.create(filename: file.original_filename,resource_file_id: ResourceFile.all.where(hashval: hashval).first.id)
409412
else
@@ -414,8 +417,6 @@ def upload_create
414417
end
415418
end
416419
end
417-
p "current added akll ownership"
418-
p ex_ver.ownerships
419420
exercise_collection.andand.add(e, override: true)
420421
e.current_version.update(text_representation: text_representation)
421422
success_msgs <<
@@ -617,19 +618,44 @@ def practice
617618
# hide it if this workout (if present) has less than two exercises
618619
@workout ||= @workout_score.andand.workout || @workout_offering.andand.workout
619620
ex_count = @workout.andand.exercises.andand.count
620-
@hide_sidebar = (!@workout && @lti_launch) || (ex_count && ex_count < 2)
621+
@hide_sidebar = (!@workout && @lti_launch) || (ex_count && ex_count < 2)
621622
allOwnerships = ExerciseVersion.where(id: @exercise.current_version_id)[0].ownerships
622623
allresfiles = @exercise_version.prompts[0].question.scan(/\!\[\]\((.*?)\)/)
623624
allresfiles.each do |filename|
624-
uniqueFile = ResourceFile.where(id: allOwnerships.find_by(filename: filename[0]).resource_file_id)[0].filename
625-
uniqueFilename = uniqueFile.model.token+uniqueFile.file.file.match(/\.\w*/)[0]
626-
@exercise_version.prompts[0].question = @exercise_version.prompts[0].question.gsub("![](#{filename[0]})", "![](/uploads/resource_file/#{uniqueFilename})")
625+
if allOwnerships.find_by(filename: filename[0]).nil?
626+
@exercise_version.prompts[0].question = @exercise_version.prompts[0].question.gsub("![](#{filename[0]})", "![](**IMAGE DOES NOT EXIST**)")
627+
else
628+
uniqueFile = ResourceFile.where(id: allOwnerships.find_by(filename: filename[0]).resource_file_id)[0].filename
629+
uniqueFilename = uniqueFile.model.token+uniqueFile.file.file.match(/\.\w*/)[0]
630+
@exercise_version.prompts[0].question = @exercise_version.prompts[0].question.gsub("![](#{filename[0]})", "![](/uploads/resource_file/#{uniqueFilename})")
631+
end
632+
627633
end
628634
render layout: 'two_columns'
629635

630636
end
631637

638+
632639

640+
641+
def download_file
642+
client = Client.find(params[:id])
643+
send_data generate_file(client),
644+
filename: "#{client.name}.pdf",
645+
type: "application/pdf"
646+
end
647+
648+
private
649+
650+
def generate_file(client)
651+
Prawn::Document.new do
652+
text client.name, align: :center
653+
text "Address: #{client.address}"
654+
text "Email: #{client.email}"
655+
end.render
656+
end
657+
658+
633659
# -------------------------------------------------------------
634660
def create_choice
635661
@ans = Choice.create

0 commit comments

Comments
 (0)