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