diff --git a/.gitignore b/.gitignore
index f655426..4d8dd43 100644
--- a/.gitignore
+++ b/.gitignore
@@ -91,3 +91,6 @@ backend/__pycache__/
# Config files
.prettierrc.js
+
+# Visual Studio
+/.vs
diff --git a/public/assets/badges/predefined/babysteps.png b/public/assets/badges/predefined/babysteps.png
new file mode 100644
index 0000000..a3beecf
Binary files /dev/null and b/public/assets/badges/predefined/babysteps.png differ
diff --git a/public/assets/badges/special/topcommits.png b/public/assets/badges/special/topcommits.png
new file mode 100644
index 0000000..bfb752f
Binary files /dev/null and b/public/assets/badges/special/topcommits.png differ
diff --git a/public/assets/badges/special/topmonthcommits.png b/public/assets/badges/special/topmonthcommits.png
new file mode 100644
index 0000000..bdf899e
Binary files /dev/null and b/public/assets/badges/special/topmonthcommits.png differ
diff --git a/public/assets/badges/special/topweekcommits.png b/public/assets/badges/special/topweekcommits.png
new file mode 100644
index 0000000..8332943
Binary files /dev/null and b/public/assets/badges/special/topweekcommits.png differ
diff --git a/public/assets/badges/special/topyearcommits.png b/public/assets/badges/special/topyearcommits.png
new file mode 100644
index 0000000..d8109ed
Binary files /dev/null and b/public/assets/badges/special/topyearcommits.png differ
diff --git a/public/index.html b/public/index.html
index 5de8c81..0cc3873 100644
--- a/public/index.html
+++ b/public/index.html
@@ -4,7 +4,7 @@
-
+
CodeBadge
+
= badge.min_commits && commits <= badge.max_commits) {
+ url = badgeURLPrefix + badge.badge;
+ tooltip = badge.tooltip;
+ }
+ });
+ return {url: url, tooltip: tooltip};
+ }
+
+ getBadgeFromName(name) {
+ let data = {};
+ json.forEach(function(badge) {
+ if(badge.name === name)
+ {
+ data = badge;
+ }
+ });
+ return data;
+ }
+
+ getBadgeURLPrefix()
+ {
+ return badgeURLPrefix;
+ }
+
+ getAllBadgeIDs()
+ {
+ let keys = [];
+ for(let i in json)
+ keys.push(json[i].name);
+ return keys;
+ }
+}
diff --git a/src/assets/badges/special/badges.json b/src/assets/badges/special/badges.json
new file mode 100644
index 0000000..3eaea63
--- /dev/null
+++ b/src/assets/badges/special/badges.json
@@ -0,0 +1,34 @@
+{
+ "topContributor": {
+ "badge": "topcommits.png",
+ "tooltip": "Awarded to the top contributor of your organization!",
+ "information": {
+ "title": "Top Contributor of All Time",
+ "description": "Assigned to the person who has the highest commits in your organization!"
+ }
+ },
+ "topWeekContributor": {
+ "badge": "topweekcommits.png",
+ "tooltip": "Awarded to the one with with highest commits last week!",
+ "information": {
+ "title": "Top Contributor this Week",
+ "description": "Assigned to the person who had the highest commits last week in your organization!"
+ }
+ },
+ "topMonthContributor": {
+ "badge": "topmonthcommits.png",
+ "tooltip": "Awarded to the one with with highest commits this month!",
+ "information": {
+ "title": "Top Contributor this Month",
+ "description": "Assigned to the person who has the highest commits this month in your organization!"
+ }
+ },
+ "topYearContributor": {
+ "badge": "topyearcommits.png",
+ "tooltip": "Awarded to the one with with highest commits this year!",
+ "information": {
+ "title": "Top Contributor this Year",
+ "description": "Assigned to the person who has the highest commits this year in your organization!"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/assets/badges/special/specialBadges.js b/src/assets/badges/special/specialBadges.js
new file mode 100644
index 0000000..f8a3a45
--- /dev/null
+++ b/src/assets/badges/special/specialBadges.js
@@ -0,0 +1,83 @@
+import store from "../../../store";
+import rawdata from "./badges";
+
+const json = JSON.parse(JSON.stringify(rawdata));
+const badgeURLPrefix = "/assets/badges/special/";
+
+export default class SpecialBadges {
+ getBadges(name, orgName) {
+ let badges = [];
+
+ const topCommits = store.getters.getTopCommits(orgName);
+ const topWeekCommits = store.getters.getTopWeekCommits(orgName);
+ const topMonthCommits = store.getters.getTopMonthCommits(orgName);
+ const topYearCommits = store.getters.getTopYearCommits(orgName);
+
+ //Make sure to sort in descending order of priority of display
+
+ if (topCommits[0].name === name) {
+ badges.push({
+ url: badgeURLPrefix + json["topContributor"].badge,
+ tooltip: json["topContributor"].tooltip
+ });
+ }
+
+ if (topWeekCommits[0].name === name) {
+ if (topWeekCommits[0].weeks[topWeekCommits[0].weeks.length - 1].c > 0) {
+ badges.push({
+ url: badgeURLPrefix + json["topWeekContributor"].badge,
+ tooltip: json["topWeekContributor"].tooltip
+ });
+ }
+ }
+
+ if (topMonthCommits[0].name === name) {
+ let actuallyHasCommited = false;
+ for (let week in topMonthCommits[0].weeks) {
+ if (week.c > 0) {
+ actuallyHasCommited = true;
+ break;
+ }
+ }
+ if (topMonthCommits[0].weeks.length < 4) actuallyHasCommited = false;
+ if (actuallyHasCommited)
+ badges.push({
+ url: badgeURLPrefix + json["topMonthContributor"].badge,
+ tooltip: json["topMonthContributor"].tooltip
+ });
+ }
+
+ if (topYearCommits[0].name === name) {
+ let actuallyHasCommited = false;
+ for (let week in topYearCommits[0].weeks) {
+ if (week.c > 0) {
+ actuallyHasCommited = true;
+ break;
+ }
+ }
+ if (topYearCommits[0].weeks.length < 52) actuallyHasCommited = false;
+ if (actuallyHasCommited)
+ badges.push({
+ url: badgeURLPrefix + json["topYearContributor"].badge,
+ tooltip: json["topYearContributor"].tooltip
+ });
+ }
+
+ return badges;
+ }
+
+ getBadgeFromName(name) {
+ return json[name];
+ }
+
+ getBadgePrefixURL() {
+ return badgeURLPrefix;
+ }
+
+ getAllBadgeIDs() {
+ let keys = [];
+ for(let key in json)
+ keys.push(key);
+ return keys;
+ }
+}
diff --git a/src/components/auth/Login.vue b/src/components/auth/Login.vue
index 818c837..20413cc 100644
--- a/src/components/auth/Login.vue
+++ b/src/components/auth/Login.vue
@@ -35,7 +35,6 @@ export default {
const code = window.location.href.match(/\?code=(.*)/);
if (code) {
this.isLoading = true;
- console.log(this.isLoading);
axios({
method: `post`,
url: `${AxiosHelper.gatekeeperUrl}?client_id=${
diff --git a/src/components/badgeList/BadgeListItem.vue b/src/components/badgeList/BadgeListItem.vue
new file mode 100644
index 0000000..9f17945
--- /dev/null
+++ b/src/components/badgeList/BadgeListItem.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+ {{ description }}
+
+
+
+
+
+
+
+
diff --git a/src/components/general/Toolbar.vue b/src/components/general/Toolbar.vue
index cf40562..9461e4c 100644
--- a/src/components/general/Toolbar.vue
+++ b/src/components/general/Toolbar.vue
@@ -1,6 +1,6 @@
-
+
Codebadge
@@ -15,6 +15,7 @@
\ No newline at end of file
+.org {
+ margin-bottom: 8px;
+}
+
diff --git a/src/components/home/UserDetails.vue b/src/components/home/UserDetails.vue
index 56a3c12..5f59764 100644
--- a/src/components/home/UserDetails.vue
+++ b/src/components/home/UserDetails.vue
@@ -2,11 +2,9 @@
-
-
{{userData.username}}
{{userData.githubName}}
diff --git a/src/components/org/ContributorItem.vue b/src/components/org/ContributorItem.vue
index d915048..bfde019 100644
--- a/src/components/org/ContributorItem.vue
+++ b/src/components/org/ContributorItem.vue
@@ -1,69 +1,102 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ predefinedBadge.tooltip }}
+
+
+
+
+
+
+
+ {{ badgedata.tooltip }}
+
+
-
-
-
-
+
+
\ No newline at end of file
+
diff --git a/src/components/org/Org.vue b/src/components/org/Org.vue
index 5c140ca..4ac5223 100644
--- a/src/components/org/Org.vue
+++ b/src/components/org/Org.vue
@@ -42,21 +42,6 @@ export default {
},
methods: {
loadOrg() {
- axios
- .get(`${AxiosHelper.baseUrl}/orgs/${this.name}`, {
- headers: {
- Authorization: `token ${authService.getToken()}`
- }
- })
- .then(res => {
- this.org = res.data;
- this.loadOrgRepos();
- })
- .catch(err => console.log(err));
- },
-
- //Can be done in a single call
- loadOrgRepos() {
axios
.get(`${AxiosHelper.baseUrl}/orgs/${this.name}/repos`, {
headers: {
@@ -66,11 +51,18 @@ export default {
.then(res => {
this.isLoading = false;
this.orgRepos = res.data;
+ this.org = res.data[0].owner;
})
.catch(err => console.log(err));
}
},
created() {
+ //Check if everything is actually loaded and app has not been reloaded on user end.
+ if(this.$store.state.user == '')
+ {
+ this.$router.push({ name: "homeView"});
+ }
+
this.isLoading = true;
this.loadOrg();
}
diff --git a/src/components/org/OrgContributors.vue b/src/components/org/OrgContributors.vue
new file mode 100644
index 0000000..0ad23c5
--- /dev/null
+++ b/src/components/org/OrgContributors.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/org/OrgDetails.vue b/src/components/org/OrgDetails.vue
index 593ed18..72bfed3 100644
--- a/src/components/org/OrgDetails.vue
+++ b/src/components/org/OrgDetails.vue
@@ -1,7 +1,7 @@
-
+
diff --git a/src/components/org/OrgRepos.vue b/src/components/org/OrgRepos.vue
index 02d8192..0ea8916 100644
--- a/src/components/org/OrgRepos.vue
+++ b/src/components/org/OrgRepos.vue
@@ -1,20 +1,22 @@
-
Total repo count: {{repos.length}}
+
Repositories: {{ repos.length }}
-
{{repo.name}}
-
+
+ {{ repo.name }}
+
+
\ No newline at end of file
+
diff --git a/src/router.js b/src/router.js
index 4ce53c6..353c96e 100644
--- a/src/router.js
+++ b/src/router.js
@@ -1,54 +1,63 @@
-import Vue from 'vue';
-import Router from 'vue-router';
-import AuthView from './views/AuthView';
-import HomeView from './views/HomeView';
-import NewBadge from './views/NewBadge';
-import OrgView from './views/OrgView';
-import Upload from "./views/Upload.vue";
-import AuthService from './services/authService';
+import Vue from "vue";
+import Router from "vue-router";
+import AuthView from "./views/AuthView";
+import HomeView from "./views/HomeView";
+import NewBadge from "./views/NewBadge";
+import OrgView from "./views/OrgView";
+import Upload from "./views/Upload";
+import BadgeList from "./views/BadgeView"
+
+import AuthService from "./services/authService";
+import store from "./store.js";
Vue.use(Router);
const authService = new AuthService();
export default new Router({
- routes: [{
- path: '',
- redirect: 'auth'
- },
- {
- path: "/upload",
- name: "Upload",
- component: Upload
- },
- {
- path: '/auth',
- name: 'authView',
- component: AuthView
- },
- {
- path: '/home',
- name: 'homeView',
- component: HomeView,
- beforeEnter: (to, from, next) => {
- next(authService.isLoggedIn());
- }
- },
- {
- path:'/newBadge',
- name: 'newBadge',
- component: NewBadge,
- beforeEnter: (to, from, next) => {
- next(authService.isLoggedIn());
- }
- },
- {
- path: '/org/:name',
- name: 'orgView',
- component: OrgView,
- beforeEnter: (to, from, next) => {
- next(authService.isLoggedIn());
- }
- }
- ]
+ routes: [
+ {
+ path: "",
+ redirect: "auth"
+ },
+ {
+ path: "/upload",
+ name: "Upload",
+ component: Upload
+ },
+ {
+ path: "/auth",
+ name: "authView",
+ component: AuthView
+ },
+ {
+ path: "/home",
+ name: "homeView",
+ component: HomeView,
+ beforeEnter: (to, from, next) => {
+ next(authService.isLoggedIn());
+ }
+ },
+ {
+ path: "/newBadge",
+ name: "newBadge",
+ component: NewBadge,
+ beforeEnter: (to, from, next) => {
+ next(authService.isLoggedIn());
+ }
+ },
+ {
+ path: "/org/:name",
+ name: "orgView",
+ component: OrgView,
+ beforeEnter: (to, from, next) => {
+ next(authService.isLoggedIn());
+ }
+ },
+ {
+ path: "/badges",
+ name: "badgeList",
+ component: BadgeList
+ }
+ ]
});
diff --git a/src/store.js b/src/store.js
index 9033845..ad101d5 100644
--- a/src/store.js
+++ b/src/store.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios';
+
import AxiosHelper from './config/AxiosHelper';
import AuthService from './services/authService';
@@ -11,7 +12,13 @@ const authService = new AuthService();
export default new Vuex.Store({
state: {
user: [],
- userOrgs: []
+ userOrgs: [],
+ orgCommits: [],
+ topCommits: [],
+ topWeekCommits: [],
+ topMonthCommits: [],
+ topYearCommits: [],
+ isOrgLoaded: []
},
mutations: {
SET_USER(state, user) {
@@ -19,6 +26,26 @@ export default new Vuex.Store({
},
SET_USER_ORGS(state, userOrgs) {
state.userOrgs = userOrgs;
+ },
+ SET_ORG_COMMITS(state, payload) {
+ state.orgCommits[payload.orgName] = [];
+ for(let user in payload.data)
+ state.orgCommits[payload.orgName].push(payload.data[user]);
+ },
+ SET_TOP_COMMITS(state, topCommits) {
+ state.topCommits = topCommits;
+ },
+ SET_TOP_WEEK_COMMITS(state, topWeekCommits) {
+ state.topWeekCommits = topWeekCommits;
+ },
+ SET_TOP_MONTH_COMMITS(state, topMonthCommits) {
+ state.topMonthCommits = topMonthCommits;
+ },
+ SET_TOP_YEAR_COMMITS(state, topYearCommits) {
+ state.topYearCommits = topYearCommits;
+ },
+ SET_ORG_STATUS(state, payload) {
+ state.isOrgLoaded[payload.orgName] = payload.status;
}
},
actions: {
@@ -41,6 +68,66 @@ export default new Vuex.Store({
})
.then(res => context.commit('SET_USER_ORGS', res.data))
.catch(err => console.log(err));
+ },
+ sortTopCommits(context) {
+ let topCommits = [];
+ for(const org in context.state.orgCommits)
+ {
+ let data = context.state.orgCommits[org];
+ data.sort(function(a, b) {
+ return b.total - a.total;
+ });
+ topCommits[org] = data;
+ }
+ context.commit("SET_TOP_COMMITS", topCommits)
+ },
+ sortTopWeekCommits(context) {
+ let topWeekCommits = [];
+ for(const org in context.state.orgCommits)
+ {
+ let data = context.state.orgCommits[org];
+ data.sort(function(a, b) {
+ return b.weeks[b.weeks.length - 1].c - a.weeks[a.weeks.length - 1].c;
+ });
+ topWeekCommits[org] = data;
+ }
+ context.commit("SET_TOP_WEEK_COMMITS", topWeekCommits)
+ },
+ sortTopMonthCommits(context) {
+ let topMonthCommits = [];
+ for(const org in context.state.orgCommits)
+ {
+ let data = context.state.orgCommits[org];
+ data.sort(function(a, b) {
+ let sum1 = 0, sum2 = 0;
+ let len = Math.min(a.weeks.length, b.weeks.length);
+ for(let i = len - 1; i >= len - 4 && i >= 0; i--) {
+ sum1 += a.weeks[i].c;
+ sum2 += b.weeks[i].c;
+ }
+ return sum2 - sum1;
+ });
+ topMonthCommits[org] = data;
+ }
+ context.commit("SET_TOP_MONTH_COMMITS", topMonthCommits)
+ },
+ sortTopYearCommits(context) {
+ let topYearCommits = [];
+ for(const org in context.state.orgCommits)
+ {
+ let data = context.state.orgCommits[org];
+ data.sort(function(a, b) {
+ let sum1 = 0, sum2 = 0;
+ let len = Math.min(a.weeks.length, b.weeks.length);
+ for(let i = len - 1; i >= len - 52 && i >= 0; i--) {
+ sum1 += a.weeks[i].c;
+ sum2 += b.weeks[i].c;
+ }
+ return sum2 - sum1;
+ });
+ topYearCommits[org] = data;
+ }
+ context.commit("SET_TOP_YEAR_COMMITS", topYearCommits)
}
},
getters: {
@@ -64,13 +151,32 @@ export default new Vuex.Store({
avatar: org.avatar_url
});
});
-
return orgsData;
},
//Org.vue
getOrgByName: state => name => {
return state.userOrgs.find(org => (org.login = name));
+ },
+
+ getUserOrgCommits: state => data => {
+ return state.orgCommits[data.orgName].find(user => {return user.name === data.name})
+ },
+
+ getTopCommits: state => orgName => {
+ return state.topCommits[orgName];
+ },
+
+ getTopWeekCommits: state => orgName => {
+ return state.topWeekCommits[orgName];
+ },
+
+ getTopMonthCommits: state => orgName => {
+ return state.topMonthCommits[orgName];
+ },
+
+ getTopYearCommits: state => orgName => {
+ return state.topYearCommits[orgName];
}
}
});
diff --git a/src/views/AuthView.vue b/src/views/AuthView.vue
index 74d9acb..4dd390b 100644
--- a/src/views/AuthView.vue
+++ b/src/views/AuthView.vue
@@ -1,13 +1,13 @@