-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Simple Data Grapher: Integration + Research Note + Tests #6113
Changes from 30 commits
4c063aa
5f93182
fb9baf0
0584a26
c156ba5
bae5211
6d94e09
45ed76c
340c516
1066318
cd1977c
a3c1ecb
cf2164d
db59324
48bdba5
8a61b1e
f5bc4b8
1de79be
8feb24d
ef4bfcc
a332358
ab48bd4
11335f0
e8d12d9
dabe948
01a17ca
a1075a3
30d9b34
f8804d2
98ac452
2483d55
86172c2
f239ae6
ed74259
c86bebc
a03347c
170702b
dc0ade8
707b476
a66aeca
b704356
b4c6dd1
1dd468b
3fb6946
58ffa5b
083351a
20df5ac
523762c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# Place all the behaviors and hooks related to the matching controller here. | ||
# All this logic will automatically be available in application.js. | ||
# You can use CoffeeScript in this file: http://coffeescript.org/ |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
function determineType2(graphType){ | ||
if (graphType==="Horizontal" || graphType==="Vertical"){ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe this would be better if it was a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That might address https://codeclimate.com/github/publiclab/plots2/pull/6113 asking about complexity here... |
||
return "bar"; | ||
} | ||
else if (graphType==="Pie" || graphType==="Doughnut" || graphType==="Radar" ){ | ||
return "pie"; | ||
} | ||
else if (graphType==="Basic" || graphType==="Stepped" || graphType==="Point"){ | ||
return "scatter"; | ||
} | ||
} | ||
function layoutMaker(graphType){ | ||
var layout={}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
if (graphType==="Horizontal" || graphType==="Vertical"){ | ||
layout["barmode"]="group"; | ||
} | ||
return layout; | ||
} | ||
function traceMaker(graphType){ | ||
var trace={}; | ||
trace["type"]=determineType2(graphType); | ||
if (graphType==="Horizontal"){ | ||
trace["orientation"]="h"; | ||
} | ||
else if (graphType==="Doughnut"){ | ||
trace["hole"]=0.5; | ||
} | ||
else if (graphType==="Basic"){ | ||
trace["mode"]="lines"; | ||
} | ||
else if(graphType==="Point"){ | ||
trace["mode"]="markers"; | ||
} | ||
else if(graphType==="Stepped"){ | ||
trace["mode"]="lines+markers"; | ||
trace["line"]={"shape": 'hv'}; | ||
} | ||
return trace; | ||
} | ||
function keyDeterminer(graphType){ | ||
var keys=["x","y"]; | ||
if (graphType==="Pie" || graphType==="Doughnut"){ | ||
keys[1]="values"; | ||
keys[0]="labels"; | ||
} | ||
else if (graphType==="Horizontal"){ | ||
keys[0]="y"; | ||
keys[1]="x"; | ||
} | ||
return keys; | ||
} | ||
function plotGraph2(dataHash,length,graphType,divId){ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. whitespace after |
||
var layout=layoutMaker(graphType); | ||
var data=[]; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
var keySet=keyDeterminer(graphType); | ||
for (var i=0;i<length;i++){ | ||
var new_trace=traceMaker(graphType); | ||
new_trace[keySet[0]]=dataHash['x_axis_labels']; | ||
new_trace[keySet[1]]=dataHash['y_axis_values'+i]; | ||
new_trace["name"]=dataHash['labels'][1][i]; | ||
data.push(new_trace); | ||
} | ||
console.log(data); | ||
Plotly.newPlot(divId,data,layout); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. whitespace after |
||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please remove this newline |
||
} | ||
function graphMaker(data,divId){ | ||
var obj = data["sdgobject"]; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. for this function, you can use |
||
var string = "hash = " + obj + ";"; | ||
var actualHash = eval(string); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hm, i'm not sure about There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Found an alternative! |
||
var dataHash = actualHash["hash"]; | ||
var length = actualHash["length"]; | ||
var graphType = actualHash["graphType"]; | ||
console.log(data,dataHash,length,graphType); | ||
plotGraph2(dataHash,length,graphType,divId); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. whitespace after |
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
// Place all the styles related to the csvfiles controller here. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same here on it being a stub file, shall we remove it? |
||
// They will automatically be included in application.css. | ||
// You can use Sass (SCSS) here: https://sass-lang.com/ |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
class CsvfilesController < ApplicationController | ||
before_action :require_user, only: %i(delete user_files) | ||
|
||
def new | ||
# to render the index page of simple-data-grapher | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. empty function, please remove if not needed in this PR. |
||
end | ||
|
||
def setter | ||
@csvfile = Csvfile.new( | ||
uid: params[:uid], | ||
filetitle: params[:filetitle], | ||
filedescription: params[:filedescription], | ||
filepath: params[:object], | ||
filename: "file" + Time.now.to_i.to_s, | ||
filestring: params[:filestring] | ||
) | ||
render json: @csvfile if @csvfile.save | ||
end | ||
|
||
def prev_files | ||
@allfile = Csvfile.where(uid: params[:uid]) | ||
render json: @allfile | ||
end | ||
|
||
def user_files | ||
@user_files = Csvfile.where(uid: params[:id]) | ||
end | ||
|
||
def add_graphobject | ||
@newfile = Csvfile.new( | ||
uid: params[:uid], | ||
filetitle: params[:filetitle], | ||
filedescription: params[:filedescription], | ||
filepath: params[:object], | ||
filename: "file" + Time.now.to_i.to_s, | ||
filestring: params[:filestring], | ||
graphobject: params[:graphobject] | ||
) | ||
@newfile.save | ||
render json: { uid: params[:uid], id: @newfile.id } | ||
end | ||
|
||
def delete | ||
return unless params[:id] && params[:uid].to_i == current_user.uid | ||
file = Csvfile.where(id: params[:id].to_i) | ||
if file.destroy(params[:id].to_i) | ||
flash[:notice] = "Deleted the file" | ||
else | ||
flash[:error] = "Could not delete the file" | ||
end | ||
redirect_to "simple-data-grapher/data/#{params[:uid]}" | ||
end | ||
|
||
def fetch_graphobject | ||
@graphobject = Csvfile.where(id: params[:id].to_i, uid: params[:uid].to_i) | ||
render json: { sdgobject: @graphobject[0].graphobject } | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
module CsvfilesHelper | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -53,6 +53,23 @@ def self.graph_grid(body, _page = 1) | |
end | ||
end | ||
|
||
def self.simple_data_grapher(body, _page = 1) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can extract the similar parts of this method and the previous method and reuse...I will try to refactor a little and let you know. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We can try that, but maybe it would be best to keep it separate, you know so that it's easier to change in the future? |
||
body.gsub(/(?<![\>`])(\<p\>)?\[Power\ Tag\:\ simple-data-grapher\:(\S+)\]/) do |_tagname| | ||
ids = Regexp.last_match(2) | ||
a = ActionController::Base.new | ||
randomSeed = rand(1000).to_s | ||
output = a.render_to_string(template: "grids/_simple-data-grapher", | ||
layout: false, | ||
locals: { | ||
ids: ids, | ||
randomSeed: randomSeed, | ||
idName: 'sdg-graph-' + randomSeed, | ||
type: "graph" | ||
}) | ||
output | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I guess this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The output is being returned here. Its a return statement like rest of the code in |
||
end | ||
end | ||
|
||
# rubular regex: http://rubular.com/r/hBEThNL4qd | ||
def self.notes_grid(body, _page = 1) | ||
body.gsub(/(?<![\>`])(\<p\>)?\[notes\:(\S+)\]/) do |_tagname| | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
class Csvfile < ApplicationRecord | ||
belongs_to :user, foreign_key: :uid | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> | ||
<script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.2/bootstrap3-typeahead.js"></script> | ||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/4.6.3/papaparse.min.js"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.js"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/plotly.js/1.33.1/plotly-basic.min.js"></script> | ||
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.2/css/all.min.css"> | ||
<link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet"> | ||
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.3/xlsx.full.min.js"></script> | ||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.2/css/all.min.css"> | ||
<%= javascript_include_tag('/lib/simple-data-grapher/dist/PublicLab.Grapher.js')%> | ||
<%= stylesheet_link_tag '/lib/simple-data-grapher/examples/upload_file.css'%> | ||
<div id="first"></div> | ||
<script> | ||
var headerContainer = document.getElementsByClassName("body-container")[0]; | ||
SimpleDataGrapherObject = new SimpleDataGrapher("first"); | ||
var value = '<%= current_user %>'; | ||
<% if current_user %> | ||
SimpleDataGrapherObject.view.createButtons("yes"); | ||
var saveButton = SimpleDataGrapherObject.view.elementId + "_save_CSV"; | ||
var prevFile = SimpleDataGrapherObject.view.elementId + "_prev_file"; | ||
var saveFlag = false; | ||
$("#" + saveButton).click(function(){ | ||
saveFlag = true; | ||
}); | ||
$("#" + SimpleDataGrapherObject.view.plotGraphId).click(function(){ | ||
if (saveFlag){ | ||
var arr = {}; | ||
arr["completeCsvMatrix"] = SimpleDataGrapherObject.view.csvParser.completeCsvMatrix; | ||
arr["csvHeaders"] = SimpleDataGrapherObject.view.csvParser.csvHeaders; | ||
arr["csvSampleData"] = SimpleDataGrapherObject.view.csvParser.csvSampleData; | ||
arr["csvValidForYAxis"] = SimpleDataGrapherObject.view.csvParser.csvValidForYAxis; | ||
arr["completeCsvMatrixTranspose"] = SimpleDataGrapherObject.view.csvParser.completeCsvMatrixTranspose; | ||
let csvStringMatrix = SimpleDataGrapherObject.view.csvParser.completeCsvMatrixTranspose; | ||
let csvStringForDownload = encodeURI("data:text/csv;charset=utf-8," + csvStringMatrix.map(e => e.join(",")).join("\n")); | ||
$.ajax({ | ||
url: '/simple-data-grapher/object', | ||
type: 'post', | ||
data: {object: JSON.stringify(arr), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please introduce a white space after |
||
uid: <%= current_user.id %>, | ||
filetitle: SimpleDataGrapherObject.view.fileTitle, | ||
filedescription: SimpleDataGrapherObject.view.fileDescription, | ||
filestring: csvStringForDownload}, | ||
success: function(data){ | ||
let divAlert = document.createElement('div'); | ||
divAlert.classList.add("alert"); | ||
divAlert.classList.add("alert-success"); | ||
divAlert.innerHTML = "File save successfully!"; | ||
headerContainer.appendChild(divAlert); | ||
}, | ||
error: function(XMLHttpRequest, textStatus, errorThrown){ | ||
console.log(errorThrown); | ||
let divAlert = document.createElement('div'); | ||
divAlert.classList.add("alert"); | ||
divAlert.classList.add("alert-danger"); | ||
divAlert.innerHTML = "There was some error in saving the file."; | ||
headerContainer.appendChild(divAlert); | ||
} | ||
}); | ||
} | ||
}); | ||
|
||
$("#" + prevFile).click(function(){ | ||
$.ajax({ | ||
url: '/simple-data-grapher/prev_file', | ||
type: 'get', | ||
data: {uid: <%= current_user.id %>}, | ||
success: function(data){ | ||
displayPreviousFiles(data); | ||
}, | ||
error: function(XMLHttpRequest, textStatus, errorThrown){ | ||
console.log(errorThrown); | ||
let divAlert = document.createElement('div'); | ||
divAlert.classList.add("alert"); | ||
divAlert.classList.add("alert-danger"); | ||
divAlert.innerHTML = "There was some error in retrieving the file."; | ||
headerContainer.appendChild(divAlert); | ||
} | ||
}); | ||
}); | ||
|
||
function displayPreviousFiles(data){ | ||
var table=document.createElement("table"); | ||
for (let i = 0;i<data.length;i++){ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. whitespace around |
||
let tr = document.createElement('tr'); | ||
let td = document.createElement('td'); | ||
let radio = document.createElement('input'); | ||
radio.type = 'radio'; | ||
radio.value = i; | ||
radio.name = data[0]["csvfile"]["uid"] + "user_id"; | ||
td.appendChild(radio); | ||
td.appendChild(document.createTextNode(data[i]["csvfile"]["filetitle"])); | ||
tr.appendChild(td); | ||
table.appendChild(tr); | ||
} | ||
let div = document.getElementById(SimpleDataGrapherObject.view.upload_button_container); | ||
div.appendChild(table); | ||
selectFile(data); | ||
} | ||
function selectFile(data){ | ||
$("#" + SimpleDataGrapherObject.view.uploadButtonId).click(function(){ | ||
let name = data[0]["csvfile"]["uid"] + "user_id"; | ||
let index = $('input[name='+ name +']:checked').val(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. whitespace around There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Which one? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the one after name= and the one before the closing square bracket There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Okay! |
||
let allfiles = JSON.parse(data[index]["csvfile"]["filepath"]); | ||
SimpleDataGrapherObject.view.usingPreviouslyUploadedFile(); | ||
SimpleDataGrapherObject.view.csvParser.completeCsvMatrix = allfiles["completeCsvMatrix"]; | ||
SimpleDataGrapherObject.view.csvParser.csvHeaders = allfiles["csvHeaders"]; | ||
SimpleDataGrapherObject.view.csvParser.csvSampleData = allfiles["csvSampleData"]; | ||
SimpleDataGrapherObject.view.csvParser.csvValidForYAxis = allfiles["csvValidForYAxis"]; | ||
SimpleDataGrapherObject.view.csvParser.completeCsvMatrixTranspose = allfiles["completeCsvMatrixTranspose"]; | ||
SimpleDataGrapherObject.view.continueViewManipulation("prevfile"); | ||
}); | ||
} | ||
$("#" + SimpleDataGrapherObject.view.elementId + "_publish").click(function(){ | ||
console.log(SimpleDataGrapherObject.view.plotlyjsPlotter.dataHash); | ||
console.log(SimpleDataGrapherObject.view.plotlyjsPlotter.graphType); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. are these required? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I will remove the log statements in a follow up PR There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the console statements aren't required then they should be removed in this PR itself. A PR should be complete for its purpose along with the most optimality reached till merge point by mentor and peer reviewing. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, lemme take a look at them and remove the ones that aren't required! |
||
var arr = {}; | ||
arr["completeCsvMatrix"] = SimpleDataGrapherObject.view.csvParser.completeCsvMatrix; | ||
arr["csvHeaders"] = SimpleDataGrapherObject.view.csvParser.csvHeaders; | ||
arr["csvSampleData"] = SimpleDataGrapherObject.view.csvParser.csvSampleData; | ||
arr["csvValidForYAxis"] = SimpleDataGrapherObject.view.csvParser.csvValidForYAxis; | ||
arr["completeCsvMatrixTranspose"] = SimpleDataGrapherObject.view.csvParser.completeCsvMatrixTranspose; | ||
let csvStringMatrix = SimpleDataGrapherObject.view.csvParser.completeCsvMatrixTranspose; | ||
let csvStringForDownload = encodeURI("data:text/csv;charset=utf-8," + csvStringMatrix.map(e => e.join(",")).join("\n")); | ||
var dataObject = {}; | ||
dataObject["hash"] = SimpleDataGrapherObject.view.plotlyjsPlotter.dataHash; | ||
dataObject["graphType"] = SimpleDataGrapherObject.view.plotlyjsPlotter.graphType; | ||
dataObject["length"] = SimpleDataGrapherObject.view.plotlyjsPlotter.length; | ||
$.ajax({ | ||
url: '/simple-data-grapher/note/graphobject', | ||
type: 'post', | ||
data: {object: JSON.stringify(arr), | ||
uid: <%= current_user.id %>, | ||
filetitle: SimpleDataGrapherObject.view.fileTitle, | ||
filedescription: SimpleDataGrapherObject.view.fileDescription, | ||
filestring: csvStringForDownload, | ||
graphobject: JSON.stringify(dataObject)}, | ||
success: function(data){ | ||
console.log("saved",data); | ||
window.location = '/post?uid='+data["uid"]+'&id='+data["id"]; | ||
}, | ||
error: function(XMLHttpRequest, textStatus, errorThrown){ | ||
console.log("error"); | ||
} | ||
}); | ||
}); | ||
|
||
<% end %> | ||
setTimeout("$('.alert-success .alert-danger').fadeOut('slow')", 7000) | ||
</script> | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's remove this file if it's only a stub!