mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-03 20:29:09 +00:00
Added academy namespace
This commit is contained in:
@@ -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
|
||||||
})
|
})
|
||||||
@@ -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)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
});
|
||||||
@@ -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> -->
|
<!-- <a class='video-btn btn btn-secondary btn-sm' data-toggle="modal" data-src=" insert jinja stuff here " data-target="#myModal">Watch Intro</a> -->
|
||||||
<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>
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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},
|
||||||
|
|||||||
@@ -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 %}
|
||||||
Reference in New Issue
Block a user