Added academy namespace
diff --git a/erpnext/public/js/education/academy/academy.js b/erpnext/public/js/education/academy/academy.js
index 08cfc37..961dc39 100644
--- a/erpnext/public/js/education/academy/academy.js
+++ b/erpnext/public/js/education/academy/academy.js
@@ -7,131 +7,110 @@
 
 Vue.use(VueRouter)
 
-
-
-
-frappe.provide('academy')
-
-frappe.utils.make_event_emitter(academy);
-
-academy.store = {
-	debug: true,
+var store = {
 	isLogin: false,
 	completedCourses: new Set(),
 	enrolledPrograms: new Set(),
-	enrolledCourses: {},
-
-	addCompletedCourses (courseName){
-		if (this.debug) console.log('addCompletedCourses triggered with', courseName)
-		this.completedCourses.add(courseName)
-	},
-
-	checkCourseCompletion (courseName){
-		return this.completedCourses.has(courseName)
-	},
-
-	checkProgramEnrollment (programName){
-		return this.enrolledPrograms.has(programName)
-	},
-
-	checkCourseEnrollment (courseName){
-		course = new Set(Object.keys(enrolledCourses))
-		return course.has(courseName)
-	},
-
-	updateEnrolledPrograms (){
-		if (this.debug) console.log('Updating enrolledPrograms')
-		frappe.call({
-			method: "erpnext.www.academy.get_program_enrollments",
-			args:{
-				email: frappe.session.user
-			}
-		}).then( r => {
-			if(r.message){
-				for(var ii=0; ii < r.message.length; ii++){
-					this.enrolledPrograms.add(r.message[ii])
-				}
-			}
-		})
-		if (this.debug) console.log('Updated State', this.enrolledPrograms)
-	},
-
-	updateEnrolledCourses (){
-		if (this.debug) console.log('Updating enrolledCourses')
-		frappe.call({
-			method: "erpnext.www.academy.get_course_enrollments",
-			args:{
-				email: frappe.session.user
-			}
-		}).then( r => {
-			this.enrolledCourses = r.message
-		})
-		if (this.debug) console.log('Updated State', this.enrolledCourses)
-	},
-
-	updateCompletedCourses (){
-		if (this.debug) console.log('Updating States')
-		frappe.call({
-			method: "erpnext.www.academy.get_completed_courses",
-			args:{
-				email: frappe.session.user
-			}
-		}).then( r => {
-			if(r.message){
-				for(var ii=0; ii < r.message.length; ii++){
-					this.completedCourses.add(r.message[ii])
-				}
-			}
-		})
-		if (this.debug) console.log('Updated State', this.completedCourses)
-	},
-
-	checkLogin (){
-		if(frappe.session.user === "Guest"){
-			if (this.debug) console.log('No Session')
-			this.isLogin = false
-		}
-		else {
-			if (this.debug) console.log('Current User: ', frappe.session.user)
-			this.isLogin = true
-		}
-		return this.isLogin
-	},
-
-	updateState (){
-		this.updateCompletedCourses()
-		this.updateEnrolledPrograms()
-		this.updateEnrolledCourses()
-		this.checkLogin()
-	},
+	enrolledCourses: {}
 }
 
 frappe.ready(() => {
-	window.v = new Vue({
-		el: "#academy",
+	frappe.provide('academy')
+	// frappe.utils.make_event_emitter(academy);
+
+	academy.store = new Vue({
+		data: store,
+		methods: {
+			addCompletedCourses (courseName){
+				if (academy.debug) console.log('addCompletedCourses triggered with', courseName)
+				this.completedCourses.add(courseName)
+			},
+
+			checkCourseCompletion (courseName){
+				return this.completedCourses.has(courseName)
+			},
+
+			checkProgramEnrollment (programName){
+				return this.enrolledPrograms.has(programName)
+			},
+
+			checkCourseEnrollment (courseName){
+				course = new Set(Object.keys(enrolledCourses))
+				return course.has(courseName)
+			},
+
+			updateEnrolledPrograms (){
+				if (academy.debug) console.log('Updating enrolledPrograms')
+				academy.call("get_program_enrollments").then(data => {
+					data.forEach(element => {
+						this.enrolledPrograms.add(element)
+					})
+				});
+				if (academy.debug) console.log('Updated State', this.enrolledPrograms)
+			},
+
+			updateEnrolledCourses (){
+				if (academy.debug) console.log('Updating enrolledCourses')
+				frappe.call({
+					method: "erpnext.www.academy.get_course_enrollments",
+					args:{
+						email: frappe.session.user
+					}
+				}).then( r => {
+					this.enrolledCourses = r.message
+				})
+				if (academy.debug) console.log('Updated State', this.enrolledCourses)
+			},
+
+			updateCompletedCourses (){
+				if (academy.debug) console.log('Updating States')
+				frappe.call({
+					method: "erpnext.www.academy.get_completed_courses",
+					args:{
+						email: frappe.session.user
+					}
+				}).then( r => {
+					if(r.message){
+						for(var ii=0; ii < r.message.length; ii++){
+							this.completedCourses.add(r.message[ii])
+						}
+					}
+				})
+				if (academy.debug) console.log('Updated State', this.completedCourses)
+			},
+
+			checkLogin (){
+				if(frappe.session.user === "Guest"){
+					if (academy.debug) console.log('No Session')
+					this.isLogin = false
+				}
+				else {
+					if (academy.debug) console.log('Current User: ', frappe.session.user)
+					this.isLogin = true
+				}
+				return this.isLogin
+			},
+
+			updateState (){
+				this.updateCompletedCourses()
+				this.updateEnrolledPrograms()
+				this.updateEnrolledCourses()
+				this.checkLogin()
+			},
+		}
+	});
+
+	academy.view = new Vue({
+		el: "#academy-app",
 		router: new VueRouter({ routes }),
 		template: "<academy-root/>",
 		components: { AcademyRoot },
 		created: function() {
-			if(store.checkLogin()){
-				store.updateState()
+			if(academy.store.checkLogin()){
+				academy.store.updateState()
 			}
 		}
 	});
-	academy.store = new Vue({
-		data: store,
-		methods: {
-			checkLogin (){
-				if(frappe.session.user === "Guest"){
-					if (this.debug) console.log('No Session')
-					this.isLogin = false
-				}
-				else {
-					if (this.debug) console.log('Current User: ', frappe.session.user)
-					this.isLogin = true
-				}
-				return this.isLogin
-			}
-		}
-	});
+
+	academy.debug = true
 })
\ No newline at end of file
diff --git a/erpnext/public/js/education/academy/call.js b/erpnext/public/js/education/academy/call.js
index 108a6e1..64f914d 100644
--- a/erpnext/public/js/education/academy/call.js
+++ b/erpnext/public/js/education/academy/call.js
@@ -1,13 +1,15 @@
-frappe.provide('academy');
+frappe.ready(() => {
+    frappe.provide('academy');
 
-academy.call = (method, args) => {
-    const method_path = 'erpnext.www.academy.' + method;
-    return new Promise((resolve, reject) => {
-        return frappe.call({
-            method: method_path,
-            args,
-        })
-        .then(r => resolve(r.message))
-        .fail(reject)
-    });
-}
\ No newline at end of file
+    academy.call = (method, args) => {
+        const method_path = 'erpnext.www.academy.' + method;
+        return new Promise((resolve, reject) => {
+            return frappe.call({
+                method: method_path,
+                args,
+            })
+            .then(r => resolve(r.message))
+            .fail(reject)
+        });
+    }
+});
\ No newline at end of file
diff --git a/erpnext/public/js/education/academy/components/AcademyProgramCard.vue b/erpnext/public/js/education/academy/components/AcademyProgramCard.vue
index ef3ac08..bea2acf 100644
--- a/erpnext/public/js/education/academy/components/AcademyProgramCard.vue
+++ b/erpnext/public/js/education/academy/components/AcademyProgramCard.vue
@@ -10,65 +10,61 @@
         </div>
         <div class='card-footer text-right'>
             <!-- <a class='video-btn btn btn-secondary btn-sm' data-toggle="modal" data-src=" insert jinja stuff here " data-target="#myModal">Watch Intro</a>&nbsp;&nbsp; -->
-            <a v-if="this.$root.$data.isLogin" class='btn btn-secondary btn-sm' @click="primaryAction()">{{ buttonName }}</a>
+            <a-button
+                    v-if="enrolled"
+                    type="primary"
+                    size="sm"
+                    :route="programPageRoute"
+                >
+                    {{ buttonName }}
+            </a-button>
+            <a v-else-if="isLogin" class='btn btn-secondary btn-sm' @click="enroll()">Enroll</a>
             <a v-else class='btn btn-secondary btn-sm' href="/login#signup">Sign Up</a>
         </div>
     </div>
 </div>
 </template>
 <script>
+import AButton from './Button.vue';
 export default {
-    props: ['program_code'],
+    props: ['program', 'enrolled'],
     name: "AcademyProgramCard",
     data() {
     	return {
-    		program: ''
+            isLogin: academy.store.isLogin
     	};
     },
-    mounted() {
-    	frappe.call({
-            method: "erpnext.www.academy.get_program_details",
-            args: {
-                program_name: this.program_code
-            }
-        }).then(r => {
-    		this.program = r.message
-    	})
+    created() {
     },
     methods: {
-        primaryAction(){
-            if(this.$root.$data.isLogin){
-                if(this.$root.$data.checkProgramEnrollment(this.program_code)){
-                    this.$router.push('/Program/' + program.name)
-                }
-                else {
-                    this.enroll()
-                }
-            }
-        },
         enroll() {
-            frappe.call({
-                method: "erpnext.www.academy.enroll_in_program",
-                args:{
-                    program_name: this.program_code,
-                    student_email_id: frappe.session.user
-                }
-            })
-            this.$root.$data.enrolledPrograms.add(this.program_code)
-            this.$root.$data.updateEnrolledPrograms()
+            academy.call('enroll_in_program', {
+                program_name: this.program.name,
+            }).then(
+                academy.store.enrolledPrograms.add(this.program.name),
+                academy.store.updateEnrolledPrograms(),
+                this.router.push('Program/' + this.program.name)
+            )
         }
     },
     computed: {
         buttonName() {
-            if(this.$root.$data.isLogin){
-                if(this.$root.$data.checkProgramEnrollment(this.program_code)){
+                if(this.enrolled){
                     return "Start Course"
                 }
                 else {
                     return "Enroll"
                 }
-            }
+        },
+        programPageRoute() {
+            return `Program/${this.program.name}`
+        },
+        isEnrolled() {
+            return academy.store.enrolledPrograms.has(this.program.name)
         }
+    },
+    components: {
+        AButton
     }
 };
 </script>
diff --git a/erpnext/public/js/education/academy/pages/AcademyHome.vue b/erpnext/public/js/education/academy/pages/AcademyHome.vue
index 630573a..e590745 100644
--- a/erpnext/public/js/education/academy/pages/AcademyHome.vue
+++ b/erpnext/public/js/education/academy/pages/AcademyHome.vue
@@ -1,10 +1,10 @@
 <template>
 <div>
-	<AcademyTopSection :title="title" :description="description">
+	<AcademyTopSection :title="portal.title" :description="portal.description">
         <AcademyTopSectionButton/>
     </AcademyTopSection>
 	<AcademyList :title="'Featured Programs'" :description="'Master ERPNext'">
-        <AcademyProgramCard v-for="program in featured_programs" :key="program.name" :program_code="program"/>
+        <AcademyProgramCard v-for="item in featuredPrograms" :key="item.program.name" :program="item.program" :enrolled="item.is_enrolled"/>
     </AcademyList>
 </div>
 </template>
@@ -18,9 +18,9 @@
     name: "AcademyHome",
     data() {
     	return{
-    		title: '',
-    		description: '',
-            featured_programs: []
+    		portal: {},
+            featuredPrograms: [],
+            // enrolledPrograms: new Set()
     	}
     },
     components: {
@@ -28,15 +28,28 @@
         AcademyList,
         AcademyProgramCard,
         AcademyTopSectionButton
-	},
-	mounted() {
-    	frappe.call("erpnext.www.academy.get_portal_details").then(r => {
-    		this.title = r.message.title,
-    		this.description = r.message.description
-    	});
-        frappe.call("erpnext.www.academy.get_featured_programs").then(r => {
-            this.featured_programs = r.message
-        });
     },
+    beforeMount() {
+        // this.updateEnrolledPrograms().then(data => {
+        //     data.forEach(element => {
+        //         this.enrolledPrograms.add(element)
+        //     })
+        // });
+    },
+	mounted() {
+        this.getPortalDetails().then(data => this.portal = data);
+        this.getFeaturedPrograms().then(data => this.featuredPrograms = data);
+    },
+    methods: {
+        // updateEnrolledPrograms(){
+        //     return academy.call("get_program_enrollments")
+        // },
+        getPortalDetails() {
+            return academy.call("get_portal_details")
+        },
+        getFeaturedPrograms() {
+            return academy.call("get_featured_programs")
+        }
+    }
 };
 </script>
\ No newline at end of file
diff --git a/erpnext/public/js/education/academy/routes.js b/erpnext/public/js/education/academy/routes.js
index 51c280d..7896b1d 100644
--- a/erpnext/public/js/education/academy/routes.js
+++ b/erpnext/public/js/education/academy/routes.js
@@ -1,6 +1,6 @@
-import AcademyHome from "./academy/pages/AcademyHome.vue";
-import AcademyProgramPage from "./academy/pages/AcademyProgramPage.vue";
-import AcademyCoursePage from "./academy/pages/AcademyCoursePage.vue";
+import AcademyHome from "./pages/AcademyHome.vue";
+import AcademyProgramPage from "./pages/AcademyProgramPage.vue";
+import AcademyCoursePage from "./pages/AcademyCoursePage.vue";
 
 const routes = [
 	{name: 'home', path: '', component: AcademyHome},
diff --git a/erpnext/www/academy.html b/erpnext/www/academy.html
index 9d3cec8..f078b36 100644
--- a/erpnext/www/academy.html
+++ b/erpnext/www/academy.html
@@ -3,6 +3,6 @@
 {% block title %}{{ heading or "Academy"}}{% endblock %}
 
 {% block page_content %}
-<div id="academy"></div>
+<div id="academy-app"></div>
 <script type="text/javascript" src="/assets/js/academy.min.js"></script>
 {% endblock %}
\ No newline at end of file