This repository has been archived on 2025-01-01. You can view files and clone it, but cannot push or open issues or pull requests.
moodle-local_treestudyplan/amd/src/page-view-plan.js
2024-07-19 17:48:21 +02:00

278 lines
11 KiB
JavaScript

/* eslint no-unused-vars: "off" */
/* eslint no-trailing-spaces: "off" */
/* eslint promise/no-nesting: "off" */
/* eslint max-depth: ["error", 5] */
// Put this file in path/to/plugin/amd/src
// You can call it anything you like
import {call} from 'core/ajax';
import notification from 'core/notification';
import Vue from './vue/vue';
import Debugger from './util/debugger';
import {loadStrings} from './util/string-helper';
import {processStudyplan} from './studyplan-processor';
import {studyplanTiming} from './util/date-helper';
import {addBrowserButtonEvent} from './util/browserbuttonevents';
import RVComponents from './report-viewer-components';
Vue.use(RVComponents);
import ModalComponents from './modedit-modal';
Vue.use(ModalComponents);
import PortalVue from './portal-vue/portal-vue.esm';
Vue.use(PortalVue);
import BootstrapVue from './bootstrap-vue/bootstrap-vue';
Vue.use(BootstrapVue);
let debug = new Debugger("treestudyplanviewer");
let strings = loadStrings({
studyplan: {
studyplanSelectPlaceholder: 'studyplan_select_placeholder',
},
});
/**
* Initialize the Page
* @param {number} contextid The context we should attempt to work in (1:1 related to the category)
* @param {number} categoryid The category we shoud attempt to work in (1:1 related to the context)
*/
export function init(contextid, categoryid) {
// Make sure the id's are numeric and integer
if (undefined === contextid || !Number.isInteger(Number(contextid)) || contextid < 1) {
contextid = 1;
} else { // Ensure a numeric value instead of string
contextid = Number(contextid);
}
if (undefined === categoryid || !Number.isInteger(Number(categoryid))) {
categoryid = 0;
} else { // Ensure a numeric value instead of string
categoryid = Number(categoryid);
}
let app = new Vue({
el: '#root',
data: {
selected: {
planid: 0,
studentid: 0,
},
displayedstudyplan: null,
activestudyplan: null,
associatedstudents: [],
selectedstudent: null,
studentstudyplan: null,
loadingstudyplan: false,
studyplans: [],
text: strings.studyplan,
toolbox: {
right: true,
},
usedcontexts: [],
},
async mounted() {
call([{
methodname: 'local_treestudyplan_list_studyplans',
args: {'context_id': contextid}
}])[0].then((response) => {
const timingval = {present: 0, past: 1, future: 2};
response.sort((a, b) => {
const timinga = studyplanTiming(a);
const timingb = studyplanTiming(b);
const t = timingval[timinga] - timingval[timingb];
if (t == 0) {
// Sort by name if timing is equal
return a.name.localeCompare(b.name);
} else {
return t;
}
});
app.studyplans = response;
// Load studyplan from hash if applicable
const hash = window.location.hash.replace('#', '');
const parts = hash.split("-");
if (!!parts && parts.length > 0 && parts[0] != '') {
for (let idx in app.studyplans) {
if (app.studyplans[idx].id == parts[0]) {
app.selectStudyplan(app.studyplans[idx], parts[1]);
break;
}
}
}
return;
}).catch(notification.exception);
call([{
methodname: 'local_treestudyplan_list_available_categories',
args: {operation: 'view', 'refcontext_id': contextid}
}])[0].then((response) => {
const contexts = [];
for (const ix in response) {
const cat = response[ix];
if (cat.studyplancount > 0 || cat.context_id == contextid) {
contexts.push(cat);
}
}
app.usedcontexts = contexts;
return;
}).catch(notification.exception);
addBrowserButtonEvent(this.navChanged, this.navChanged);
},
computed: {
dropdownTitle() {
if (this.activestudyplan && this.activestudyplan.name) {
return this.activestudyplan.name;
} else {
return this.text.studyplanSelectPlaceholder;
}
},
contextid() {
return contextid;
}
},
methods: {
navChanged() {
const hash = window.location.hash.replace('#', '');
const parts = hash.split("-");
debug.log("Navigation changed", hash, parts);
if (!!parts && parts.length > 0) {
const planid = Number(parts[0]);
const studentid = (parts.length > 1) ? Number(parts[1]) : 0;
debug.log("Selected ids", planid, studentid, this.selected.planid, this.selected.studentid);
if (planid == 0) {
if (planid != this.selected.planid) {
this.closeStudyplan(false);
}
} else if (this.selected.planid != planid || (studentid == 0 && this.selected.studentid != 0)) {
debug.info("Requested plan changed - loading studyplan");
for (let idx in app.studyplans) {
const plan = this.studyplans[idx];
if (Number(plan.id) == planid) {
this.selectStudyplan(plan, studentid, false);
break;
}
}
} else if (this.selected.studentid != studentid) {
for (const group of app.associatedstudents) {
for (const student of group.users) {
if (Number(student.id) == studentid) {
app.showStudentView(student, false);
break;
}
}
}
}
}
},
switchContext(ctxid) {
const params = new URLSearchParams(location.search);
params.delete('categoryid');
params.set('contextid', ctxid);
setTimeout(() => {
// Reload page in a timeout to give other form javasccript the change to remove the beforeunload handler.
window.location.href = window.location.pathname + "?" + params.toString();
}, 50);
},
closeStudyplan(updatehash = true) {
app.selected.planid = 0;
app.selected.studentid = 0;
app.activestudyplan = null;
app.associatedstudents = [];
app.studentstudyplan = [];
app.displayedstudyplan = null;
if (updatehash) {
window.location.hash = '';
}
},
selectStudyplan(studyplan, studentid, updatehash = true) {
app.selected.planid = Number(studyplan.id);
app.selected.studentid = studentid ? Number(studentid) : 0;
// Fetch studyplan
app.loadingstudyplan = true;
app.associatedstudents = [];
app.selectedstudent = null;
app.studentstudyplan = null;
call([{
methodname: 'local_treestudyplan_get_studyplan_map',
args: {id: studyplan.id}
}])[0].then((response) => {
app.activestudyplan = processStudyplan(response, true);
call([{
methodname: 'local_treestudyplan_all_associated_grouped',
args: {'studyplan_id': studyplan.id}
}])[0].then((response) => {
app.associatedstudents = response;
let foundstudent = false;
if (studentid) {
for (const group of app.associatedstudents) {
for (const student of group.users) {
if (student.id == studentid) {
foundstudent = true;
app.showStudentView(student, updatehash);
break;
}
}
}
}
if (!foundstudent) {
app.selected.studentid = 0;
if (updatehash) {
window.location.hash = app.activestudyplan.id;
}
app.displayedstudyplan = app.activestudyplan;
app.loadingstudyplan = false;
}
return;
}).catch(notification.exception);
return;
}).catch(function(error) {
notification.exception(error);
app.loadingstudyplan = false;
});
},
showStudentView(student, updatehash = true) {
app.selected.studentid = student ? Number(student.id) : 0;
if (student) {
app.selectedstudent = student;
app.studentstudyplan = null;
app.loadingstudyplan = true;
call([{
methodname: 'local_treestudyplan_get_user_studyplan',
args: {userid: student.id, studyplanid: app.selected.planid}
}])[0].then((response) => {
app.studentstudyplan = processStudyplan(response, false);
app.displayedstudyplan = app.studentstudyplan;
app.loadingstudyplan = false;
if (updatehash) {
window.location.hash = app.activestudyplan.id + "-" + student.id;
}
return;
}).catch((error) => {
notification.exception(error);
app.loadingstudyplan = false;
});
} else {
this.showOverview(updatehash);
}
},
showOverview(updatehash = true) {
app.selected.studentid = 0;
app.selectedstudent = null;
app.studentstudyplan = null;
app.displayedstudyplan = app.activestudyplan;
if (updatehash) {
window.location.hash = app.activestudyplan.id;
}
}
},
});
}