// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Javascript to initialise the starred courses block.
*
* @module block_starredcourses/main
* @copyright 2018 Simey Lameze <simey@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(
[
'jquery',
'core/notification',
'block_starredcourses/repository',
'core/pubsub',
'core/templates',
'core_course/events'
],
function(
$,
Notification,
Repository,
PubSub,
Templates,
CourseEvents
) {
var SELECTORS = {
BLOCK_CONTAINER: '[data-region="starred-courses"]',
STARRED_COURSES_REGION_VIEW: '[data-region="starred-courses-view"]',
STARRED_COURSES_REGION: '[data-region="starred-courses-view-content"]'
};
/**
* Render the starred courses.
*
* @method renderCourses
* @param {object} root The root element for the starred view.
* @param {array} courses containing array of returned courses.
* @returns {promise} Resolved with HTML and JS strings
*/
var renderCourses = function(root, courses) {
if (courses.length > 0) {
return Templates.render('core_course/view-cards', {
courses: courses
});
} else {
var nocoursesimg = root.find(SELECTORS.STARRED_COURSES_REGION_VIEW).attr('data-nocoursesimg');
return Templates.render('block_starredcourses/no-courses', {
nocoursesimg: nocoursesimg
});
}
};
/**
* Fetch user's starred courses and reload the content of the block.
*
* @param {object} root The root element for the starred view.
* @returns {promise} The updated content for the block.
*/
var reloadContent = function(root) {
var content = root.find(SELECTORS.STARRED_COURSES_REGION);
var args = {
limit: 0,
offset: 0,
};
return Repository.getStarredCourses(args)
.then(function(courses) {
// Whether the course category should be displayed in the course item.
var showcoursecategory = $(SELECTORS.BLOCK_CONTAINER).data('displaycoursecategory');
courses = courses.map(function(course) {
course.showcoursecategory = showcoursecategory;
return course;
});
return renderCourses(root, courses);
}).then(function(html, js) {
return Templates.replaceNodeContents(content, html, js);
}).catch(Notification.exception);
};
/**
* Register event listeners for the block.
*
* @param {object} root The calendar root element
*/
var registerEventListeners = function(root) {
PubSub.subscribe(CourseEvents.favourited, function() {
reloadContent(root);
});
PubSub.subscribe(CourseEvents.unfavorited, function() {
reloadContent(root);
});
};
/**
* Initialise all of the modules for the starred courses block.
*
* @param {object} root The root element for the block.
*/
var init = function(root) {
root = $(root);
registerEventListeners(root);
reloadContent(root);
};
return {
init: init
};
});