-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsubmit.js
More file actions
116 lines (103 loc) · 4.36 KB
/
submit.js
File metadata and controls
116 lines (103 loc) · 4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const state = {};
const setMessage = (id, newClass, msg) => {
const errorTag = document.getElementById(id);
errorTag.className = newClass;
errorTag.textContent = msg;
};
const setError = (msg) => setMessage('error', 'upload__error', msg);
const removeError = () => setMessage('error', 'upload__error--invisible', '');
const setSuccess = (msg) => setMessage('success', 'upload__success', 'Data uploaded successfully!');
const removeSuccess = () => setMessage('success', 'upload__success', '');
const setValues = ({ slope, intercept }) => {
document.getElementById('coefficient').textContent = slope;
document.getElementById('constant').textContent = intercept;
document.getElementById('values').className = 'results__regression-values';
};
const handleFileUpload = (e) => {
removeError();
const file = e.target.files[0];
const reader = new FileReader();
reader.readAsText(file, 'UTF-8');
reader.onload = (evt) => {
Papa.parse(evt.target.result, {
dynamicTyping: true,
skipEmptyLines: true,
complete: (r) => {
const csv = r.data.slice(0,2); // we can only handle two rows
// scan csv data for problems
const lengthDifference = csv[0].length !== csv[1].length;
if (lengthDifference) {
setError('Error: Your data series are not the same length. Plese check your data and try again.');
document.getElementById('submit-btn').disabled = true;
return;
}
const verifyBody = (data) => {
const allNumbers = data.map((el) => {
el = Number(el);
if (isNaN(el)) {
const numberError = 'All non-title data points must be numbers';
setError(numberError);
document.getElementById('submit-btn').disabled = true;
document.getElementById('file-upload').value = '';
throw new Error(numberError);
}
return el;
});
return allNumbers;
};
// package data for API
const requestBody = csv.reduce((acc, val, i) => {
const bodyData = verifyBody(val.slice(1));
const key = i === 0 ? 'dep' : 'ind';
acc[key] = bodyData;
return acc;
}, {});
// package data for chart
const yData = csv[1].slice(1);
const chartData = csv[0].slice(1).map((x, i) => {
const y = yData[i];
return { x, y };
});
const seriesNames = { x: csv[0][0], y: csv[1][0] };
state.requestBody = requestBody;
state.chartData = chartData;
state.seriesNames = seriesNames;
document.getElementById('submit-btn').disabled = false;
setSuccess();
}
});
};
reader.onerror = (evt) => {
setError('Error reading CSV File');
};
};
const handleDataSubmission = (e) => {
removeSuccess();
removeError();
if (!state.requestBody) {
setError('Please upload a file');
} else {
fetch('https://nxalqwxrnh.execute-api.us-west-1.amazonaws.com/Prod/regress', {
method: 'POST',
body: JSON.stringify(state.requestBody),
headers: {
'Content-Type': 'application/json',
},
}).then((r) => {
if (r.ok) {
r.json().then((regressionLine) => {
setValues(regressionLine);
scatterPlot(state.chartData, regressionLine, state.seriesNames);
});
} else if (r.status === 400) {
setError('It appears that you have uploaded some invalid data. Please double-check your data and try again');
} else {
setError('An API error occured. Please try again later.');
}
});
}
};
window.addEventListener('DOMContentLoaded', () => {
document.getElementById('file-upload').onchange = handleFileUpload;
document.getElementById('submit-btn').onclick = handleDataSubmission;
});