Skip to content

Commit 4bf92fb

Browse files
Create main.js
1 parent 71e0a16 commit 4bf92fb

1 file changed

Lines changed: 211 additions & 0 deletions

File tree

‎JavascriptChart/main.js‎

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
console.log("hi..");
2+
3+
// // ----- DRAW PIE CHART -----
4+
5+
// // This is how you structure JSON data
6+
// // var data = '{"expenditures":[{"type":"Healthcare", "percent":"8"},{"type":"Insurance", "percent":"12"},{"type":"Food", "percent":"13"},{"type":"Housing", "percent":"33"},{"type":"Transportation", "percent":"16"},{"type":"Apparel", "percent":"3"},{"type":"Entertainment", "percent":"5"},{"type":"Healthcare", "percent":"8"},{"type":"Other", "percent":"2"}]}';
7+
8+
// // This data is structured as an array of expenditure objects
9+
// // like this
10+
// // class Expenditures {
11+
// // constructor(type, percent) {
12+
// // this.type = type,
13+
// // this.percent = percent;
14+
// // }
15+
// // }
16+
17+
18+
let IdNumber = 1;
19+
let valueNumber = 1;
20+
let keyNumber = 1;
21+
22+
function AddRow(){
23+
24+
for (let i = 0; i === 0 ; i++) {
25+
IdNumber = IdNumber += 1;
26+
keyNumber = keyNumber += 1;
27+
valueNumber = valueNumber += 1;
28+
break;
29+
}
30+
31+
// Create a new div element to hold the inputs
32+
const newDiv = document.createElement('div');
33+
newDiv.className = "InputClass";
34+
newDiv.id = 'INputCollecter' + IdNumber;
35+
36+
// Create the input elements
37+
const keyInput = document.createElement('input');
38+
keyInput.type = 'text';
39+
keyInput.id = 'Key'+ keyNumber;
40+
keyInput.placeholder = "Expenditure";
41+
keyInput.className = 'InputForJson';
42+
43+
const valueInput = document.createElement('input');
44+
valueInput.type = 'number';
45+
valueInput.id = 'value' + valueNumber;
46+
valueInput.placeholder = "Percentage";
47+
valueInput.className = 'InputForJson';
48+
49+
// Append the inputs to the new div
50+
newDiv.appendChild(keyInput);
51+
newDiv.appendChild(valueInput);
52+
53+
// Append the new div to the parent element
54+
const parentElement = document.getElementById('INputCollecter1');
55+
parentElement.appendChild(newDiv);
56+
57+
// Create and append a new line break after the new div
58+
// const newLine = document.createElement('br');
59+
// parentElement.appendChild(newLine);
60+
}
61+
62+
63+
function RemoveRow(){
64+
const parentElement = document.getElementById('INputCollecter1');
65+
const lastChild = parentElement.lastChild;
66+
parentElement.removeChild(lastChild);
67+
}
68+
69+
let json;
70+
71+
function CreateJson(){
72+
let keyArray = [];
73+
let valueArray = [];
74+
let key;
75+
let value;
76+
json = '{ "expenditures": [';
77+
78+
// Get all the input elements
79+
const inputElements = document.getElementsByClassName('InputForJson');
80+
81+
// Get the values from the input elements and store them in arrays
82+
for (let i = 0; i < inputElements.length; i++) {
83+
if (i % 2 === 0) {
84+
key = inputElements[i].value;
85+
keyArray.push(key);
86+
} else {
87+
value = inputElements[i].value;
88+
valueArray.push(value);
89+
}
90+
}
91+
92+
// Add the key value pairs to the json string
93+
for (let i = 0; i < keyArray.length; i++) {
94+
json += '{ "type": "' + keyArray[i] + '", "percent": "' + valueArray[i] + '" }';
95+
if (i < keyArray.length - 1) {
96+
json += ',';
97+
}
98+
}
99+
100+
// Close the json string
101+
json += ']}';
102+
103+
drawChart();
104+
console.log(json);
105+
}
106+
107+
let data;
108+
let expenditureArray = [];
109+
let percentArray = [];
110+
let colorArray = [];
111+
112+
function drawChart(){
113+
data = json;
114+
percentArray = createPercentArray();
115+
percentNameArray = createPercentNameArray();
116+
colorArray = createRandomColorArray();
117+
populateArray(data);
118+
drawPie();
119+
}
120+
121+
function populateArray(jsonData){
122+
let expenseArray = JSON.parse(jsonData);
123+
for(i = 0; i < expenseArray.expenditures.length; i++){
124+
let expense = expenseArray.expenditures[i];
125+
expenditureArray[i] = expense;
126+
}
127+
}
128+
129+
function createPercentArray(){
130+
let perArr = [];
131+
let perArrs = expenditureArray.map((expenditure) => expenditure.percent);
132+
for(i = 0; i < expenditureArray.length; i++){
133+
perArr[i] = expenditureArray[i].percent * .02;
134+
}
135+
136+
let sum = 0;
137+
for (let i = 0; i < perArrs.length; i++) {
138+
let Convert = perArrs[i];
139+
Convert = Number(Convert);
140+
sum += Convert;
141+
}
142+
143+
if (sum > 100) {
144+
alert('The sum of the percentages is greater than 100');
145+
return NaN;
146+
}
147+
else{
148+
return perArr;
149+
}
150+
151+
}
152+
153+
function createPercentNameArray(){
154+
let perArr = [];
155+
for(i = 0; i < expenditureArray.length; i++){
156+
perArr[i] = expenditureArray[i].type /*+ ' ' + expenditureArray[i].percent + '%'*/;
157+
}
158+
return perArr;
159+
}
160+
161+
function createRandomColorArray(){
162+
let randColorArr = [];
163+
for(i = 0; i < expenditureArray.length; i++){
164+
randColorArr[i] = '#' + Math.floor(Math.random() * 16777215).toString(16);
165+
}
166+
return randColorArr;
167+
}
168+
169+
function drawPie(){
170+
var canvas = document.getElementById('canvas');
171+
var context = canvas.getContext('2d');
172+
let startAngle = Math.PI/2;
173+
let endAngle = Math.PI/2;
174+
175+
for(i = 0; i < percentArray.length; i++){
176+
startAngle = endAngle;
177+
endAngle = endAngle + (percentArray[i] * Math.PI);
178+
drawSlice(context, 300, 200, 150, startAngle, endAngle, colorArray[i]);
179+
drawSliceText(context, 300, 200, 150, startAngle, endAngle, percentNameArray[i]);
180+
181+
}
182+
183+
// for(i = 0; i < percentNameArray.length; i++){
184+
// startAngle = endAngle;
185+
// endAngle = endAngle + (percentArray[i] * Math.PI);
186+
// drawSliceText(context, 300, 200, 150, startAngle, endAngle, percentNameArray[i]);
187+
// }
188+
}
189+
190+
function drawSlice(ctx, sliceCenterX, sliceCenterY, radius, startAngle, endAngle, color){
191+
ctx.fillStyle = color;
192+
ctx.beginPath();
193+
let medianAngle = (startAngle + endAngle) / 2;
194+
xOffset = Math.cos(medianAngle) * 10;
195+
yOffset = Math.sin(medianAngle) * 10;
196+
ctx.moveTo(sliceCenterX + xOffset, sliceCenterY + yOffset);
197+
ctx.arc(sliceCenterX + xOffset, sliceCenterY + yOffset, radius, startAngle, endAngle);
198+
ctx.closePath();
199+
ctx.fill();
200+
}
201+
202+
function drawSliceText(ctx, sliceCenterX, sliceCenterY, radius, startAngle, endAngle, percentText){
203+
let textX = sliceCenterX + Math.cos((startAngle + endAngle)/2) * radius;
204+
let textY = sliceCenterY + Math.sin((startAngle + endAngle)/2) * radius;
205+
ctx.fillStyle = 'black';
206+
ctx.font = '15px Calibri';
207+
ctx.fillText(percentText, textX, textY);
208+
}
209+
210+
211+
console.log(percentArray);

0 commit comments

Comments
 (0)