Select Git revision
CoursewareUnitItems.vue
Forked from
Stud.IP / Stud.IP
Source project has a limited visibility.
-
Closes #2952 Merge request studip/studip!2049
Closes #2952 Merge request studip/studip!2049
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
courseware-index-app.js 6.08 KiB
import CoursewareModule from './store/courseware/courseware.module';
import CoursewareStructureModule from './store/courseware/structure.module';
import FileChooserStore from './store/file-chooser.js';
import CoursewareStructuralElement from './components/courseware/structural-element/CoursewareStructuralElement.vue';
import IndexApp from './components/courseware/IndexApp.vue';
import PluginManager from './components/courseware/plugin-manager.js';
import Vue from 'vue';
import VueRouter from 'vue-router';
import Vuex from 'vuex';
import axios from 'axios';
import { mapResourceModules } from '@elan-ev/reststate-vuex';
import { StockImagesPlugin } from './plugins/stock-images.js';
const mountApp = async (STUDIP, createApp, element) => {
const getHttpClient = () =>
axios.create({
baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true),
headers: {
'Content-Type': 'application/vnd.api+json',
},
});
// get id of parent structural element
let elem_id = null;
let entry_id = null;
let entry_type = null;
let unit_id = null;
let licenses = null;
let elem;
if ((elem = document.getElementById(element.substring(1))) !== undefined) {
if (elem.attributes !== undefined) {
if (elem.attributes['entry-element-id'] !== undefined) {
elem_id = elem.attributes['entry-element-id'].value;
}
if (elem.attributes['entry-type'] !== undefined) {
entry_type = elem.attributes['entry-type'].value;
}
if (elem.attributes['entry-id'] !== undefined) {
entry_id = elem.attributes['entry-id'].value;
}
if (elem.attributes['unit-id'] !== undefined) {
unit_id = elem.attributes['unit-id'].value;
}
// we need a route for License SORM
if (elem.attributes['licenses'] !== undefined) {
licenses = JSON.parse(elem.attributes['licenses'].value);
}
}
}
const routes = [
{
path: '/',
redirect: '/structural_element/' + elem_id,
},
{
path: '/structural_element/:id',
name: 'CoursewareStructuralElement',
component: CoursewareStructuralElement,
},
];
let base = new URL(
STUDIP.URLHelper.parameters.cid
? STUDIP.URLHelper.getURL('dispatch.php/course/courseware/courseware/' + unit_id, { cid: STUDIP.URLHelper.parameters.cid }, true)
: STUDIP.URLHelper.getURL('dispatch.php/contents/courseware/courseware/' + unit_id)
);
if (entry_type === 'courses') {
base.search += '&';
}
const router = new VueRouter({
base: `${base.pathname}${base.search}`,
routes,
});
const httpClient = getHttpClient();
const store = new Vuex.Store({
modules: {
courseware: CoursewareModule,
'courseware-structure': CoursewareStructureModule,
'file-chooser': FileChooserStore,
...mapResourceModules({
names: [
'courses',
'course-memberships',
'courseware-blocks',
'courseware-block-comments',
'courseware-block-feedback',
'courseware-clipboards',
'courseware-containers',
'courseware-instances',
'courseware-public-links',
'courseware-structural-elements',
'courseware-structural-element-comments',
'courseware-structural-element-feedback',
'courseware-task-feedback',
'courseware-task-groups',
'courseware-tasks',
'courseware-templates',
'courseware-user-data-fields',
'courseware-user-progresses',
'courseware-units',
'files',
'file-refs',
'folders',
'lti-tools',
'status-groups',
'users',
'institutes',
'institute-memberships',
'semesters',
'sem-classes',
'sem-types',
'terms-of-use',
'user-data-field',
'studip-properties'
],
httpClient,
}),
},
});
axios.get(
STUDIP.URLHelper.getURL('jsonapi.php/v1/studip/properties', {}, true)
).then(response => {
response.data.data.forEach(prop => {
store.dispatch('studip-properties/storeRecord', prop);
});
});
store.dispatch('setUrlHelper', STUDIP.URLHelper);
store.dispatch('setUserId', STUDIP.USER_ID);
await store.dispatch('users/loadById', {id: STUDIP.USER_ID});
store.dispatch('setHttpClient', httpClient);
store.dispatch('coursewareContext', {
id: entry_id,
type: entry_type,
unit: unit_id
});
if (entry_type === 'courses') {
await store.dispatch('loadTeacherStatus', STUDIP.USER_ID);
store.dispatch('loadProgresses');
}
store.dispatch('coursewareCurrentElement', elem_id);
store.dispatch('licenses', licenses);
store.dispatch('courseware-templates/loadAll');
store.dispatch('loadUserClipboards', STUDIP.USER_ID);
const pluginManager = new PluginManager();
store.dispatch('setPluginManager', pluginManager);
STUDIP.eventBus.emit('courseware:init-plugin-manager', pluginManager);
STUDIP.JSUpdater.register(
'coursewareclipboard',
() => { store.dispatch('loadUserClipboards', STUDIP.USER_ID)},
() => { return { 'counter' : store.getters['courseware-clipboards/all'].length };},
5000
);
const app = createApp({
render: (h) => h(IndexApp),
router,
store,
});
Vue.use(StockImagesPlugin, { store });
app.$mount(element);
return app;
};
export default mountApp;