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

Skip to content

Commit 392b987

Browse files
homework done
1 parent 527d784 commit 392b987

File tree

1 file changed

+288
-37
lines changed

1 file changed

+288
-37
lines changed

homework/src/index.js

Lines changed: 288 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,298 @@
1-
'use strict';
2-
3-
{
4-
function fetchJSON(url, cb) {
5-
const xhr = new XMLHttpRequest();
6-
xhr.open('GET', url);
7-
xhr.responseType = 'json';
8-
xhr.onload = () => {
9-
if (xhr.status < 400) {
10-
cb(null, xhr.response);
11-
} else {
12-
cb(new Error(`Network error: ${xhr.status} - ${xhr.statusText}`));
1+
"use strict";
2+
3+
function main() {
4+
const repoUrl =
5+
"https://api.github.com/orgs/HackYourFuture/repos?per_page=100";
6+
apiCall(repoUrl, dataHandler);
7+
}
8+
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+
}
22+
23+
// Making a request to the API endpoint:
24+
25+
function apiCall(url, callback) {
26+
let requestIt = new XMLHttpRequest();
27+
requestIt.open("GET", url);
28+
requestIt.onload = function() {
29+
if (requestIt.status < 400) {
30+
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;
42+
}
43+
};
44+
requestIt.send();
45+
}
46+
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 :
54+
55+
//Create heading part of the page:
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);
69+
comboBox.id = "comboMenu";
70+
71+
createAndAppend("hr", root, { class: "headHr" });
72+
73+
//Create body part:
74+
let mainContainer = createAndAppend("div", root);
75+
mainContainer.id = "container";
76+
77+
//Left side of the page:
78+
let leftSide = createAndAppend("div", mainContainer);
79+
leftSide.id = "leftSide";
80+
let leftHeader = createAndAppend("h3", leftSide, { text: "Repo Details" });
81+
leftHeader.className = "leftHeader";
82+
createAndAppend("hr", leftSide);
83+
let leftTable = createAndAppend("table", leftSide);
84+
let tBody = createAndAppend("tbody", leftTable);
85+
tBody.id = "tableBud";
86+
87+
//Right side of the page:
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";
94+
fillCombobox(dataParsed);
95+
comboChangeListener(dataParsed);
96+
dataRender(dataParsed);
97+
}
98+
99+
// Filling the combobox:
100+
101+
function fillCombobox(obj) {
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;
108+
selector.appendChild(comOpt);
109+
});
110+
}
111+
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:
155+
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);
13179
}
14-
};
15-
xhr.onerror = () => cb(new Error('Network request failed'));
16-
xhr.send();
180+
}
17181
}
182+
console.log(obj);
183+
}
18184

19-
function createAndAppend(name, parent, options = {}) {
20-
const elem = document.createElement(name);
21-
parent.appendChild(elem);
22-
Object.keys(options).forEach((key) => {
23-
const value = options[key];
24-
if (key === 'text') {
25-
elem.innerText = value;
26-
} else {
27-
elem.setAttribute(key, value);
28-
}
29-
});
30-
return elem;
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);
31194
}
32195

33-
function main(url) {
34-
fetchJSON(url, (err, data) => {
35-
const root = document.getElementById('root');
36-
if (err) {
37-
createAndAppend('div', root, { text: err.message, class: 'alert-error' });
38-
} else {
39-
createAndAppend('pre', root, { text: JSON.stringify(data, null, 2) });
40-
}
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"
41225
});
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+
}
42288
}
289+
}
43290

44-
const HYF_REPOS_URL = 'https://api.github.com/orgs/HackYourFuture/repos?per_page=100';
291+
//This function basically helps to start 2 different functions on window onload one after another:
45292

46-
window.onload = () => main(HYF_REPOS_URL);
293+
function starter() {
294+
main(); //loads the page
295+
dataRender(); //detects the first selected repository and displays it
47296
}
297+
298+
window.onload = starter();

0 commit comments

Comments
 (0)