Added academy namespace

This commit is contained in:
scmmishra
2018-11-09 18:25:19 +05:30
committed by Aditya Hase
parent 892b0c23fc
commit 708756ed40
6 changed files with 168 additions and 178 deletions

View File

@@ -7,131 +7,110 @@ import './call';
Vue.use(VueRouter) Vue.use(VueRouter)
var store = {
frappe.provide('academy')
frappe.utils.make_event_emitter(academy);
academy.store = {
debug: true,
isLogin: false, isLogin: false,
completedCourses: new Set(), completedCourses: new Set(),
enrolledPrograms: new Set(), enrolledPrograms: new Set(),
enrolledCourses: {}, 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()
},
} }
frappe.ready(() => { frappe.ready(() => {
window.v = new Vue({ frappe.provide('academy')
el: "#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 }), router: new VueRouter({ routes }),
template: "<academy-root/>", template: "<academy-root/>",
components: { AcademyRoot }, components: { AcademyRoot },
created: function() { created: function() {
if(store.checkLogin()){ if(academy.store.checkLogin()){
store.updateState() 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
}) })

View File

@@ -1,13 +1,15 @@
frappe.provide('academy'); frappe.ready(() => {
frappe.provide('academy');
academy.call = (method, args) => { academy.call = (method, args) => {
const method_path = 'erpnext.www.academy.' + method; const method_path = 'erpnext.www.academy.' + method;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
return frappe.call({ return frappe.call({
method: method_path, method: method_path,
args, args,
}) })
.then(r => resolve(r.message)) .then(r => resolve(r.message))
.fail(reject) .fail(reject)
}); });
} }
});

View File

@@ -10,65 +10,61 @@
</div> </div>
<div class='card-footer text-right'> <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 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> <a v-else class='btn btn-secondary btn-sm' href="/login#signup">Sign Up</a>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import AButton from './Button.vue';
export default { export default {
props: ['program_code'], props: ['program', 'enrolled'],
name: "AcademyProgramCard", name: "AcademyProgramCard",
data() { data() {
return { return {
program: '' isLogin: academy.store.isLogin
}; };
}, },
mounted() { created() {
frappe.call({
method: "erpnext.www.academy.get_program_details",
args: {
program_name: this.program_code
}
}).then(r => {
this.program = r.message
})
}, },
methods: { 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() { enroll() {
frappe.call({ academy.call('enroll_in_program', {
method: "erpnext.www.academy.enroll_in_program", program_name: this.program.name,
args:{ }).then(
program_name: this.program_code, academy.store.enrolledPrograms.add(this.program.name),
student_email_id: frappe.session.user academy.store.updateEnrolledPrograms(),
} this.router.push('Program/' + this.program.name)
}) )
this.$root.$data.enrolledPrograms.add(this.program_code)
this.$root.$data.updateEnrolledPrograms()
} }
}, },
computed: { computed: {
buttonName() { buttonName() {
if(this.$root.$data.isLogin){ if(this.enrolled){
if(this.$root.$data.checkProgramEnrollment(this.program_code)){
return "Start Course" return "Start Course"
} }
else { else {
return "Enroll" return "Enroll"
} }
} },
programPageRoute() {
return `Program/${this.program.name}`
},
isEnrolled() {
return academy.store.enrolledPrograms.has(this.program.name)
} }
},
components: {
AButton
} }
}; };
</script> </script>

View File

@@ -1,10 +1,10 @@
<template> <template>
<div> <div>
<AcademyTopSection :title="title" :description="description"> <AcademyTopSection :title="portal.title" :description="portal.description">
<AcademyTopSectionButton/> <AcademyTopSectionButton/>
</AcademyTopSection> </AcademyTopSection>
<AcademyList :title="'Featured Programs'" :description="'Master ERPNext'"> <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> </AcademyList>
</div> </div>
</template> </template>
@@ -18,9 +18,9 @@ export default {
name: "AcademyHome", name: "AcademyHome",
data() { data() {
return{ return{
title: '', portal: {},
description: '', featuredPrograms: [],
featured_programs: [] // enrolledPrograms: new Set()
} }
}, },
components: { components: {
@@ -28,15 +28,28 @@ export default {
AcademyList, AcademyList,
AcademyProgramCard, AcademyProgramCard,
AcademyTopSectionButton 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> </script>

View File

@@ -1,6 +1,6 @@
import AcademyHome from "./academy/pages/AcademyHome.vue"; import AcademyHome from "./pages/AcademyHome.vue";
import AcademyProgramPage from "./academy/pages/AcademyProgramPage.vue"; import AcademyProgramPage from "./pages/AcademyProgramPage.vue";
import AcademyCoursePage from "./academy/pages/AcademyCoursePage.vue"; import AcademyCoursePage from "./pages/AcademyCoursePage.vue";
const routes = [ const routes = [
{name: 'home', path: '', component: AcademyHome}, {name: 'home', path: '', component: AcademyHome},

View File

@@ -3,6 +3,6 @@
{% block title %}{{ heading or "Academy"}}{% endblock %} {% block title %}{{ heading or "Academy"}}{% endblock %}
{% block page_content %} {% block page_content %}
<div id="academy"></div> <div id="academy-app"></div>
<script type="text/javascript" src="/assets/js/academy.min.js"></script> <script type="text/javascript" src="/assets/js/academy.min.js"></script>
{% endblock %} {% endblock %}