Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c7381f1

Browse files
homework done
1 parent 45ef245 commit c7381f1

File tree

1 file changed

+262
-44
lines changed

1 file changed

+262
-44
lines changed

homework/week1/index.js

Lines changed: 262 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,298 @@
1-
'use strict';
1+
"use strict";
22

33
function main() {
4-
console.log('I am working!');
5-
const repoUrl = 'https://api.github.com/orgs/HackYourFuture/repos?per_page=100';
4+
const repoUrl =
5+
"https://api.github.com/orgs/HackYourFuture/repos?per_page=100";
66
apiCall(repoUrl, dataHandler);
77
}
88

9-
//1 - Making a request to the API endpoint:
9+
function createAndAppend(name, parent, options = {}) {
10+
const elem = document.createElement(name);
11+
parent.appendChild(elem);
12+
Object.keys(options).forEach(key => {
13+
const value = options[key];
14+
if (key === "text") {
15+
elem.innerText = value;
16+
} else {
17+
elem.setAttribute(key, value);
18+
}
19+
});
20+
return elem;
21+
}
1022

11-
function apiCall(url, callback) {
23+
// Making a request to the API endpoint:
1224

25+
function apiCall(url, callback) {
1326
let requestIt = new XMLHttpRequest();
14-
requestIt.onreadystatechange = function () {
15-
if (requestIt.readyState == 4 && requestIt.status == 200) {
27+
requestIt.open("GET", url);
28+
requestIt.onload = function() {
29+
if (requestIt.status < 400) {
1630
callback(requestIt.responseText);
31+
} else {
32+
// If request is not successful, create an error page:
33+
let root = document.getElementById("root");
34+
let errorDiv1 = createAndAppend("div", root, { id: "notfound" });
35+
let errorDiv2 = createAndAppend("div", errorDiv1, { id: "notfound1" });
36+
let errorDiv3 = createAndAppend("div", errorDiv2, { id: "notfound-404" });
37+
createAndAppend("div", errorDiv3);
38+
let errorStat = createAndAppend("h1", errorDiv3);
39+
errorStat.innerHTML = requestIt.status;
40+
let errorMsg = createAndAppend("h2", errorDiv2, { id: "errorMsg" });
41+
errorMsg.innerHTML = requestIt.statusText;
1742
}
1843
};
19-
20-
requestIt.open('GET', url);
2144
requestIt.send();
22-
manipulateDom();
2345
}
2446

25-
//2 - Design the page by using DOM manipulation :
47+
// Handling the data:
48+
49+
function dataHandler(data) {
50+
//Parsing the data and assign it to a variable:
51+
let dataParsed = JSON.parse(data);
52+
53+
//Design the page by using DOM manipulation :
2654

27-
function manipulateDom() {
2855
//Create heading part of the page:
29-
let root = document.getElementById('root');
30-
let heading = root.appendChild(document.createElement('header'));
31-
heading.className = "header";
32-
heading.appendChild(document.createTextNode('Hack Your Future | Github Repositories'));
33-
let comboBox = heading.appendChild(document.createElement('select'));
56+
let root = document.getElementById("root");
57+
let heading = createAndAppend("header", root, {
58+
class: "header"
59+
});
60+
let paragCont = createAndAppend("div", heading);
61+
paragCont.className = "paragCont";
62+
let headParag = createAndAppend("p", paragCont, {
63+
text: "HYF | Github Repositories"
64+
});
65+
headParag.id = "headParag";
66+
let comboCont = createAndAppend("div", heading);
67+
comboCont.className = "comboCont";
68+
let comboBox = createAndAppend("select", comboCont);
3469
comboBox.id = "comboMenu";
3570

36-
//Create body part:
37-
let mainContainer = root.appendChild(document.createElement('div'));
38-
mainContainer.className = "container";
71+
createAndAppend("hr", root, { class: "headHr" });
72+
73+
//Create body part:
74+
let mainContainer = createAndAppend("div", root);
75+
mainContainer.id = "container";
3976

4077
//Left side of the page:
41-
let leftSide = mainContainer.appendChild(document.createElement('div'));
78+
let leftSide = createAndAppend("div", mainContainer);
4279
leftSide.id = "leftSide";
43-
let leftHeader = leftSide.appendChild(document.createElement('h3'));
80+
let leftHeader = createAndAppend("h3", leftSide, { text: "Repo Details" });
4481
leftHeader.className = "leftHeader";
45-
leftHeader.appendChild(document.createTextNode('Repo Details'));
82+
createAndAppend("hr", leftSide);
83+
let leftTable = createAndAppend("table", leftSide);
84+
let tBody = createAndAppend("tbody", leftTable);
85+
tBody.id = "tableBud";
4686

4787
//Right side of the page:
48-
let rightSide = mainContainer.appendChild(document.createElement('div'));
49-
rightSide.className = "rightSide";
50-
let rightHeader = mainContainer.appendChild(document.createElement('h2'));
51-
rightHeader.className = "rightHeader";
52-
rightHeader.appendChild(document.createTextNode('Contributors'));
53-
}
54-
55-
56-
//3 - Handling the data:
57-
58-
function dataHandler(data) {
59-
//Parsing the data and assign it to a variable:
60-
let dataParsed = JSON.parse(data);
88+
let rightSide = createAndAppend("div", mainContainer, { class: "rightSide" });
89+
let rightHeading = createAndAppend("h3", rightSide, { text: "Contributors" });
90+
rightHeading.className = "rightHeading";
91+
createAndAppend("hr", rightSide);
92+
let contributorList = createAndAppend("ul", rightSide);
93+
contributorList.id = "contributorList";
6194
fillCombobox(dataParsed);
6295
comboChangeListener(dataParsed);
96+
dataRender(dataParsed);
6397
}
6498

65-
//4 - Filling the combobox:
99+
// Filling the combobox:
66100

67101
function fillCombobox(obj) {
68-
let selector = document.getElementById('comboMenu');
69-
obj.forEach(key => {
70-
let comOpt = document.createElement('option');
71-
comOpt.text = key.name;
72-
comOpt.value = key.id;
102+
let selector = document.getElementById("comboMenu");
103+
obj.sort((a, b) => a.name.localeCompare(b.name));
104+
obj.map(i => {
105+
let comOpt = document.createElement("option");
106+
comOpt.text = i.name;
107+
comOpt.value = i.id;
73108
selector.appendChild(comOpt);
74109
});
75110
}
76111

77-
//To be continued-----
112+
// Control select element and fill the datas accordingly:
113+
114+
function comboChangeListener(obj) {
115+
let comboMenu = document.getElementById("comboMenu");
116+
let repoInfo = document.getElementById("tableBud");
117+
118+
comboMenu.addEventListener("change", indexFunc);
119+
120+
function indexFunc() {
121+
while (repoInfo.hasChildNodes()) {
122+
repoInfo.removeChild(repoInfo.firstChild);
123+
}
124+
125+
let comboValue = comboMenu.options[comboMenu.selectedIndex].text;
126+
127+
for (let key in obj) {
128+
if (obj[key].name === comboValue) {
129+
//Repository part:
130+
131+
let repHead = createAndAppend("tr", repoInfo);
132+
let repHeadLabel = createAndAppend("td", repHead, {
133+
text: "Repository: "
134+
});
135+
repHeadLabel.className = "labels";
136+
let repHeadInfo = createAndAppend("td", repHead);
137+
let repLink = createAndAppend("a", repHeadInfo);
138+
repLink.setAttribute("target", "_blank");
139+
repLink.href = obj[key].html_url;
140+
repLink.innerText = obj[key].name;
141+
142+
//Description part:
143+
144+
let descHead = createAndAppend("tr", repoInfo);
145+
let descHeadLabel = createAndAppend("td", descHead, {
146+
text: "Description: "
147+
});
148+
descHeadLabel.className = "descLabel";
149+
let descHeadInfo = createAndAppend("td", descHead, {
150+
class: "descInfo"
151+
});
152+
descHeadInfo.innerText = obj[key].description;
153+
154+
//Forks part:
78155

156+
let forkHead = createAndAppend("tr", repoInfo);
157+
let forkHeadLabel = createAndAppend("td", forkHead, {
158+
text: "Forks: "
159+
});
160+
forkHeadLabel.className = "labels";
161+
let forkHeadInfo = createAndAppend("td", forkHead);
162+
forkHeadInfo.innerText = obj[key].forks;
163+
164+
//Updated part:
165+
166+
let updateHead = createAndAppend("tr", repoInfo);
167+
let updateHeadLabel = createAndAppend("td", updateHead, {
168+
text: "Updated: "
169+
});
170+
updateHeadLabel.className = "labels";
171+
let updateHeadInfo = createAndAppend("td", updateHead);
172+
let date = new Date(obj[key].updated_at);
173+
date = date.toUTCString();
174+
updateHeadInfo.innerText = date;
175+
176+
//Callback contributor url:
177+
let contrUrl = obj[key].contributors_url;
178+
apiCall(contrUrl, getContributors);
179+
}
180+
}
181+
}
182+
console.log(obj);
183+
}
184+
185+
// Function displays the data from contributor url:
186+
187+
function getContributors(contData) {
188+
let parsedContr = JSON.parse(contData);
189+
console.log(parsedContr);
190+
191+
let contrList = document.getElementById("contributorList");
192+
while (contrList.hasChildNodes()) {
193+
contrList.removeChild(contrList.firstChild);
194+
}
195+
196+
parsedContr.forEach(contributor => {
197+
//List element:
198+
let contrCard = createAndAppend("li", contrList, {
199+
class: "contributorCard"
200+
});
201+
202+
//Picture:
203+
let contrPicBox = createAndAppend("div", contrCard, {
204+
class: "contrPicBox"
205+
});
206+
let contrPic = createAndAppend("img", contrPicBox, {
207+
class: "contributorPic"
208+
});
209+
contrPic.src = contributor.avatar_url;
210+
211+
//Contributor name with link to the profile:
212+
let contrLinkBox = createAndAppend("div", contrCard, {
213+
class: "contrLinkBox"
214+
});
215+
let contrProfileLink = createAndAppend("a", contrLinkBox, {
216+
id: "contributorName"
217+
});
218+
contrProfileLink.setAttribute("target", "_blank");
219+
contrProfileLink.href = contributor.html_url;
220+
contrProfileLink.innerText = contributor.login;
221+
222+
//Contributor badges:
223+
let contrBadgeBox = createAndAppend("div", contrCard, {
224+
class: "contrBadgeBox"
225+
});
226+
let contrBadge = createAndAppend("p", contrBadgeBox, {
227+
class: "contributorBadge"
228+
});
229+
contrBadge.innerText = contributor.contributions;
230+
});
231+
}
232+
233+
//This function triggers after the page load to show the information of first selected repository :
234+
235+
function dataRender(obj) {
236+
let comboMenu = document.getElementById("comboMenu");
237+
let repoInfo = document.getElementById("tableBud");
238+
239+
for (let key in obj) {
240+
if (obj[key].name === comboMenu.options[comboMenu.selectedIndex].text) {
241+
//Repository part:
242+
243+
let repHead = createAndAppend("tr", repoInfo);
244+
let repHeadLabel = createAndAppend("td", repHead, {
245+
text: "Repository: "
246+
});
247+
repHeadLabel.className = "labels";
248+
let repHeadInfo = createAndAppend("td", repHead);
249+
let repLink = createAndAppend("a", repHeadInfo);
250+
repLink.setAttribute("target", "_blank");
251+
repLink.href = obj[key].html_url;
252+
repLink.innerText = obj[key].name;
253+
254+
//Description part:
255+
256+
let descHead = createAndAppend("tr", repoInfo);
257+
let descHeadLabel = createAndAppend("td", descHead, {
258+
text: "Description: "
259+
});
260+
descHeadLabel.className = "descLabel";
261+
let descHeadInfo = createAndAppend("td", descHead, { class: "descInfo" });
262+
descHeadInfo.innerText = obj[key].description;
263+
264+
//Forks part:
265+
266+
let forkHead = createAndAppend("tr", repoInfo);
267+
let forkHeadLabel = createAndAppend("td", forkHead, { text: "Forks: " });
268+
forkHeadLabel.className = "labels";
269+
let forkHeadInfo = createAndAppend("td", forkHead);
270+
forkHeadInfo.innerText = obj[key].forks;
271+
272+
//Updated part:
273+
274+
let updateHead = createAndAppend("tr", repoInfo);
275+
let updateHeadLabel = createAndAppend("td", updateHead, {
276+
text: "Updated: "
277+
});
278+
updateHeadLabel.className = "labels";
279+
let updateHeadInfo = createAndAppend("td", updateHead);
280+
let date = new Date(obj[key].updated_at);
281+
date = date.toUTCString();
282+
updateHeadInfo.innerText = date;
283+
284+
//Callback contributor url:
285+
let contrUrl = obj[key].contributors_url;
286+
apiCall(contrUrl, getContributors);
287+
}
288+
}
289+
}
290+
291+
//This function basically helps to start 2 different functions on window onload one after another:
292+
293+
function starter() {
294+
main(); //loads the page
295+
dataRender(); //detects the first selected repository and displays it
296+
}
79297

80-
window.onload = main();
298+
window.onload = starter();

0 commit comments

Comments
 (0)