From e8477114d0e1b5994b2b87fd77f8a2388dc2bf34 Mon Sep 17 00:00:00 2001 From: elsisco Date: Wed, 29 Sep 2021 16:26:35 +0200 Subject: [PATCH 01/15] first commit --- code/.DS_Store | Bin 0 -> 6148 bytes code/chart.js | 24 ++++++++++++-- code/index.html | 21 ++++++++++--- code/script.js | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ code/style.css | 22 ++++++++++++- 5 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 code/.DS_Store diff --git a/code/.DS_Store b/code/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 { + const config = { + type: 'doughnut', + data: { + labels: [ + 'Finished projects', + 'Projects to go' + ], + datasets: [{ + label: 'Technigo progress', + data: [amount, 20-amount], + backgroundColor: [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)' + ], + hoverOffset: 4 + }] + } + } + const myChart = new Chart(ctx, config) +} + diff --git a/code/index.html b/code/index.html index 2fb5e0ae..eda430c5 100644 --- a/code/index.html +++ b/code/index.html @@ -6,14 +6,27 @@ Project GitHub Tracker + + + +

GitHub Tracker

-

Projects:

-
- - +
+ + +
+ +
+ +
+ +

My Technigo projects

+ +
diff --git a/code/script.js b/code/script.js index e69de29b..e20e28bb 100644 --- a/code/script.js +++ b/code/script.js @@ -0,0 +1,81 @@ +let repoName = 'project-weather-app' + +const API_REPOS = `https://api.github.com/users/elsisco/repos` +const API_USER = `https://api.github.com/users/elsisco` +const API_PR = `https://api.github.com/repos/technigo/${repoName}/pulls` + + +const projectsContainer = document.getElementById('projects') +const profileContainer = document.getElementById('profile') + +const getUser = () => { + fetch(API_USER) + .then(res => res.json()) + .then(data => { + console.log(data) + profileContainer.innerHTML += /*html*/ ` + +
${data.name} (${data.login})
+
${data.bio}
+ ` + }) +} + +getUser() + + +const getRepos = () => { + fetch(API_REPOS) + .then(res => res.json()) + .then(data => { + console.log(data) + const forkedRepos = data.filter(repo => repo.fork && repo.name.startsWith('project-')) + // console.log(forkedRepos) + + forkedRepos.forEach(repo => + fetch(`https://api.github.com/repos/elsisco/${repo.name}/commits`) + .then(res => res.json()) + .then(commits => { + let projectName = `${repo.name}` + const formattedProjectName = projectName.split("-") + for (let i = 0; i < formattedProjectName.length; i++) { + formattedProjectName[i] = formattedProjectName[i][0].toUpperCase() + formattedProjectName[i].substr(1); + } + + let newProjectName = formattedProjectName.join(" ") + + let latestCommit = `${new Date(repo.pushed_at).toLocaleString()}` + // console.log(moment(latestCommit).format('LL')) + projectsContainer.innerHTML += /*html*/ ` +
+

${newProjectName} | Live βž” | GitHub βž”

+

Default branch: ${repo.default_branch}

+

Commits: ${commits.length} | Latest commit: ${latestCommit}

+
+ ` + + fetch(`https://api.github.com/repos/elsisco/${repo.name}/languages`) + .then(res => res.json()) + .then(languages => { + console.log(languages) + }) + }) + ) + drawChart(forkedRepos.length) + }) +} + +getRepos() + +// const getUserInfo = () => { +// fetch(API_USER) +// .then(res => res.json()) +// .then(data => { +// console.log(data) +// profileContainer.innerHTML += /*html*/ `
${data.name} | ${data.login}
` + +// }) +// } + +// getUserInfo() + diff --git a/code/style.css b/code/style.css index 7c8ad447..cf441b51 100644 --- a/code/style.css +++ b/code/style.css @@ -1,3 +1,23 @@ body { background: #FFECE9; -} \ No newline at end of file + font-family: Overpass, sans-serif; + box-sizing: border-box; +} + +.chart-wrapper { + width: 200px; + border: 1px black solid; +} + +.avatar { + width: 200px; + border-radius: 100px; + margin: 0px auto; +} + +.project-card { + border-radius: 10px; + background-color: white; + margin: 5px auto; + padding: 5px 20px; +} From 1f32a63af75c7149699fc62437a42aa928a9b35d Mon Sep 17 00:00:00 2001 From: elsisco Date: Fri, 1 Oct 2021 17:29:03 +0200 Subject: [PATCH 02/15] added styling and a language barometer --- .DS_Store | Bin 0 -> 6148 bytes assets/background.png | Bin 0 -> 97287 bytes code/chart.js | 17 ++++- code/index.html | 30 ++++---- code/script.js | 112 ++++++++++++++++++--------- code/style.css | 171 +++++++++++++++++++++++++++++++++++++++--- 6 files changed, 268 insertions(+), 62 deletions(-) create mode 100644 .DS_Store create mode 100644 assets/background.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4b3ec36474b4e4ae372cda2ee22bd98d9b6e745e GIT binary patch literal 6148 zcmeHKJ5B>J5S@VttwfWO(pN}9ZzAUexd4RlDYDu~3B9FsT#GZ&^X3E6f+Zvh6wpj$ zzp>}D-nWYFAtIhXt!G42BI?itS(JvzbklU=&J!SOjy>%*53}X%&~F=wj&VxXenvO6 z!|#sT>mS+sp_J8TSRt+}m-nyFhnK6*Ir?G!t<_I9v3xq8cXrb&S23t7h zllx`IYG~oaUVN}W`Mr2yeLC_dbtle-(FX&;z?gwk8&2i?U*Ip(Eb_-8F$xBPfq%vT zPs*~)@lt-aetA7PYZKZvnuz#SQ6SJqmjDc8AGuJY*^}t-%Z}AhvdFxK1LGo~ghUq% H`~m}SF2yXm literal 0 HcmV?d00001 diff --git a/assets/background.png b/assets/background.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c8b05d95153d033952bb33a286852a03edec4c GIT binary patch literal 97287 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 { data: { labels: [ 'Finished projects', - 'Projects to go' + 'Projects to go', ], datasets: [{ label: 'Technigo progress', data: [amount, 20-amount], backgroundColor: [ - 'rgb(255, 99, 132)', - 'rgb(54, 162, 235)' + '#F59B99', + '#FBD9D9' + ], + borderColor: [ + 'transparent', + 'transparent' ], hoverOffset: 4 }] + }, + options: { + plugins: { + legend: { + position: '', + } + } } } const myChart = new Chart(ctx, config) diff --git a/code/index.html b/code/index.html index eda430c5..eb09f146 100644 --- a/code/index.html +++ b/code/index.html @@ -8,25 +8,29 @@ - + -

GitHub Tracker

- -
- +
+

GitHub Tracker

+
+ +
+
+
+
+ +
+
+

Projects

+
+
+
-
- -
- -

My Technigo projects

- -
+
diff --git a/code/script.js b/code/script.js index e20e28bb..3d0a1c7c 100644 --- a/code/script.js +++ b/code/script.js @@ -14,68 +14,106 @@ const getUser = () => { .then(data => { console.log(data) profileContainer.innerHTML += /*html*/ ` - -
${data.name} (${data.login})
-
${data.bio}
+
+
+ +
+ +
${data.login}
+
${data.bio}
+
` }) } -getUser() - - const getRepos = () => { fetch(API_REPOS) .then(res => res.json()) .then(data => { - console.log(data) + // console.log(data) const forkedRepos = data.filter(repo => repo.fork && repo.name.startsWith('project-')) // console.log(forkedRepos) - forkedRepos.forEach(repo => fetch(`https://api.github.com/repos/elsisco/${repo.name}/commits`) .then(res => res.json()) .then(commits => { + // Formatting the title of projects to start all words with capital letter let projectName = `${repo.name}` const formattedProjectName = projectName.split("-") for (let i = 0; i < formattedProjectName.length; i++) { formattedProjectName[i] = formattedProjectName[i][0].toUpperCase() + formattedProjectName[i].substr(1); } - let newProjectName = formattedProjectName.join(" ") - - let latestCommit = `${new Date(repo.pushed_at).toLocaleString()}` + // Date for most recent update of project + let latestCommit = `${new Date(repo.pushed_at).toDateString()}` + + // Tried to use moment.js // console.log(moment(latestCommit).format('LL')) - projectsContainer.innerHTML += /*html*/ ` -
-

${newProjectName} | Live βž” | GitHub βž”

-

Default branch: ${repo.default_branch}

-

Commits: ${commits.length} | Latest commit: ${latestCommit}

-
- ` - fetch(`https://api.github.com/repos/elsisco/${repo.name}/languages`) - .then(res => res.json()) - .then(languages => { - console.log(languages) - }) + // Trying to calculate and display the language percentage per project + const calculateLanguagePercentage = () => { + fetch(`https://api.github.com/repos/elsisco/${repo.name}/languages`) + .then(res => res.json()) + .then(json => { + const html = json.HTML || 0; + const css = json.CSS || 0; + const js = json.JavaScript || 0; + const total = html + css + js; + + const js_percent = ((js / total) * 100).toFixed(1); + const css_percent = ((css / total) * 100).toFixed(1); + const html_percent = ((html / total) * 100).toFixed(1); + // languages.forEach(language => { + // let sum = JavaScript.value + CSS.value + HTML.value + // console.log(sum) + // }) + console.log('JS ' + js_percent) + console.log('CSS ' + css_percent) + console.log('HTML ' + html_percent) + + projectsContainer.innerHTML += /*html*/ ` +
+

${newProjectName}

+ +

Edited ${latestCommit} | ${commits.length} commits

+

Default branch: ${repo.default_branch}

+
+

Languages

+ +
+
+
+
+
+ +
+
+
+
JavaScript
+
+
+
+
CSS
+
+
+
+
HTML
+
+
+
+
+ ` + }) + } + calculateLanguagePercentage() + + // Adding content to the projects + }) ) drawChart(forkedRepos.length) }) } -getRepos() - -// const getUserInfo = () => { -// fetch(API_USER) -// .then(res => res.json()) -// .then(data => { -// console.log(data) -// profileContainer.innerHTML += /*html*/ `
${data.name} | ${data.login}
` - -// }) -// } - -// getUserInfo() - +getUser() +getRepos() \ No newline at end of file diff --git a/code/style.css b/code/style.css index cf441b51..1a6e8fa7 100644 --- a/code/style.css +++ b/code/style.css @@ -1,23 +1,176 @@ body { - background: #FFECE9; - font-family: Overpass, sans-serif; + font-family: 'Roboto', 'sans-serif'; box-sizing: border-box; + width: 100%; + height: 100%; + margin: 0; + background-image: url('/assets/background.png'); + background-repeat: no-repeat; + background-attachment: fixed; +} + +a { + text-decoration: none; + font-weight: 800; + color: black; +} + +a:hover { + color: #56B093; +} + +.text { + font-size: 14px; + line-height: 1.25; + margin: 8px 0; + font-weight: 300; +} + +.header { + font-family: 'Playfair Display', 'serif'; + font-size: 20px; + width: 95%; + display: flex; + display:flex; + align-items: flex-start; + justify-content: center; + border-bottom: 2px lightgray solid; + margin: 0 auto; +} + +.profile-wrapper { + border-bottom: 2px lightgray solid; + text-align: center; + margin: 0 auto; + display: flex; + align-items: flex-start; + justify-content: space-evenly; + flex-direction: row; + padding: 15px 0; +} + +.profile { + width: 55%; + border-right: 2px lightgray solid; + text-align: left; + padding: 3%; +} + +.chart-section { + width: 25%; + display: flex; + flex-direction: column; + align-items: center; + padding: 3%; } .chart-wrapper { - width: 200px; - border: 1px black solid; + width: 100%; +} + +.headline-wrapper { + display: flex; + align-items: center; + justify-content: center; +} + +.avatar-wrapper { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + padding-bottom: 20px; } .avatar { - width: 200px; - border-radius: 100px; - margin: 0px auto; + width: 90%; + border-radius: 1000px; + margin: 0 auto; + text-align: center; +} + +.profile-wrapper { + display: flex; + flex-direction: row; } .project-card { + background-color: rgba(255, 255, 255, 0.4); + margin: 15px auto; + padding: 20px 25px; + width: 90%; + max-width: 350px; +} + +.project-headline { + font-family: 'Playfair Display', 'serif'; + font-size: 25px; + font-weight: 600; + margin: 0; +} + +.links-text { + font-size: 16px; + font-weight: 700; +} + +.small-headline { + font-size: 14px; + font-weight: 700; +} + +.progress { + display: flex; + width: 75%; +} + +.progress-js { + height: 12px; + border-radius: 10px 0 0 10px; + background-color: #F59B99; +} +.progress-css { + height: 12px; + background-color: #EBBC4E; +} + +.progress-html { + height: 12px; + border-radius: 0 10px 10px 0; + background-color: #56B093; +} + +.the-languages { + display: flex; + align-items: center; + justify-content: flex-start; + padding: 10px 0; +} + +.js-wrapper { + display: flex; + align-items: center; +} + +.html-wrapper { + display: flex; + align-items: center; +} + +.css-wrapper { + display: flex; + align-items: center; +} + +.language-dot { + width: 10px; + height: 10px; border-radius: 10px; background-color: white; - margin: 5px auto; - padding: 5px 20px; + margin-right: 5px; } + +.language-text { + font-size: 12px; + margin-right: 15px; +} \ No newline at end of file From c3c09e549793115e0193cb22f71deb8855c6309e Mon Sep 17 00:00:00 2001 From: elsisco Date: Fri, 1 Oct 2021 23:35:13 +0200 Subject: [PATCH 03/15] added responsiveness and further styling --- assets/.DS_Store | Bin 0 -> 6148 bytes assets/location_icon.svg | 12 +++ code/index.html | 25 +++--- code/script.js | 25 +++--- code/style.css | 176 ++++++++++++++++++++++++++++++--------- 5 files changed, 178 insertions(+), 60 deletions(-) create mode 100644 assets/.DS_Store create mode 100644 assets/location_icon.svg diff --git a/assets/.DS_Store b/assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + + + + + diff --git a/code/index.html b/code/index.html index eb09f146..e4fd36c8 100644 --- a/code/index.html +++ b/code/index.html @@ -8,29 +8,32 @@ - +
-

GitHub Tracker

+

GitHub Tracker

- -
-
+ +
+
+
+
+
+

Technigo progress

+
-
-

Projects

-
-
- -
+
+
+
+ diff --git a/code/script.js b/code/script.js index 3d0a1c7c..71a5857a 100644 --- a/code/script.js +++ b/code/script.js @@ -20,6 +20,10 @@ const getUser = () => {
${data.login}
+
+ +
${data.location}
+
${data.bio}
` @@ -45,7 +49,7 @@ const getRepos = () => { } let newProjectName = formattedProjectName.join(" ") // Date for most recent update of project - let latestCommit = `${new Date(repo.pushed_at).toDateString()}` + let latestCommit = `${new Date(repo.pushed_at).toLocaleString("zh-TW", { dateStyle: 'short' })}` // Tried to use moment.js // console.log(moment(latestCommit).format('LL')) @@ -75,29 +79,30 @@ const getRepos = () => {

${newProjectName}

-

Edited ${latestCommit} | ${commits.length} commits

+

Updated ${latestCommit} | ${commits.length} commits

Default branch: ${repo.default_branch}

Languages

-
-
+
+
+
-
-
-
JavaScript
+
+
+
HTML
CSS
-
-
-
HTML
+
+
+
JavaScript
diff --git a/code/style.css b/code/style.css index 1a6e8fa7..5c47068d 100644 --- a/code/style.css +++ b/code/style.css @@ -4,9 +4,6 @@ body { width: 100%; height: 100%; margin: 0; - background-image: url('/assets/background.png'); - background-repeat: no-repeat; - background-attachment: fixed; } a { @@ -22,26 +19,69 @@ a:hover { .text { font-size: 14px; line-height: 1.25; - margin: 8px 0; + margin: 0; + margin-bottom: 5px; font-weight: 300; } -.header { +.project-headline { font-family: 'Playfair Display', 'serif'; - font-size: 20px; - width: 95%; + font-size: 22px; + margin: 0; + margin-bottom: 8px; +} + +.links-text { + font-size: 15px; + font-weight: 600; + margin: 8px 0; +} + +.small-headline { + font-size: 14px; + font-weight: 600; + margin: 10px 0; +} + +.header { + width: 100%; + max-width: 1024px; display: flex; - display:flex; align-items: flex-start; justify-content: center; - border-bottom: 2px lightgray solid; margin: 0 auto; + background-color: grey; +} + +.header-text { + font-family: 'Playfair Display', 'serif'; + font-weight: 700; + font-size: 25px; + color: white; + margin: 10px 0 15px 0; + /* background-color: grey; + color: transparent; + text-shadow: 0px 2px 3px rgba(255,255,255,0.5); + -webkit-background-clip: text; + -moz-background-clip: text; + background-clip: text; + margin: 20px; */ +} + +.main-wrapper { + background-image: url('/assets/background.png'); + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; + max-width: 1024px; + margin: 0 auto; + height: 100%; } .profile-wrapper { - border-bottom: 2px lightgray solid; + background-color: rgba(255, 255, 255, 0.5); text-align: center; - margin: 0 auto; + margin: 0 auto 15px auto; display: flex; align-items: flex-start; justify-content: space-evenly; @@ -56,6 +96,16 @@ a:hover { padding: 3%; } +.location { + display: flex; +} + +.location img { + height: 12px; + margin-right: 5px; + margin-top: 1.5px; +} + .chart-section { width: 25%; display: flex; @@ -83,50 +133,29 @@ a:hover { } .avatar { - width: 90%; + width: 80%; border-radius: 1000px; margin: 0 auto; text-align: center; -} - -.profile-wrapper { - display: flex; - flex-direction: row; + border: 6px lightgray solid; + padding: 5px; } .project-card { - background-color: rgba(255, 255, 255, 0.4); + background-color: rgba(255, 255, 255, 0.5); margin: 15px auto; padding: 20px 25px; width: 90%; - max-width: 350px; -} - -.project-headline { - font-family: 'Playfair Display', 'serif'; - font-size: 25px; - font-weight: 600; - margin: 0; -} - -.links-text { - font-size: 16px; - font-weight: 700; -} - -.small-headline { - font-size: 14px; - font-weight: 700; } .progress { display: flex; - width: 75%; + width: 85%; } .progress-js { height: 12px; - border-radius: 10px 0 0 10px; + border-radius: 0 10px 10px 0; background-color: #F59B99; } .progress-css { @@ -136,7 +165,7 @@ a:hover { .progress-html { height: 12px; - border-radius: 0 10px 10px 0; + border-radius: 10px 0 0 10px; background-color: #56B093; } @@ -173,4 +202,73 @@ a:hover { .language-text { font-size: 12px; margin-right: 15px; +} + +@media (min-width: 668px) { + .main-wrapper { + display: flex; + flex-direction: row; + justify-content: space-evenly; + height: 100%; + } + + .profile-wrapper { + flex-direction: column; + justify-content: flex-start; + width: 300px; + max-height: 700px; + margin: 15px 0 0 15px; + padding: 15px 15px 40px 15px; + background-color: rgba(255, 255, 255, 0.5); + border-bottom: none; + } + + .profile { + width: 95%; + border-right: none; + margin-bottom: 10px; + } + + .avatar { + width: 80%; + } + + .chart-section { + width: 70%; + justify-content: center; + margin: 15px auto; + } + + .projects-wrapper { + width: 60%; + } + + .project-card { + background-color: rgba(255, 255, 255, 0.5); + margin: 15px auto; + width: 80%; + } +} + +@media (min-width: 1024px) { + .profile-wrapper { + width: 25%; + } + + .projects-wrapper { + width: 70%; + } + + .projects { + display: flex; + flex-direction: row; + justify-content: space-evenly; + flex-wrap: wrap; + padding-bottom: 20px; + } + + .project-card { + width: 40%; + margin: 15px 0 0 0; + } } \ No newline at end of file From f4a4b182f16046d9f074de07eb924592e18e4010 Mon Sep 17 00:00:00 2001 From: elsisco Date: Fri, 1 Oct 2021 23:40:08 +0200 Subject: [PATCH 04/15] adjusted links to assets --- code/.DS_Store | Bin 6148 -> 6148 bytes {assets => code/assets}/.DS_Store | Bin {assets => code/assets}/background.png | Bin {assets => code/assets}/location_icon.svg | 0 code/script.js | 2 +- code/style.css | 2 +- 6 files changed, 2 insertions(+), 2 deletions(-) rename {assets => code/assets}/.DS_Store (100%) rename {assets => code/assets}/background.png (100%) rename {assets => code/assets}/location_icon.svg (100%) diff --git a/code/.DS_Store b/code/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..4b3ec36474b4e4ae372cda2ee22bd98d9b6e745e 100644 GIT binary patch delta 210 zcmZoMXfc=|#>B`mF;Q%yo}wrV0|Nsi1A_nqLkUB1PP$=ma(-^X#Kh(GAPF{xM22D@ zOhuLiio*bkd~UvrOHxjL5>S%E#Wd|}SMy;AjHu~2NHo+1YW5HK<@2yC9nSjM(_0izY;W_AvK4xj>{$am(+{342+ UKzW7)kiy9(Jj$D6L{=~Z03gE-+W-In diff --git a/assets/.DS_Store b/code/assets/.DS_Store similarity index 100% rename from assets/.DS_Store rename to code/assets/.DS_Store diff --git a/assets/background.png b/code/assets/background.png similarity index 100% rename from assets/background.png rename to code/assets/background.png diff --git a/assets/location_icon.svg b/code/assets/location_icon.svg similarity index 100% rename from assets/location_icon.svg rename to code/assets/location_icon.svg diff --git a/code/script.js b/code/script.js index 71a5857a..acc77756 100644 --- a/code/script.js +++ b/code/script.js @@ -21,7 +21,7 @@ const getUser = () => {
${data.login}
- +
${data.location}
${data.bio}
diff --git a/code/style.css b/code/style.css index 5c47068d..f10c3667 100644 --- a/code/style.css +++ b/code/style.css @@ -69,7 +69,7 @@ a:hover { } .main-wrapper { - background-image: url('/assets/background.png'); + background-image: url('./assets/background.png'); background-repeat: no-repeat; background-attachment: fixed; background-size: cover; From f8e6a22f9c3f98e2cf0573c6c84007e9f3f53ccd Mon Sep 17 00:00:00 2001 From: elsisco Date: Sat, 2 Oct 2021 09:02:12 +0200 Subject: [PATCH 05/15] added link to github in profile and some styling --- code/script.js | 5 +++-- code/style.css | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/code/script.js b/code/script.js index acc77756..62ca8325 100644 --- a/code/script.js +++ b/code/script.js @@ -18,8 +18,9 @@ const getUser = () => {
- -
${data.login}
+
${data.name}
+
${data.login}
+
${data.location}
diff --git a/code/style.css b/code/style.css index f10c3667..17652b2e 100644 --- a/code/style.css +++ b/code/style.css @@ -27,8 +27,7 @@ a:hover { .project-headline { font-family: 'Playfair Display', 'serif'; font-size: 22px; - margin: 0; - margin-bottom: 8px; + margin-bottom: 2px; } .links-text { @@ -37,6 +36,11 @@ a:hover { margin: 8px 0; } +.thin-headline { + font-size: 18px; + font-weight: 300; +} + .small-headline { font-size: 14px; font-weight: 600; @@ -118,6 +122,10 @@ a:hover { width: 100%; } +chart { + padding: 5px; +} + .headline-wrapper { display: flex; align-items: center; @@ -154,17 +162,17 @@ a:hover { } .progress-js { - height: 12px; + height: 10px; border-radius: 0 10px 10px 0; background-color: #F59B99; } .progress-css { - height: 12px; + height: 10px; background-color: #EBBC4E; } .progress-html { - height: 12px; + height: 10px; border-radius: 10px 0 0 10px; background-color: #56B093; } From 76b681aab62a30c754c11720c6f35d02c8e8ef07 Mon Sep 17 00:00:00 2001 From: elsisco Date: Sat, 2 Oct 2021 14:12:58 +0200 Subject: [PATCH 06/15] added a footer and restyled the header --- .vscode/settings.json | 2 +- code/chart.js | 6 +++--- code/index.html | 9 +++++---- code/script.js | 47 +++++++++++++++++-------------------------- code/style.css | 47 ++++++++++++++++++++++++++++++++++--------- 5 files changed, 64 insertions(+), 47 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index e8783bfe..c247e175 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "liveServer.settings.port": 5505 + "liveServer.settings.port": 5506 } \ No newline at end of file diff --git a/code/chart.js b/code/chart.js index 95bb5ae5..ef7ae653 100644 --- a/code/chart.js +++ b/code/chart.js @@ -5,8 +5,8 @@ const drawChart = (amount) => { type: 'doughnut', data: { labels: [ - 'Finished projects', - 'Projects to go', + `${amount} projects pushed`, + `${20-amount} to go`, ], datasets: [{ label: 'Technigo progress', @@ -25,7 +25,7 @@ const drawChart = (amount) => { options: { plugins: { legend: { - position: '', + position: 'bottom', } } } diff --git a/code/index.html b/code/index.html index e4fd36c8..734884c9 100644 --- a/code/index.html +++ b/code/index.html @@ -13,11 +13,10 @@ -
-

GitHub Tracker

-
-
+
+

GitHub Tracker

+
@@ -35,6 +34,8 @@

GitHub Tracker

+
Made by Elsa CarlstrΓΆm
Frontend developer student @Technigo 2021
+ diff --git a/code/script.js b/code/script.js index 62ca8325..8b0470d0 100644 --- a/code/script.js +++ b/code/script.js @@ -35,9 +35,8 @@ const getRepos = () => { fetch(API_REPOS) .then(res => res.json()) .then(data => { - // console.log(data) const forkedRepos = data.filter(repo => repo.fork && repo.name.startsWith('project-')) - // console.log(forkedRepos) + // Fetch forkedRepos.forEach(repo => fetch(`https://api.github.com/repos/elsisco/${repo.name}/commits`) .then(res => res.json()) @@ -49,36 +48,28 @@ const getRepos = () => { formattedProjectName[i] = formattedProjectName[i][0].toUpperCase() + formattedProjectName[i].substr(1); } let newProjectName = formattedProjectName.join(" ") + // Date for most recent update of project - let latestCommit = `${new Date(repo.pushed_at).toLocaleString("zh-TW", { dateStyle: 'short' })}` + let latestCommit = new Date(repo.pushed_at).toLocaleString("en-ZA", { dateStyle: 'short' }) - // Tried to use moment.js - // console.log(moment(latestCommit).format('LL')) - - // Trying to calculate and display the language percentage per project + // A calculator for language percentage per project const calculateLanguagePercentage = () => { fetch(`https://api.github.com/repos/elsisco/${repo.name}/languages`) .then(res => res.json()) - .then(json => { - const html = json.HTML || 0; - const css = json.CSS || 0; - const js = json.JavaScript || 0; - const total = html + css + js; + .then(language => { + const html = language.HTML || 0; + const css = language.CSS || 0; + const js = language.JavaScript || 0; + const sum = html + css + js; - const js_percent = ((js / total) * 100).toFixed(1); - const css_percent = ((css / total) * 100).toFixed(1); - const html_percent = ((html / total) * 100).toFixed(1); - // languages.forEach(language => { - // let sum = JavaScript.value + CSS.value + HTML.value - // console.log(sum) - // }) - console.log('JS ' + js_percent) - console.log('CSS ' + css_percent) - console.log('HTML ' + html_percent) + const htmlPercentage = ((html / sum) * 100).toFixed(1); + const cssPercentage = ((css / sum) * 100).toFixed(1); + const jsPercentage = ((js / sum) * 100).toFixed(1); + // Adding content to the projects projectsContainer.innerHTML += /*html*/ `
-

${newProjectName}

+
${newProjectName}

Updated ${latestCommit} | ${commits.length} commits

Default branch: ${repo.default_branch}

@@ -86,9 +77,9 @@ const getRepos = () => {

Languages

-
-
-
+
+
+
@@ -112,9 +103,6 @@ const getRepos = () => { }) } calculateLanguagePercentage() - - // Adding content to the projects - }) ) drawChart(forkedRepos.length) @@ -122,4 +110,5 @@ const getRepos = () => { } getUser() + getRepos() \ No newline at end of file diff --git a/code/style.css b/code/style.css index 17652b2e..5b8eda77 100644 --- a/code/style.css +++ b/code/style.css @@ -27,7 +27,7 @@ a:hover { .project-headline { font-family: 'Playfair Display', 'serif'; font-size: 22px; - margin-bottom: 2px; + margin: 7px 0 4px 0; } .links-text { @@ -48,13 +48,16 @@ a:hover { } .header { - width: 100%; + width: 225px; + height: 58px; max-width: 1024px; display: flex; align-items: flex-start; justify-content: center; margin: 0 auto; - background-color: grey; + background-color: #56B093; + border-radius: 0 0 10px 10px; + box-shadow: 0px 3px 4px 0 rgba(0, 0, 0, 0.25); } .header-text { @@ -79,13 +82,14 @@ a:hover { background-size: cover; max-width: 1024px; margin: 0 auto; + padding-bottom: 20px; height: 100%; } .profile-wrapper { background-color: rgba(255, 255, 255, 0.5); text-align: center; - margin: 0 auto 15px auto; + margin: 15px auto; display: flex; align-items: flex-start; justify-content: space-evenly; @@ -149,11 +153,14 @@ chart { padding: 5px; } +.projects { + width: 100%; +} + .project-card { background-color: rgba(255, 255, 255, 0.5); - margin: 15px auto; + margin-top: 15px; padding: 20px 25px; - width: 90%; } .progress { @@ -212,6 +219,20 @@ chart { margin-right: 15px; } + +.footer { + background-color: #56B093; + color: white; + max-width: 1024px; + margin: 0 auto; + padding: 8px; + text-align: center; + font-size: 11px; + line-height: 1.5; + box-sizing: border-box; + box-shadow: 0px 3px 4px 0 rgba(0, 0, 0, 0.25); +} + @media (min-width: 668px) { .main-wrapper { display: flex; @@ -220,15 +241,19 @@ chart { height: 100%; } + .header { + position: fixed; + } + .profile-wrapper { flex-direction: column; justify-content: flex-start; width: 300px; - max-height: 700px; + height: 70%; margin: 15px 0 0 15px; - padding: 15px 15px 40px 15px; + padding: 15px; + margin-top: 85px; background-color: rgba(255, 255, 255, 0.5); - border-bottom: none; } .profile { @@ -239,6 +264,7 @@ chart { .avatar { width: 80%; + margin-top: 10px; } .chart-section { @@ -249,6 +275,7 @@ chart { .projects-wrapper { width: 60%; + padding-top: 70px; } .project-card { @@ -258,7 +285,7 @@ chart { } } -@media (min-width: 1024px) { +@media (min-width: 1025px) { .profile-wrapper { width: 25%; } From 709583281339200d2768cf9d4887ab1de8d2dc2a Mon Sep 17 00:00:00 2001 From: elsisco Date: Sat, 2 Oct 2021 17:37:08 +0200 Subject: [PATCH 07/15] added number of commits, sorted the projects by name and cleaned up the code --- code/chart.js | 10 ++-- code/index.html | 2 +- code/script.js | 138 +++++++++++++++++++++++++++++------------------- code/style.css | 13 +++-- 4 files changed, 97 insertions(+), 66 deletions(-) diff --git a/code/chart.js b/code/chart.js index ef7ae653..6c1a6923 100644 --- a/code/chart.js +++ b/code/chart.js @@ -5,27 +5,27 @@ const drawChart = (amount) => { type: 'doughnut', data: { labels: [ - `${amount} projects pushed`, - `${20-amount} to go`, + `Pushed projects`, + `Projects to go`, ], datasets: [{ label: 'Technigo progress', data: [amount, 20-amount], backgroundColor: [ '#F59B99', - '#FBD9D9' + '#FAECD2' ], borderColor: [ 'transparent', 'transparent' ], - hoverOffset: 4 + hoverOffset: 0 }] }, options: { plugins: { legend: { - position: 'bottom', + position: '', } } } diff --git a/code/index.html b/code/index.html index 734884c9..dcbad93d 100644 --- a/code/index.html +++ b/code/index.html @@ -22,7 +22,7 @@

GitHub Tracker

-

Technigo progress

+

Technigo Projects

diff --git a/code/script.js b/code/script.js index 8b0470d0..1797a1f0 100644 --- a/code/script.js +++ b/code/script.js @@ -12,7 +12,7 @@ const getUser = () => { fetch(API_USER) .then(res => res.json()) .then(data => { - console.log(data) + // Profile content profileContainer.innerHTML += /*html*/ `
@@ -35,12 +35,16 @@ const getRepos = () => { fetch(API_REPOS) .then(res => res.json()) .then(data => { + // Filtering the Technigo project repos const forkedRepos = data.filter(repo => repo.fork && repo.name.startsWith('project-')) - // Fetch - forkedRepos.forEach(repo => + + // Sort array in alphabetical order + const sortedRepos = forkedRepos.sort() + + sortedRepos.forEach(repo => fetch(`https://api.github.com/repos/elsisco/${repo.name}/commits`) .then(res => res.json()) - .then(commits => { + .then(data => { // Formatting the title of projects to start all words with capital letter let projectName = `${repo.name}` const formattedProjectName = projectName.split("-") @@ -51,64 +55,92 @@ const getRepos = () => { // Date for most recent update of project let latestCommit = new Date(repo.pushed_at).toLocaleString("en-ZA", { dateStyle: 'short' }) - - // A calculator for language percentage per project - const calculateLanguagePercentage = () => { - fetch(`https://api.github.com/repos/elsisco/${repo.name}/languages`) - .then(res => res.json()) - .then(language => { - const html = language.HTML || 0; - const css = language.CSS || 0; - const js = language.JavaScript || 0; - const sum = html + css + js; - - const htmlPercentage = ((html / sum) * 100).toFixed(1); - const cssPercentage = ((css / sum) * 100).toFixed(1); - const jsPercentage = ((js / sum) * 100).toFixed(1); - // Adding content to the projects - projectsContainer.innerHTML += /*html*/ ` -
-
${newProjectName}
- -

Updated ${latestCommit} | ${commits.length} commits

-

Default branch: ${repo.default_branch}

-
-

Languages

+ // Adding content to the projects + projectsContainer.innerHTML += /*html*/ ` +
+
${newProjectName}
+ +

Most recent edit: ${latestCommit}

+

Default branch: ${repo.default_branch}

+

(commits yet to be displayed)

+
+

Languages

-
-
-
-
- -
- -
-
-
-
HTML
-
-
-
-
CSS
-
-
-
-
JavaScript
-
-
-
+
+ +
+
+
+
HTML
+
+
+
+
CSS
- ` - }) - } - calculateLanguagePercentage() +
+
+
JavaScript
+
+
+
+
+ ` + calculateLanguagePercentage(repo) }) ) + fetchPullRequestsArray(forkedRepos); drawChart(forkedRepos.length) }) } +// A calculator for language percentage per project +const calculateLanguagePercentage = (repo) => { + fetch(`https://api.github.com/repos/elsisco/${repo.name}/languages`) + .then(res => res.json()) + .then(language => { + const html = language.HTML || 0; + const css = language.CSS || 0; + const js = language.JavaScript || 0; + const sum = html + css + js; + + const htmlPercentage = ((html / sum) * 100).toFixed(1); + const cssPercentage = ((css / sum) * 100).toFixed(1); + const jsPercentage = ((js / sum) * 100).toFixed(1); + + document.getElementById(`progress-${repo.name}`).innerHTML = /*html*/ ` +
+
+
+ ` + }) +} + +const fetchPullRequestsArray = (allRepositories) => { + allRepositories.forEach(repo => { + fetch(`https://api.github.com/repos/Technigo/${repo.name}/pulls?per_page=100`) + .then(res => res.json()) + .then((data) => { + const myPullRequests = data.find((pull) => pull.user.login === repo.owner.login) + fetchCommits(myPullRequests.commits_url, repo.name) + // if (myPullRequests) { + // fetchCommits(myPullRequests.commits_url, repo.name) + // } else { + // document.getElementById(`commit-${repo.name}`).innerHTML += + // 'No commits yet'; + // } + }) + }) +} + +const fetchCommits = (myCommitsUrl, myRepoName) => { + fetch(myCommitsUrl) + .then(res => res.json()) + .then((data) => { + document.getElementById(`commits-${myRepoName}`).innerHTML = `${data.length} commits` + }) +} + getUser() getRepos() \ No newline at end of file diff --git a/code/style.css b/code/style.css index 5b8eda77..571bf82f 100644 --- a/code/style.css +++ b/code/style.css @@ -18,7 +18,7 @@ a:hover { .text { font-size: 14px; - line-height: 1.25; + line-height: 1.4; margin: 0; margin-bottom: 5px; font-weight: 300; @@ -31,7 +31,7 @@ a:hover { } .links-text { - font-size: 15px; + font-size: 14px; font-weight: 600; margin: 8px 0; } @@ -43,7 +43,7 @@ a:hover { .small-headline { font-size: 14px; - font-weight: 600; + font-weight: 400; margin: 10px 0; } @@ -57,7 +57,7 @@ a:hover { margin: 0 auto; background-color: #56B093; border-radius: 0 0 10px 10px; - box-shadow: 0px 3px 4px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0px 3px 4px 0 rgba(0, 0, 0, 0.15); } .header-text { @@ -149,8 +149,8 @@ chart { border-radius: 1000px; margin: 0 auto; text-align: center; - border: 6px lightgray solid; - padding: 5px; + border: 5px lightgrey solid; + padding: 3px; } .projects { @@ -230,7 +230,6 @@ chart { font-size: 11px; line-height: 1.5; box-sizing: border-box; - box-shadow: 0px 3px 4px 0 rgba(0, 0, 0, 0.25); } @media (min-width: 668px) { From 07f830cdba69ef05912aa41dd44e458a07606464 Mon Sep 17 00:00:00 2001 From: elsisco Date: Sun, 3 Oct 2021 15:18:24 +0200 Subject: [PATCH 08/15] modified background image + footer and hard coded the fetch for commits for Project Chatbot --- code/chart.js | 2 +- code/index.html | 2 +- code/script.js | 40 +++++++++++++++++----------------------- code/style.css | 16 +++++++++------- 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/code/chart.js b/code/chart.js index 6c1a6923..c96d9e55 100644 --- a/code/chart.js +++ b/code/chart.js @@ -10,7 +10,7 @@ const drawChart = (amount) => { ], datasets: [{ label: 'Technigo progress', - data: [amount, 20-amount], + data: [amount, 19-amount], backgroundColor: [ '#F59B99', '#FAECD2' diff --git a/code/index.html b/code/index.html index dcbad93d..d6ab255c 100644 --- a/code/index.html +++ b/code/index.html @@ -34,7 +34,7 @@

GitHub Tracker

-
Made by Elsa CarlstrΓΆm
Frontend developer student @Technigo 2021
+
Made by Frontend developer student Elsa CarlstrΓΆm @Technigo 2021
diff --git a/code/script.js b/code/script.js index 1797a1f0..672bcf9f 100644 --- a/code/script.js +++ b/code/script.js @@ -1,13 +1,13 @@ -let repoName = 'project-weather-app' - -const API_REPOS = `https://api.github.com/users/elsisco/repos` -const API_USER = `https://api.github.com/users/elsisco` -const API_PR = `https://api.github.com/repos/technigo/${repoName}/pulls` +const USER = 'elsisco' +let repoName = 'project-weather-app' // Default value +const API_REPOS = `https://api.github.com/users/${USER}/repos` +const API_USER = `https://api.github.com/users/${USER}` const projectsContainer = document.getElementById('projects') const profileContainer = document.getElementById('profile') +// Fetch content for profile section const getUser = () => { fetch(API_USER) .then(res => res.json()) @@ -31,26 +31,26 @@ const getUser = () => { }) } +// Fetch content for projects section const getRepos = () => { fetch(API_REPOS) .then(res => res.json()) .then(data => { // Filtering the Technigo project repos const forkedRepos = data.filter(repo => repo.fork && repo.name.startsWith('project-')) - - // Sort array in alphabetical order - const sortedRepos = forkedRepos.sort() - sortedRepos.forEach(repo => - fetch(`https://api.github.com/repos/elsisco/${repo.name}/commits`) + forkedRepos.forEach(repo => + fetch(`https://api.github.com/repos/${USER}/${repo.name}/commits`) .then(res => res.json()) .then(data => { // Formatting the title of projects to start all words with capital letter let projectName = `${repo.name}` + const formattedProjectName = projectName.split("-") for (let i = 0; i < formattedProjectName.length; i++) { formattedProjectName[i] = formattedProjectName[i][0].toUpperCase() + formattedProjectName[i].substr(1); } + let newProjectName = formattedProjectName.join(" ") // Date for most recent update of project @@ -66,9 +66,7 @@ const getRepos = () => {

(commits yet to be displayed)

Languages

- -
- +
@@ -94,9 +92,9 @@ const getRepos = () => { }) } -// A calculator for language percentage per project +// A calculator for percentage of language per project const calculateLanguagePercentage = (repo) => { - fetch(`https://api.github.com/repos/elsisco/${repo.name}/languages`) + fetch(`https://api.github.com/repos/${USER}/${repo.name}/languages`) .then(res => res.json()) .then(language => { const html = language.HTML || 0; @@ -116,23 +114,20 @@ const calculateLanguagePercentage = (repo) => { }) } +// Fetch all pull requests per project const fetchPullRequestsArray = (allRepositories) => { allRepositories.forEach(repo => { fetch(`https://api.github.com/repos/Technigo/${repo.name}/pulls?per_page=100`) .then(res => res.json()) .then((data) => { - const myPullRequests = data.find((pull) => pull.user.login === repo.owner.login) + // Hard coded the || below to get the commits for Project Chatbot for which I was not a collaborator + const myPullRequests = data.find((pull) => pull.user.login === repo.owner.login || pull.user.login === 'Svempolin' && pull.number === 67) fetchCommits(myPullRequests.commits_url, repo.name) - // if (myPullRequests) { - // fetchCommits(myPullRequests.commits_url, repo.name) - // } else { - // document.getElementById(`commit-${repo.name}`).innerHTML += - // 'No commits yet'; - // } }) }) } +// Fetching all the commits connected to the username const fetchCommits = (myCommitsUrl, myRepoName) => { fetch(myCommitsUrl) .then(res => res.json()) @@ -142,5 +137,4 @@ const fetchCommits = (myCommitsUrl, myRepoName) => { } getUser() - getRepos() \ No newline at end of file diff --git a/code/style.css b/code/style.css index 571bf82f..0cd8534e 100644 --- a/code/style.css +++ b/code/style.css @@ -4,6 +4,10 @@ body { width: 100%; height: 100%; margin: 0; + background-image: url('./assets/background.png'); + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; } a { @@ -76,10 +80,6 @@ a:hover { } .main-wrapper { - background-image: url('./assets/background.png'); - background-repeat: no-repeat; - background-attachment: fixed; - background-size: cover; max-width: 1024px; margin: 0 auto; padding-bottom: 20px; @@ -99,7 +99,7 @@ a:hover { .profile { width: 55%; - border-right: 2px lightgray solid; + border-right: 1px lightgray solid; text-align: left; padding: 3%; } @@ -138,6 +138,8 @@ chart { .avatar-wrapper { width: 100%; + max-width: 220px; + margin: 0 auto; display: flex; align-items: center; justify-content: center; @@ -221,11 +223,11 @@ chart { .footer { + width: 100%; background-color: #56B093; color: white; - max-width: 1024px; margin: 0 auto; - padding: 8px; + padding: 10px; text-align: center; font-size: 11px; line-height: 1.5; From 56d17e1200f6fa30c66fb6215ad6a3bdb6374e36 Mon Sep 17 00:00:00 2001 From: elsisco Date: Sun, 3 Oct 2021 16:04:22 +0200 Subject: [PATCH 09/15] filled out information about the project in the readme file --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1613a3b0..b26198af 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ # GitHub Tracker -Replace this readme with your own information about your project. - -Start by briefly describing the assignment in a sentence or two. Keep it short and to the point. +This is my version of a GitHub Tracker. It's a webpage that displays my profile and all projects I've made during the Technigo Frontend Boot Camp together with selected information about it fetched through GitHub API's. ## The problem -Describe how you approached to problem, and what tools and techniques you used to solve it. How did you plan? What technologies did you use? If you had more time, what would be next? +I started out by studying the project breif and getting familiar to the use of the GitHub API's as I started to add code to the project. I finished the projects requirements and added extra features. The extra features includes the formatting of the fetched project name, adding the language percentage for each project and links to view the projects live. + +This project opened up my eyes to the clever use of dynamic id's. By using it I was able to keep the functions separate and invoking them with arguments in the main function (getRepos) instead of having to collect them all in the main function in a "waterfall" structure to access the values of the variables inside. + +Next step would be to add if the projects has collaborators or not (group or individual assignment), names of collaborators and the commits made for projects I've been a collaborator on. To be able to sort and/or search for the projects will come in handy when the number of projects will increase. ## View it live -Every project should be deployed somewhere. Be sure to include the link to the deployed project so that the viewer can click around and see what it's all about. +https://priceless-kepler-739442.netlify.app/ From 80310217396f79677ddc6d95fe07ac052f912fba Mon Sep 17 00:00:00 2001 From: elsisco Date: Sat, 9 Oct 2021 12:12:01 +0200 Subject: [PATCH 10/15] added link to portfolio --- .DS_Store | Bin 6148 -> 6148 bytes code/.DS_Store | Bin 6148 -> 6148 bytes code/script.js | 9 ++++++++- code/style.css | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.DS_Store b/.DS_Store index 4b3ec36474b4e4ae372cda2ee22bd98d9b6e745e..74fcd77983d6fe015b3241c531f8a1b34e10d5a6 100644 GIT binary patch literal 6148 zcmeHK%}T>S5T1rAHb`= zfG3ZBvoqAJX+0K^8QA?c^RqMg60#X0a@qB;L)0ds76xOqg=vYfokv3=)$9Nr?=c;B zx`VQqH9Sr6R~g`E7t=9~X+l@Q^NY?Wbz4#9d4F2=p=-To^WD$8=hM(W{MA0YsJ$C; z523V)yf<`711f1qqaZucVbh~t!~Mg{!H3lFW1ph@u4J`WP>+BA!Namj+}j+LENt}} z_K%((UvHHMjjd;2W)Jd4C(MJ1F<=ZB1M6l0XEsY~ThL}>z!)$F77XzBA;Dlw6)Qpi z>A>V$0ALKY7p%FL;Fv@)RjdSIfj9{TN~qHo!$~;wiTb6Am7s)^)8@lzW~UvB^VzX~ z;@!!mf;Jli#z4rxhFrG!{6AaW|A#?#WegYt|B3+@=iNNRE$P|XxH&#+6O0}P3;R`q lix4dQQ4C)`iuW+QK%ejem?~C+&_L`*z|&xpF|bw!z5pUGW;6f* delta 212 zcmZoMXfc=|#>B`mF;Q%yo}wrV0|Nsi1A_nqLkUB1PP$=ma(-^X#Kh(GAPF{xM22D@ zOhuLiio*bkd~UvrOHxjL5>S%E#Wd|}SMy;yyk g(`I%Keh#3Ufg<0TC-aL~a)4X_bT-rG0Ff=s06&j0w*UYD diff --git a/code/.DS_Store b/code/.DS_Store index 4b3ec36474b4e4ae372cda2ee22bd98d9b6e745e..ce4580b23e3b82642061dee83e9aa7ac51a0af74 100644 GIT binary patch delta 52 zcmZoMXffEJ$;iw&-EOiDqYUerJMU$0OfF;;o}9qQ1Lr9)F>csAk+FnrGdss$egNcw B5|;n~ delta 52 zcmZoMXffEJ$;iyWz%W^dQHIsUH0^8G {
${data.name}
${data.login}
+
@@ -36,8 +37,14 @@ const getRepos = () => { fetch(API_REPOS) .then(res => res.json()) .then(data => { + + console.log(data) // Filtering the Technigo project repos const forkedRepos = data.filter(repo => repo.fork && repo.name.startsWith('project-')) + + forkedRepos.sort(function (oldestRepo, newestRepo) { + return new Date(newestRepo.pushed_at) - new Date(oldestRepo.pushed_at); + }); forkedRepos.forEach(repo => fetch(`https://api.github.com/repos/${USER}/${repo.name}/commits`) @@ -61,7 +68,7 @@ const getRepos = () => {
${newProjectName}
-

Most recent edit: ${latestCommit}

+

Most recent push: ${latestCommit}

Default branch: ${repo.default_branch}

(commits yet to be displayed)

diff --git a/code/style.css b/code/style.css index 0cd8534e..ec95ee0d 100644 --- a/code/style.css +++ b/code/style.css @@ -286,7 +286,7 @@ chart { } } -@media (min-width: 1025px) { +@media (min-width: 1024px) { .profile-wrapper { width: 25%; } From 2d7000cb327d0991c67ea53ab8665f72b0f17829 Mon Sep 17 00:00:00 2001 From: elsisco Date: Fri, 15 Oct 2021 17:41:42 +0200 Subject: [PATCH 11/15] changed wrap of project cards to be left aligned on desktop and added an svg for the header --- code/assets/github-tracker.svg | 115 +++++++++++++++++++++++++++++++++ code/index.html | 2 +- code/style.css | 21 ++---- 3 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 code/assets/github-tracker.svg diff --git a/code/assets/github-tracker.svg b/code/assets/github-tracker.svg new file mode 100644 index 00000000..a5026623 --- /dev/null +++ b/code/assets/github-tracker.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/code/index.html b/code/index.html index d6ab255c..6604db50 100644 --- a/code/index.html +++ b/code/index.html @@ -15,7 +15,7 @@
-

GitHub Tracker

+
diff --git a/code/style.css b/code/style.css index ec95ee0d..57358e09 100644 --- a/code/style.css +++ b/code/style.css @@ -56,7 +56,7 @@ a:hover { height: 58px; max-width: 1024px; display: flex; - align-items: flex-start; + align-items: center; justify-content: center; margin: 0 auto; background-color: #56B093; @@ -64,19 +64,8 @@ a:hover { box-shadow: 0px 3px 4px 0 rgba(0, 0, 0, 0.15); } -.header-text { - font-family: 'Playfair Display', 'serif'; - font-weight: 700; - font-size: 25px; - color: white; - margin: 10px 0 15px 0; - /* background-color: grey; - color: transparent; - text-shadow: 0px 2px 3px rgba(255,255,255,0.5); - -webkit-background-clip: text; - -moz-background-clip: text; - background-clip: text; - margin: 20px; */ +.header img { + width: 80%; } .main-wrapper { @@ -289,6 +278,7 @@ chart { @media (min-width: 1024px) { .profile-wrapper { width: 25%; + margin-right: 10px; } .projects-wrapper { @@ -298,13 +288,12 @@ chart { .projects { display: flex; flex-direction: row; - justify-content: space-evenly; flex-wrap: wrap; padding-bottom: 20px; } .project-card { width: 40%; - margin: 15px 0 0 0; + margin: 15px 10px 5px 10px; } } \ No newline at end of file From 10b80f73818b0a3db15cb6f0fbcf2d049aeb0903 Mon Sep 17 00:00:00 2001 From: elsisco Date: Mon, 25 Oct 2021 15:19:21 +0200 Subject: [PATCH 12/15] updated portfolio link --- code/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/script.js b/code/script.js index 02482887..36fb6595 100644 --- a/code/script.js +++ b/code/script.js @@ -20,7 +20,7 @@ const getUser = () => {
${data.name}
${data.login}
- +
From 2171191f4a58643a3fce35bdd15362341cc800ff Mon Sep 17 00:00:00 2001 From: elsisco Date: Sat, 13 Nov 2021 13:52:00 +0100 Subject: [PATCH 13/15] updated progress bar --- .DS_Store | Bin 6148 -> 6148 bytes README.md | 2 +- code/.DS_Store | Bin 6148 -> 6148 bytes code/style.css | 25 ++++++++++++------------- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.DS_Store b/.DS_Store index 74fcd77983d6fe015b3241c531f8a1b34e10d5a6..f38f4d7873e7206daf5cc7667a2d310fe27b93fb 100644 GIT binary patch delta 128 zcmZoMXffEJ#uPi9kAZ=Kg+Y%YogtH8Uv0(E=<}#Lv1#FwyIsWnk073>Kga7~l delta 128 zcmZoMXffEJ#uOWo$-uzC!l1{H&XCDalAG`1l9ZF51Qg?V>a<4qN6TSHRQVLV@&y@& r!O8i#1wcJOQxhgPGp%A~e6nV;0do|i!RCp~Wh@g5*fz6s{N)D#qWvRp diff --git a/README.md b/README.md index b26198af..222e419c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This is my version of a GitHub Tracker. It's a webpage that displays my profile ## The problem -I started out by studying the project breif and getting familiar to the use of the GitHub API's as I started to add code to the project. I finished the projects requirements and added extra features. The extra features includes the formatting of the fetched project name, adding the language percentage for each project and links to view the projects live. +I started out by studying the project brief and getting familiar to the use of the GitHub API's as I started to add code to the project. I finished the projects requirements and added extra features. The extra features includes the formatting of the fetched project name, adding the language percentage for each project and links to view the projects live. This project opened up my eyes to the clever use of dynamic id's. By using it I was able to keep the functions separate and invoking them with arguments in the main function (getRepos) instead of having to collect them all in the main function in a "waterfall" structure to access the values of the variables inside. diff --git a/code/.DS_Store b/code/.DS_Store index ce4580b23e3b82642061dee83e9aa7ac51a0af74..01a692b62c1249f9638053a935fd6532548b7478 100644 GIT binary patch delta 78 zcmZoMXffEJ#mIDg+hiR^88!(wDT&uTll>Uw)FI5njtmS8Yz&DE#Xy+KP{L4LkYN~{ boS$0&6lY*y{IGc;V;bAU2ENVg9Dn%%YZ?|I delta 78 zcmZoMXffEJ#mF?>Zn6%e4BMGI?`3Z^PxfP!Q-?4QJ2EgZurVYu6a!%@LkUB1L55*) ca(-?BP@I8*al__?jA?8W8~8S}bNuB803aP1NdN!< diff --git a/code/style.css b/code/style.css index 57358e09..5fd67744 100644 --- a/code/style.css +++ b/code/style.css @@ -1,10 +1,10 @@ body { - font-family: 'Roboto', 'sans-serif'; + font-family: "Roboto", "sans-serif"; box-sizing: border-box; width: 100%; height: 100%; margin: 0; - background-image: url('./assets/background.png'); + background-image: url("./assets/background.png"); background-repeat: no-repeat; background-attachment: fixed; background-size: cover; @@ -17,7 +17,7 @@ a { } a:hover { - color: #56B093; + color: #56b093; } .text { @@ -29,7 +29,7 @@ a:hover { } .project-headline { - font-family: 'Playfair Display', 'serif'; + font-family: "Playfair Display", "serif"; font-size: 22px; margin: 7px 0 4px 0; } @@ -59,7 +59,7 @@ a:hover { align-items: center; justify-content: center; margin: 0 auto; - background-color: #56B093; + background-color: #56b093; border-radius: 0 0 10px 10px; box-shadow: 0px 3px 4px 0 rgba(0, 0, 0, 0.15); } @@ -157,22 +157,22 @@ chart { .progress { display: flex; width: 85%; + border-radius: 10px; + overflow: hidden; } .progress-js { height: 10px; - border-radius: 0 10px 10px 0; - background-color: #F59B99; + background-color: #f59b99; } .progress-css { height: 10px; - background-color: #EBBC4E; + background-color: #ebbc4e; } .progress-html { height: 10px; - border-radius: 10px 0 0 10px; - background-color: #56B093; + background-color: #56b093; } .the-languages { @@ -210,10 +210,9 @@ chart { margin-right: 15px; } - .footer { width: 100%; - background-color: #56B093; + background-color: #56b093; color: white; margin: 0 auto; padding: 10px; @@ -296,4 +295,4 @@ chart { width: 40%; margin: 15px 10px 5px 10px; } -} \ No newline at end of file +} From 5ee880bff3681365948cc6fdf40bff533c49a969 Mon Sep 17 00:00:00 2001 From: elsisco Date: Mon, 6 Dec 2021 13:58:35 +0100 Subject: [PATCH 14/15] added sorting to API_REPOS --- .vscode/settings.json | 24 ++++++- code/script.js | 160 +++++++++++++++++++++++------------------- 2 files changed, 109 insertions(+), 75 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index c247e175..f336de0c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,23 @@ { - "liveServer.settings.port": 5506 -} \ No newline at end of file + "liveServer.settings.port": 5506, + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#fbed80", + "activityBar.activeBorder": "#06b9a5", + "activityBar.background": "#fbed80", + "activityBar.foreground": "#15202b", + "activityBar.inactiveForeground": "#15202b99", + "activityBarBadge.background": "#06b9a5", + "activityBarBadge.foreground": "#15202b", + "sash.hoverBorder": "#fbed80", + "statusBar.background": "#f9e64f", + "statusBar.foreground": "#15202b", + "statusBarItem.hoverBackground": "#f7df1e", + "statusBarItem.remoteBackground": "#f9e64f", + "statusBarItem.remoteForeground": "#15202b", + "titleBar.activeBackground": "#f9e64f", + "titleBar.activeForeground": "#15202b", + "titleBar.inactiveBackground": "#f9e64f99", + "titleBar.inactiveForeground": "#15202b99" + }, + "peacock.color": "#f9e64f" +} diff --git a/code/script.js b/code/script.js index 36fb6595..82b24e9d 100644 --- a/code/script.js +++ b/code/script.js @@ -1,7 +1,7 @@ const USER = 'elsisco' let repoName = 'project-weather-app' // Default value -const API_REPOS = `https://api.github.com/users/${USER}/repos` +const API_REPOS = `https://api.github.com/users/${USER}/repos?sort=pushed` const API_USER = `https://api.github.com/users/${USER}` const projectsContainer = document.getElementById('projects') @@ -9,11 +9,11 @@ const profileContainer = document.getElementById('profile') // Fetch content for profile section const getUser = () => { - fetch(API_USER) - .then(res => res.json()) - .then(data => { - // Profile content - profileContainer.innerHTML += /*html*/ ` + fetch(API_USER) + .then((res) => res.json()) + .then((data) => { + // Profile content + profileContainer.innerHTML += /*html*/ `
@@ -29,42 +29,48 @@ const getUser = () => {
${data.bio}
` - }) + }) } // Fetch content for projects section const getRepos = () => { - fetch(API_REPOS) - .then(res => res.json()) - .then(data => { - - console.log(data) - // Filtering the Technigo project repos - const forkedRepos = data.filter(repo => repo.fork && repo.name.startsWith('project-')) - - forkedRepos.sort(function (oldestRepo, newestRepo) { - return new Date(newestRepo.pushed_at) - new Date(oldestRepo.pushed_at); - }); - - forkedRepos.forEach(repo => - fetch(`https://api.github.com/repos/${USER}/${repo.name}/commits`) - .then(res => res.json()) - .then(data => { - // Formatting the title of projects to start all words with capital letter - let projectName = `${repo.name}` - - const formattedProjectName = projectName.split("-") - for (let i = 0; i < formattedProjectName.length; i++) { - formattedProjectName[i] = formattedProjectName[i][0].toUpperCase() + formattedProjectName[i].substr(1); - } - - let newProjectName = formattedProjectName.join(" ") - - // Date for most recent update of project - let latestCommit = new Date(repo.pushed_at).toLocaleString("en-ZA", { dateStyle: 'short' }) - - // Adding content to the projects - projectsContainer.innerHTML += /*html*/ ` + fetch(API_REPOS) + .then((res) => res.json()) + .then((data) => { + console.log(data) + // Filtering the Technigo project repos + const forkedRepos = data.filter( + (repo) => repo.fork && repo.name.startsWith('project-') + ) + + // forkedRepos.sort(function (oldestRepo, newestRepo) { + // return new Date(newestRepo.pushed_at) - new Date(oldestRepo.pushed_at) + // }) + + forkedRepos.forEach((repo) => + fetch(`https://api.github.com/repos/${USER}/${repo.name}/commits`) + .then((res) => res.json()) + .then((data) => { + // Formatting the title of projects to start all words with capital letter + let projectName = `${repo.name}` + + const formattedProjectName = projectName.split('-') + for (let i = 0; i < formattedProjectName.length; i++) { + formattedProjectName[i] = + formattedProjectName[i][0].toUpperCase() + + formattedProjectName[i].substr(1) + } + + let newProjectName = formattedProjectName.join(' ') + + // Date for most recent update of project + let latestCommit = new Date(repo.pushed_at).toLocaleString( + 'en-ZA', + { dateStyle: 'short' } + ) + + // Adding content to the projects + projectsContainer.innerHTML += /*html*/ `
${newProjectName}
@@ -91,57 +97,65 @@ const getRepos = () => {
` - calculateLanguagePercentage(repo) - }) - ) - fetchPullRequestsArray(forkedRepos); - drawChart(forkedRepos.length) - }) + calculateLanguagePercentage(repo) + }) + ) + fetchPullRequestsArray(forkedRepos) + drawChart(forkedRepos.length) + }) } // A calculator for percentage of language per project const calculateLanguagePercentage = (repo) => { - fetch(`https://api.github.com/repos/${USER}/${repo.name}/languages`) - .then(res => res.json()) - .then(language => { - const html = language.HTML || 0; - const css = language.CSS || 0; - const js = language.JavaScript || 0; - const sum = html + css + js; - - const htmlPercentage = ((html / sum) * 100).toFixed(1); - const cssPercentage = ((css / sum) * 100).toFixed(1); - const jsPercentage = ((js / sum) * 100).toFixed(1); - - document.getElementById(`progress-${repo.name}`).innerHTML = /*html*/ ` + fetch(`https://api.github.com/repos/${USER}/${repo.name}/languages`) + .then((res) => res.json()) + .then((language) => { + const html = language.HTML || 0 + const css = language.CSS || 0 + const js = language.JavaScript || 0 + const sum = html + css + js + + const htmlPercentage = ((html / sum) * 100).toFixed(1) + const cssPercentage = ((css / sum) * 100).toFixed(1) + const jsPercentage = ((js / sum) * 100).toFixed(1) + + document.getElementById(`progress-${repo.name}`).innerHTML = /*html*/ `
` - }) + }) } // Fetch all pull requests per project const fetchPullRequestsArray = (allRepositories) => { - allRepositories.forEach(repo => { - fetch(`https://api.github.com/repos/Technigo/${repo.name}/pulls?per_page=100`) - .then(res => res.json()) - .then((data) => { - // Hard coded the || below to get the commits for Project Chatbot for which I was not a collaborator - const myPullRequests = data.find((pull) => pull.user.login === repo.owner.login || pull.user.login === 'Svempolin' && pull.number === 67) - fetchCommits(myPullRequests.commits_url, repo.name) - }) - }) + allRepositories.forEach((repo) => { + fetch( + `https://api.github.com/repos/Technigo/${repo.name}/pulls?per_page=100` + ) + .then((res) => res.json()) + .then((data) => { + // Hard coded the || below to get the commits for Project Chatbot for which I was not a collaborator + const myPullRequests = data.find( + (pull) => + pull.user.login === repo.owner.login || + (pull.user.login === 'Svempolin' && pull.number === 67) + ) + fetchCommits(myPullRequests.commits_url, repo.name) + }) + }) } // Fetching all the commits connected to the username const fetchCommits = (myCommitsUrl, myRepoName) => { - fetch(myCommitsUrl) - .then(res => res.json()) - .then((data) => { - document.getElementById(`commits-${myRepoName}`).innerHTML = `${data.length} commits` - }) + fetch(myCommitsUrl) + .then((res) => res.json()) + .then((data) => { + document.getElementById( + `commits-${myRepoName}` + ).innerHTML = `${data.length} commits` + }) } getUser() -getRepos() \ No newline at end of file +getRepos() From 14cc3badc5d7cf30bac7f5542b26d5a489faec28 Mon Sep 17 00:00:00 2001 From: elsisco Date: Sun, 12 Dec 2021 22:46:24 +0100 Subject: [PATCH 15/15] fixed sorting of repos --- code/script.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/script.js b/code/script.js index 82b24e9d..7952a004 100644 --- a/code/script.js +++ b/code/script.js @@ -1,7 +1,8 @@ const USER = 'elsisco' let repoName = 'project-weather-app' // Default value -const API_REPOS = `https://api.github.com/users/${USER}/repos?sort=pushed` +const API_REPOS = `https://api.github.com/users/${USER}/repos` +// const API_REPOS_PUSHED = `https://api.github.com/users/${USER}/repos?sort=pushed` const API_USER = `https://api.github.com/users/${USER}` const projectsContainer = document.getElementById('projects') @@ -43,11 +44,12 @@ const getRepos = () => { (repo) => repo.fork && repo.name.startsWith('project-') ) + const sortedRepos = forkedRepos.sort((a, b) => (a.name > b.name ? 1 : -1)) // forkedRepos.sort(function (oldestRepo, newestRepo) { // return new Date(newestRepo.pushed_at) - new Date(oldestRepo.pushed_at) // }) - forkedRepos.forEach((repo) => + sortedRepos.forEach((repo) => fetch(`https://api.github.com/repos/${USER}/${repo.name}/commits`) .then((res) => res.json()) .then((data) => {