11<template >
22 <v-responsive >
33 <Loading v-if =" this.userData === null" loadingComponentChoice =" Dots" />
4- <v-card v-else class =" card" >
5- <div >
6- <img
7- :src =" this.userData.avatar_url"
8- :alt =" this.userData.name"
9- class =" avatar"
10- />
11- </div >
12- <div class =" user-info" >
13- <h2 >{{ this.userData.name }}</h2 >
14- <p >{{ this.userData.bio }}</p >
15- <ul >
16- <li ><strong >Followers </strong > : {{ this.userData.followers }}</li >
17- <li ><strong >Following </strong > : {{ this.userData.following }}</li >
18- <li >
19- <strong >Repositories </strong > : {{ this.userData.public_repos }}
20- </li >
21- </ul >
22- <ul class =" second-desc" >
23- <li v-if =" this.userData.twitter_username" >
24- <strong >Twitter</strong > : {{ this.userData.twitter_username }}
25- </li >
26- <li v-if =" this.userData.location" >
27- <strong >Location</strong > : {{ this.userData.location }}
28- </li >
29- </ul >
30- <ul >
31- <!-- make date look normal -->
32- <li v-if =" this.userData.created_at" >
33- <strong >Created</strong > : {{ this.userData.created_at }}
34- </li >
4+ <div v-else class =" flex-row" >
5+ <div class =" card" >
6+ <div class =" flex-column no-wrap" >
7+ <img
8+ :src =" this.userData.avatar_url"
9+ :alt =" this.userData.name"
10+ class =" avatar"
11+ />
3512 <v-btn
36- class = " margin-left "
13+ variant = " plain "
3714 v-if =" this.userData.blog"
3815 :href =" this.userData.blog"
16+ target =" _blank"
3917 >Visit Blog</v-btn
4018 >
41- </ul >
42- <Loading v-if =" this.userRepos === null" loadingComponentChoice =" Dots" />
43- <div v-else class =" repos" >
44- <a
45- v-for =" repo in this.userRepos"
46- :key =" repo.id"
47- :href =" repo.html_url"
19+ </div >
20+ <div class =" user-info" >
21+ <h2 >{{ this.userData.name }}</h2 >
22+ <p class =" margin-bottom" >{{ this.userData.bio }}</p >
23+ <ul class =" margin-bottom" >
24+ <li ><strong >Followers </strong > : {{ this.userData.followers }}</li >
25+ <li ><strong >Following </strong > : {{ this.userData.following }}</li >
26+ <li >
27+ <strong >Repositories </strong > :
28+ {{ this.userData.public_repos }}
29+ </li >
30+ </ul >
31+ <ul class =" second-desc margin-bottom" >
32+ <li v-if =" this.userData.location" >
33+ <strong >Location</strong > : {{ this.userData.location }}
34+ </li >
35+ </ul >
36+ <ul class =" margin-bottom" >
37+ <li v-if =" this.userData.created_at" >
38+ <strong >Created</strong > : {{ this.userData.created_at }}
39+ </li >
40+ </ul >
41+ <Loading
42+ v-if =" this.userRepos === null"
43+ loadingComponentChoice =" Dots"
44+ />
45+ <v-chip-group v-else class =" flex-row" >
46+ <v-chip
47+ v-for =" repo in this.userRepos"
48+ :key =" repo.id"
49+ :href =" repo.html_url"
50+ target =" _blank"
51+ >{{ repo.name }}</v-chip
52+ >
53+ </v-chip-group >
54+ </div >
55+ <div class =" external-buttons-column margin-right-auto" >
56+ <v-btn
57+ variant =" plain"
58+ icon =" mdi-github"
59+ class =" card-external-buttons"
60+ v-if =" this.userData.html_url"
61+ :href =" this.userData.html_url"
4862 target =" _blank"
49- class =" repo"
50- >{{ repo.name }}</a
51- >
63+ ></v-btn >
64+ <v-btn
65+ variant =" plain"
66+ icon =" mdi-chart-donut"
67+ class =" card-external-buttons"
68+ target =" _blank"
69+ @click =" openPieChartModal"
70+ ></v-btn >
71+ <v-btn
72+ variant =" plain"
73+ icon =" mdi-chart-bar"
74+ class =" card-external-buttons"
75+ target =" _blank"
76+ ></v-btn >
77+ <v-btn
78+ variant =" plain"
79+ icon =" mdi-twitter"
80+ class =" card-external-buttons"
81+ v-if =" this.userData.twitter_username"
82+ :href =" 'https://twitter.com/' + this.userData.twitter_username"
83+ target =" _blank"
84+ ></v-btn >
5285 </div >
53-
54- <div id =" repos" ></div >
5586 </div >
56- </v-card >
87+ </div >
5788 </v-responsive >
89+ <PieChartModal
90+ v-if =" this.pieChartModalOpen"
91+ :username =" this.username"
92+ :reload-watcher =" this.reloadWatcher"
93+ ref =" pieChartModal"
94+ />
5895</template >
5996
6097<script >
98+ import PieChartModal from " ../modals/PieChartModal.vue" ;
6199import Loading from " ./Loading.vue" ;
62100import moment from " moment" ;
63101
64102export default {
65103 name: " user-component" ,
66104 components: {
67105 Loading,
106+ PieChartModal,
68107 },
69108 props: {
70109 username: {
@@ -77,7 +116,7 @@ export default {
77116 },
78117 },
79118 data : function () {
80- return { userData: null , userRepos: null };
119+ return { userData: null , userRepos: null , pieChartModalOpen : false };
81120 },
82121 mounted () {
83122 console .log (" mounted" );
@@ -131,6 +170,19 @@ export default {
131170 console .error (" Error fetching data:" , error);
132171 }
133172 },
173+ scrollToPieChartModal () {
174+ this .$refs .pieChartModal .$el .scrollIntoView ({ behavior: " smooth" });
175+ },
176+ openPieChartModal () {
177+ this .pieChartModalOpen = ! this .pieChartModalOpen ;
178+
179+ // Scroll to PieChartModal when opening
180+ if (this .pieChartModalOpen ) {
181+ this .$nextTick (() => {
182+ this .scrollToPieChartModal ();
183+ });
184+ }
185+ },
134186 },
135187 watch: {
136188 reloadWatcher () {
@@ -147,21 +199,20 @@ export default {
147199 box-sizing : border-box ;
148200}
149201.card {
150- max-width : 800px ;
202+ max-width : min ( 85 vw , 800px ) ;
151203 background-color : gainsboro ;
152204 color : #000 ;
153- border-radius : 20 px ;
205+ border-radius : 30 px ;
154206 box-shadow : 0 5px 10px rgba (154 , 160 , 185 , 0.05 ),
155207 0 15px 40px rgba (0 , 0 , 0 , 0.1 );
156208 display : flex ;
157209 padding : 3rem ;
158210 font-size : 16px ;
159- margin : auto ;
160- margin-top : 20px ;
211+ margin : 20px auto ;
161212}
162213
163214.avatar {
164- border-radius : 10 % ;
215+ border-radius : 20 % ;
165216 border : 10px solid #2a2a72 ;
166217 height : 150px ;
167218 width : 150px ;
@@ -218,6 +269,45 @@ export default {
218269 margin-left : 1rem ;
219270}
220271
272+ .margin-bottom {
273+ margin-bottom : 0.3rem ;
274+ }
275+
276+ .margin-right-auto {
277+ margin-right : auto ;
278+ }
279+
280+ .external-buttons-column {
281+ position : relative ;
282+ top : -40px ;
283+ right : -115px ;
284+ display : flex ;
285+ flex-direction : column ;
286+ justify-content : flex-start ;
287+ padding : 0px 15px ;
288+ color : white ;
289+ }
290+ .card-external-buttons {
291+ margin-right : auto ;
292+ margin-bottom : 10px ;
293+ }
294+
295+ .flex-row {
296+ display : flex ;
297+ flex-direction : row ;
298+ justify-content : center ;
299+ }
300+
301+ .flex-column {
302+ display : flex ;
303+ flex-direction : column ;
304+ justify-content : center ;
305+ }
306+
307+ .no-wrap {
308+ flex-wrap : nowrap ;
309+ }
310+
221311@media (max-width : 768px ) {
222312 .card {
223313 flex-direction : column ;
@@ -232,6 +322,14 @@ export default {
232322 .user-form {
233323 max-width : 400px ;
234324 }
325+ .external-buttons-column {
326+ flex-direction : row ;
327+ color : black ;
328+ margin-top : 30px ;
329+ display : inline-block ;
330+ top : 0 ;
331+ right : 0 ;
332+ }
235333}
236334
237335@media (max-width : 450px ) {
0 commit comments